From 6f803428fdb1d85021cde1606498178d557a9db1 Mon Sep 17 00:00:00 2001 From: Simon Wilkinson Date: Wed, 18 Nov 2009 20:07:04 +0000 Subject: [PATCH] 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 --- src/afs/AIX/osi_file.c | 1 - src/afs/DARWIN/osi_file.c | 1 - src/afs/FBSD/osi_file.c | 1 - src/afs/HPUX/osi_file.c | 1 - src/afs/IRIX/osi_file.c | 1 - src/afs/LINUX/osi_file.c | 6 ++---- src/afs/LINUX24/osi_file.c | 7 ++----- src/afs/NBSD/osi_file.c | 1 - src/afs/OBSD/osi_file.c | 1 - src/afs/SOLARIS/osi_file.c | 2 -- src/afs/UKERNEL/afs_usrops.c | 1 - src/afs/VNOPS/afs_vnop_read.c | 28 +--------------------------- src/afs/afs_init.c | 5 +---- src/afs/afs_osi.h | 1 - src/afs/afs_prototypes.h | 3 --- 15 files changed, 6 insertions(+), 54 deletions(-) diff --git a/src/afs/AIX/osi_file.c b/src/afs/AIX/osi_file.c index ac0dcac24..410843b9e 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 13067a748..3edd4967f 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 8dc94113f..fdac540c4 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 14bd7684d..1d2ae5c3a 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 21e4b96cb..10ca92d6e 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 a1eebe398..7af6b6d71 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 56959ea3a..ba58d051b 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 312b9fd50..cf85911fb 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 3cc2d1f90..a82cd02b8 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 858d52a2b..5b18303aa 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 663d481c1..353d0e70b 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 3f6f0b5fe..6ca652b60 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 69bf17826..8eba2e6e7 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 66c2e058e..805b2b144 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 fde30dcbe..327e2e906 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); -- 2.39.5