From: Simon Wilkinson Date: Wed, 18 Nov 2009 20:07:04 +0000 (+0000) Subject: Remove inode hinting for dcaches X-Git-Tag: openafs-devel-1_5_67~27 X-Git-Url: https://git.openafs.org/?p=openafs.git;a=commitdiff_plain;h=6f803428fdb1d85021cde1606498178d557a9db1 Remove inode hinting for dcaches The VNOP read code has always contained incomplete support for inode hinting. In theory this would let us attach open cache files to dcache structures, so that we don't have the overhead of opening the file with every read that we do. However, this has been ifdef'd off ever since the first release, and is fundamentally broken - it relied upon structure elements that just don't exist, and has no mechanism for throttling the number of inode hints that are maintained. Inode hinting also required that we store an inode number within the osi_file structure (so hint validity could be checked), which causes a problem on some modern OS's. Simplify all of this, by just removing the partial hinting support. If we want to revisit this in the future, then the code is in git, but if we _do_ feel we want to keep open cache files around, it's probably better to start from scratch! Change-Id: Ia378922f7fcc24fb27b343015dbd16818302ec10 Reviewed-on: http://gerrit.openafs.org/850 Reviewed-by: Derrick Brashear Tested-by: Derrick Brashear --- diff --git a/src/afs/AIX/osi_file.c b/src/afs/AIX/osi_file.c index ac0dcac..410843b 100644 --- a/src/afs/AIX/osi_file.c +++ b/src/afs/AIX/osi_file.c @@ -56,7 +56,6 @@ osi_UFSOpen(afs_dcache_id_t *ainode) afile->size = VTOI(afile->vnode)->i_size; afile->offset = 0; afile->proc = (int (*)())0; - afile->inum = ainode->ufs; /* for hint validity checking */ return (void *)afile; } diff --git a/src/afs/DARWIN/osi_file.c b/src/afs/DARWIN/osi_file.c index 13067a7..3edd496 100644 --- a/src/afs/DARWIN/osi_file.c +++ b/src/afs/DARWIN/osi_file.c @@ -198,7 +198,6 @@ osi_UFSOpen(afs_dcache_id_t *ainode) afile->vnode = vp; afile->offset = 0; afile->proc = (int (*)())0; - afile->inum = ainode->ufs; /* for hint validity checking */ #ifndef AFS_CACHE_VNODE_PATH afile->size = va.va_size; #else diff --git a/src/afs/FBSD/osi_file.c b/src/afs/FBSD/osi_file.c index 8dc9411..fdac540 100644 --- a/src/afs/FBSD/osi_file.c +++ b/src/afs/FBSD/osi_file.c @@ -59,7 +59,6 @@ osi_UFSOpen(afs_dcache_id_t *ainode) afile->size = VTOI(vp)->i_size; afile->offset = 0; afile->proc = NULL; - afile->inum = ainode->ufs; /* for hint validity checking */ return (void *)afile; } diff --git a/src/afs/HPUX/osi_file.c b/src/afs/HPUX/osi_file.c index 14bd768..1d2ae5c 100644 --- a/src/afs/HPUX/osi_file.c +++ b/src/afs/HPUX/osi_file.c @@ -57,7 +57,6 @@ osi_UFSOpen(afs_dcache_id_t *ainode) afile->size = VTOI(afile->vnode)->i_size; afile->offset = 0; afile->proc = (int (*)())0; - afile->inum = ainode->ufs; /* for hint validity checking */ return (void *)afile; } diff --git a/src/afs/IRIX/osi_file.c b/src/afs/IRIX/osi_file.c index 21e4b96..10ca92d 100644 --- a/src/afs/IRIX/osi_file.c +++ b/src/afs/IRIX/osi_file.c @@ -62,7 +62,6 @@ osi_UFSOpen(afs_dcache_id_t *ainode) afile->size = VnodeToSize(afile->vnode); afile->offset = 0; afile->proc = (int (*)())0; - afile->inum = ainode->ufs; /* for hint validity checking */ return (void *)afile; } diff --git a/src/afs/LINUX/osi_file.c b/src/afs/LINUX/osi_file.c index a1eebe3..7af6b6d 100644 --- a/src/afs/LINUX/osi_file.c +++ b/src/afs/LINUX/osi_file.c @@ -32,7 +32,7 @@ extern struct cred *cache_creds; #endif struct file * -afs_linux_raw_open(afs_dcache_id_t *ainode, ino_t *hint) +afs_linux_raw_open(afs_dcache_id_t *ainode) { struct inode *tip = NULL; struct dentry *dp = NULL; @@ -65,8 +65,6 @@ afs_linux_raw_open(afs_dcache_id_t *ainode, ino_t *hint) #else osi_Panic("Can't open inode %d\n", (int) ainode->ufs); #endif - if (hint) - *hint = tip->i_ino; return filp; } @@ -94,7 +92,7 @@ osi_UFSOpen(afs_dcache_id_t *ainode) } memset(afile, 0, sizeof(struct osi_file)); - afile->filp = afs_linux_raw_open(ainode, &afile->inum); + afile->filp = afs_linux_raw_open(ainode); afile->size = i_size_read(FILE_INODE(afile->filp)); AFS_GLOCK(); afile->offset = 0; diff --git a/src/afs/LINUX24/osi_file.c b/src/afs/LINUX24/osi_file.c index 56959ea..ba58d05 100644 --- a/src/afs/LINUX24/osi_file.c +++ b/src/afs/LINUX24/osi_file.c @@ -36,7 +36,7 @@ extern struct super_block *afs_cacheSBp; #if defined(AFS_LINUX26_ENV) struct file * -afs_linux_raw_open(afs_dcache_id_t *ainode, ino_t *hint) +afs_linux_raw_open(afs_dcache_id_t *ainode) { struct inode *tip = NULL; struct dentry *dp = NULL; @@ -68,8 +68,6 @@ afs_linux_raw_open(afs_dcache_id_t *ainode, ino_t *hint) #else osi_Panic("Can't open inode %d\n", (int) ainode->ufs); #endif - if (hint) - *hint = tip->i_ino; return filp; } @@ -97,7 +95,7 @@ osi_UFSOpen(afs_dcache_id_t *ainode) } memset(afile, 0, sizeof(struct osi_file)); - afile->filp = afs_linux_raw_open(ainode, &afile->inum); + afile->filp = afs_linux_raw_open(ainode); afile->size = i_size_read(FILE_INODE(afile->filp)); AFS_GLOCK(); afile->offset = 0; @@ -152,7 +150,6 @@ osi_UFSOpen(afs_dcache_id_t *ainode) AFS_GLOCK(); afile->offset = 0; afile->proc = (int (*)())0; - afile->inum = ainode->ufs; /* for hint validity checking */ return (void *)afile; } #endif diff --git a/src/afs/NBSD/osi_file.c b/src/afs/NBSD/osi_file.c index 312b9fd..cf85911 100644 --- a/src/afs/NBSD/osi_file.c +++ b/src/afs/NBSD/osi_file.c @@ -49,7 +49,6 @@ osi_UFSOpen(afs_dcache_id_t *ainode) afile->size = VTOI(afile->vnode)->i_size; afile->offset = 0; afile->proc = (int (*)())0; - afile->inum = ainode->ufs; /* for hint validity checking */ return (void *)afile; } diff --git a/src/afs/OBSD/osi_file.c b/src/afs/OBSD/osi_file.c index 3cc2d1f..a82cd02 100644 --- a/src/afs/OBSD/osi_file.c +++ b/src/afs/OBSD/osi_file.c @@ -53,7 +53,6 @@ osi_UFSOpen(afs_dcache_id_t *ainode) #endif afile->offset = 0; afile->proc = NULL; - afile->inum = ainode->ufs; /* for hint validity checking */ return (void *)afile; } diff --git a/src/afs/SOLARIS/osi_file.c b/src/afs/SOLARIS/osi_file.c index 858d52a..5b18303 100644 --- a/src/afs/SOLARIS/osi_file.c +++ b/src/afs/SOLARIS/osi_file.c @@ -160,7 +160,6 @@ osi_VxfsOpen(afs_dcache_id_t *ainode) afile->size = VnodeToSize(afile->vnode); afile->offset = 0; afile->proc = (int (*)())0; - afile->inum = ainode->ufs; /* for hint validity checking */ return (void *)afile; } #endif /* AFS_HAVE_VXFS */ @@ -249,7 +248,6 @@ osi_UfsOpen(afs_dcache_id_t *ainode) #endif afile->offset = 0; afile->proc = (int (*)())0; - afile->inum = ainode->ufs; /* for hint validity checking */ return (void *)afile; } diff --git a/src/afs/UKERNEL/afs_usrops.c b/src/afs/UKERNEL/afs_usrops.c index 663d481..353d0e7 100644 --- a/src/afs/UKERNEL/afs_usrops.c +++ b/src/afs/UKERNEL/afs_usrops.c @@ -731,7 +731,6 @@ osi_UFSOpen(afs_dcache_id_t *ino) } fp->size = st.st_size; fp->offset = 0; - fp->inum = ino->ufs; fp->vnode = (struct usr_vnode *)fp; AFS_GLOCK(); diff --git a/src/afs/VNOPS/afs_vnop_read.c b/src/afs/VNOPS/afs_vnop_read.c index 3f6f0b5..6ca652b 100644 --- a/src/afs/VNOPS/afs_vnop_read.c +++ b/src/afs/VNOPS/afs_vnop_read.c @@ -30,11 +30,6 @@ extern char afs_zeros[AFS_ZEROS]; -afs_int32 maxIHint; -afs_int32 nihints; /* # of above actually in-use */ -afs_int32 usedihint; - - /* Imported variables */ extern afs_rwlock_t afs_xdcache; extern unsigned char *afs_indexFlags; @@ -790,20 +785,6 @@ afs_UFSRead(register struct vcache *avc, struct uio *auio, } } else { /* get the data from the file */ -#ifdef IHINT - if (tfile = tdc->ihint) { - if (tdc->f.inode != tfile->inum) { - afs_warn("afs_UFSRead: %x hint mismatch tdc %d inum %d\n", - tdc, tdc->f.inode, tfile->inum); - osi_UFSClose(tfile); - tdc->ihint = tfile = 0; - nihints--; - } - } - if (tfile != 0) { - usedihint++; - } else -#endif /* IHINT */ tfile = (struct osi_file *)osi_UFSOpen(&tdc->f.inode); #ifdef AFS_DARWIN80_ENV trimlen = len; @@ -916,14 +897,7 @@ afs_UFSRead(register struct vcache *avc, struct uio *auio, #else code = VOP_RDWR(tfile->vnode, &tuio, UIO_READ, 0, afs_osi_credp); #endif - -#ifdef IHINT - if (!tdc->ihint && nihints < maxIHint) { - tdc->ihint = tfile; - nihints++; - } else -#endif /* IHINT */ - osi_UFSClose(tfile); + osi_UFSClose(tfile); if (code) { error = code; diff --git a/src/afs/afs_init.c b/src/afs/afs_init.c index 69bf178..8eba2e6 100644 --- a/src/afs/afs_init.c +++ b/src/afs/afs_init.c @@ -127,9 +127,6 @@ afs_CacheInit(afs_int32 astatSize, afs_int32 afiles, afs_int32 ablocks, return 0; afs_cacheinit_flag = 1; cacheInfoModTime = 0; - maxIHint = ninodes; - nihints = 0; - usedihint = 0; LOCK_INIT(&afs_ftf, "afs_ftf"); AFS_RWLOCK_INIT(&afs_xaxs, "afs_xaxs"); @@ -694,7 +691,7 @@ shutdown_cache(void) afs_cacheStats = 0; afs_cacheFiles = afs_cacheBlocks = 0; - pag_epoch = maxIHint = nihints = usedihint = 0; + pag_epoch = 0; pagCounter = 0; #if defined(AFS_XBSD_ENV) vrele(volumeVnode); /* let it go, finally. */ diff --git a/src/afs/afs_osi.h b/src/afs/afs_osi.h index 66c2e05..805b2b1 100644 --- a/src/afs/afs_osi.h +++ b/src/afs/afs_osi.h @@ -68,7 +68,6 @@ struct osi_file { #endif int (*proc) (struct osi_file * afile, afs_int32 code); /* proc, which, if not null, is called on writes */ char *rock; /* rock passed to proc */ - ino_t inum; /* guarantee validity of hint */ #if defined(UKERNEL) int fd; /* file descriptor for user space files */ #endif /* defined(UKERNEL) */ diff --git a/src/afs/afs_prototypes.h b/src/afs/afs_prototypes.h index fde30dc..327e2e9 100644 --- a/src/afs/afs_prototypes.h +++ b/src/afs/afs_prototypes.h @@ -1170,9 +1170,6 @@ extern int afs_open(struct vcache **avcp, afs_int32 aflags, /* VNOPS/afs_vnop_read.c */ -extern afs_int32 maxIHint; -extern afs_int32 nihints; -extern afs_int32 usedihint; extern int afs_MemRead(register struct vcache *avc, struct uio *auio, afs_ucred_t *acred, daddr_t albn, struct buf **abpp, int noLock);