summarylogtreecommitdiffstats
path: root/0010-afs-Introduce-afs_IsDCacheFresh.patch
diff options
context:
space:
mode:
Diffstat (limited to '0010-afs-Introduce-afs_IsDCacheFresh.patch')
-rw-r--r--0010-afs-Introduce-afs_IsDCacheFresh.patch371
1 files changed, 371 insertions, 0 deletions
diff --git a/0010-afs-Introduce-afs_IsDCacheFresh.patch b/0010-afs-Introduce-afs_IsDCacheFresh.patch
new file mode 100644
index 000000000000..eb9a3669eae8
--- /dev/null
+++ b/0010-afs-Introduce-afs_IsDCacheFresh.patch
@@ -0,0 +1,371 @@
+From 2fcade1caea1e81f8b5b54c5c08e363649a4664c Mon Sep 17 00:00:00 2001
+From: Andrew Deason <adeason@sinenomine.net>
+Date: Thu, 17 Jan 2019 15:45:36 -0600
+Subject: [PATCH 10/12] afs: Introduce afs_IsDCacheFresh
+
+Numerous places in libafs check the DV of a dcache against the DV of
+the vcache for the same file, in order to check if the dcache is up to
+date and can be used. Consolidate all of these checks into a new
+function, afs_IsDCacheFresh, to make it easier for future commits to
+alter this logic.
+
+This commit should have no visible impact; it is just code
+reorganization.
+
+Change-Id: Iedc02b0f5d7d0542ab00ff1effdde03c2a851df4
+Reviewed-on: https://gerrit.openafs.org/13435
+Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
+Tested-by: Andrew Deason <adeason@sinenomine.net>
+(cherry picked from commit 0d8ce846ab2e6c45166a61f04eb3af271cbd27db)
+---
+ src/afs/LINUX/osi_export.c | 8 ++++----
+ src/afs/LINUX/osi_vnodeops.c | 8 ++++----
+ src/afs/SOLARIS/osi_vnodeops.c | 6 +++---
+ src/afs/VNOPS/afs_vnop_create.c | 4 ++--
+ src/afs/VNOPS/afs_vnop_lookup.c | 8 ++++----
+ src/afs/VNOPS/afs_vnop_read.c | 4 ++--
+ src/afs/VNOPS/afs_vnop_readdir.c | 4 ++--
+ src/afs/VNOPS/afs_vnop_remove.c | 2 +-
+ src/afs/VNOPS/afs_vnop_rename.c | 2 +-
+ src/afs/afs_dcache.c | 30 ++++++++++++++++++++++++------
+ src/afs/afs_prototypes.h | 1 +
+ 11 files changed, 48 insertions(+), 29 deletions(-)
+
+diff --git a/src/afs/LINUX/osi_export.c b/src/afs/LINUX/osi_export.c
+index a3175b5d5..926bd0df9 100644
+--- a/src/afs/LINUX/osi_export.c
++++ b/src/afs/LINUX/osi_export.c
+@@ -349,7 +349,7 @@ redo:
+ */
+ while ((adp->f.states & CStatd)
+ && (tdc->dflags & DFFetching)
+- && hsame(adp->f.m.DataVersion, tdc->f.versionNo)) {
++ && afs_IsDCacheFresh(tdc, adp)) {
+ ReleaseReadLock(&tdc->lock);
+ ReleaseSharedLock(&adp->lock);
+ afs_osi_Sleep(&tdc->validPos);
+@@ -357,7 +357,7 @@ redo:
+ ObtainReadLock(&tdc->lock);
+ }
+ if (!(adp->f.states & CStatd)
+- || !hsame(adp->f.m.DataVersion, tdc->f.versionNo)) {
++ || !afs_IsDCacheFresh(tdc, adp)) {
+ ReleaseReadLock(&tdc->lock);
+ ReleaseSharedLock(&adp->lock);
+ afs_PutDCache(tdc);
+@@ -770,7 +770,7 @@ redo:
+ */
+ while ((vcp->f.states & CStatd)
+ && (tdc->dflags & DFFetching)
+- && hsame(vcp->f.m.DataVersion, tdc->f.versionNo)) {
++ && afs_IsDCacheFresh(tdc, vcp)) {
+ ReleaseReadLock(&tdc->lock);
+ ReleaseReadLock(&vcp->lock);
+ afs_osi_Sleep(&tdc->validPos);
+@@ -778,7 +778,7 @@ redo:
+ ObtainReadLock(&tdc->lock);
+ }
+ if (!(vcp->f.states & CStatd)
+- || !hsame(vcp->f.m.DataVersion, tdc->f.versionNo)) {
++ || !afs_IsDCacheFresh(tdc, vcp)) {
+ ReleaseReadLock(&tdc->lock);
+ ReleaseReadLock(&vcp->lock);
+ afs_PutDCache(tdc);
+diff --git a/src/afs/LINUX/osi_vnodeops.c b/src/afs/LINUX/osi_vnodeops.c
+index 1631d3d3d..9f164f395 100644
+--- a/src/afs/LINUX/osi_vnodeops.c
++++ b/src/afs/LINUX/osi_vnodeops.c
+@@ -447,7 +447,7 @@ afs_linux_readdir(struct file *fp, void *dirbuf, filldir_t filldir)
+ */
+ while ((avc->f.states & CStatd)
+ && (tdc->dflags & DFFetching)
+- && hsame(avc->f.m.DataVersion, tdc->f.versionNo)) {
++ && afs_IsDCacheFresh(tdc, avc)) {
+ ReleaseReadLock(&tdc->lock);
+ ReleaseWriteLock(&avc->lock);
+ afs_osi_Sleep(&tdc->validPos);
+@@ -455,7 +455,7 @@ afs_linux_readdir(struct file *fp, void *dirbuf, filldir_t filldir)
+ ObtainReadLock(&tdc->lock);
+ }
+ if (!(avc->f.states & CStatd)
+- || !hsame(avc->f.m.DataVersion, tdc->f.versionNo)) {
++ || !afs_IsDCacheFresh(tdc, avc)) {
+ ReleaseReadLock(&tdc->lock);
+ ReleaseWriteLock(&avc->lock);
+ afs_PutDCache(tdc);
+@@ -2386,7 +2386,7 @@ afs_linux_readpage_fastpath(struct file *fp, struct page *pp, int *codep)
+ ObtainReadLock(&tdc->lock);
+
+ /* Is the dcache we've been given currently up to date */
+- if (!hsame(avc->f.m.DataVersion, tdc->f.versionNo) ||
++ if (!afs_IsDCacheFresh(tdc, avc) ||
+ (tdc->dflags & DFFetching))
+ goto out;
+
+@@ -2799,7 +2799,7 @@ afs_linux_readpages(struct file *fp, struct address_space *mapping,
+ AFS_GLOCK();
+ if ((tdc = afs_FindDCache(avc, offset))) {
+ ObtainReadLock(&tdc->lock);
+- if (!hsame(avc->f.m.DataVersion, tdc->f.versionNo) ||
++ if (!afs_IsDCacheFresh(tdc, avc) ||
+ (tdc->dflags & DFFetching)) {
+ ReleaseReadLock(&tdc->lock);
+ afs_PutDCache(tdc);
+diff --git a/src/afs/SOLARIS/osi_vnodeops.c b/src/afs/SOLARIS/osi_vnodeops.c
+index fde268401..76b55b351 100644
+--- a/src/afs/SOLARIS/osi_vnodeops.c
++++ b/src/afs/SOLARIS/osi_vnodeops.c
+@@ -350,7 +350,7 @@ afs_GetOnePage(struct vnode *vp, u_offset_t off, u_int alen, u_int *protp,
+
+ /* Check to see whether the cache entry is still valid */
+ if (!(avc->f.states & CStatd)
+- || !hsame(avc->f.m.DataVersion, tdc->f.versionNo)) {
++ || !afs_IsDCacheFresh(tdc, avc)) {
+ ReleaseReadLock(&tdc->lock);
+ ReleaseReadLock(&avc->lock);
+ afs_PutDCache(tdc);
+@@ -882,12 +882,12 @@ afs_nfsrdwr(struct vcache *avc, struct uio *auio, enum uio_rw arw,
+ AFS_GLOCK();
+ dcp_newpage = afs_FindDCache(avc, pageBase);
+ if (dcp_newpage
+- && hsame(avc->f.m.DataVersion, dcp_newpage->f.versionNo)) {
++ && afs_IsDCacheFresh(dcp_newpage, avc)) {
+ ObtainWriteLock(&avc->lock, 251);
+ ObtainWriteLock(&avc->vlock, 576);
+ ObtainReadLock(&dcp_newpage->lock);
+ if ((avc->activeV == 0)
+- && hsame(avc->f.m.DataVersion, dcp_newpage->f.versionNo)
++ && afs_IsDCacheFresh(dcp_newpage, avc)
+ && !(dcp_newpage->dflags & (DFFetching))) {
+ AFS_GUNLOCK();
+ segmap_pagecreate(segkmap, raddr, rsize, 1);
+diff --git a/src/afs/VNOPS/afs_vnop_create.c b/src/afs/VNOPS/afs_vnop_create.c
+index fe37eed36..70b531a6a 100644
+--- a/src/afs/VNOPS/afs_vnop_create.c
++++ b/src/afs/VNOPS/afs_vnop_create.c
+@@ -149,7 +149,7 @@ afs_create(OSI_VC_DECL(adp), char *aname, struct vattr *attrs,
+ * received a callback while we were waiting for the write lock.
+ */
+ if (!(adp->f.states & CStatd)
+- || (tdc && !hsame(adp->f.m.DataVersion, tdc->f.versionNo))) {
++ || (tdc && !afs_IsDCacheFresh(tdc, adp))) {
+ ReleaseWriteLock(&adp->lock);
+ if (tdc) {
+ ReleaseSharedLock(&tdc->lock);
+@@ -543,7 +543,7 @@ afs_LocalHero(struct vcache *avc, struct dcache *adc,
+ if (adc) {
+ /* does what's in the dcache *now* match what's in the vcache *now*,
+ * and do we have a valid callback? if not, our local copy is not "ok" */
+- ok = (hsame(avc->f.m.DataVersion, adc->f.versionNo) && avc->callback
++ ok = (afs_IsDCacheFresh(adc, avc) && avc->callback
+ && (avc->f.states & CStatd) && avc->cbExpires >= osi_Time());
+ } else {
+ ok = 0;
+diff --git a/src/afs/VNOPS/afs_vnop_lookup.c b/src/afs/VNOPS/afs_vnop_lookup.c
+index b42d6db43..f47a505a7 100644
+--- a/src/afs/VNOPS/afs_vnop_lookup.c
++++ b/src/afs/VNOPS/afs_vnop_lookup.c
+@@ -752,7 +752,7 @@ afs_DoBulkStat(struct vcache *adp, long dirCookie, struct vrequest *areqp)
+ */
+ while ((adp->f.states & CStatd)
+ && (dcp->dflags & DFFetching)
+- && hsame(adp->f.m.DataVersion, dcp->f.versionNo)) {
++ && afs_IsDCacheFresh(dcp, adp)) {
+ afs_Trace4(afs_iclSetp, CM_TRACE_DCACHEWAIT, ICL_TYPE_STRING,
+ __FILE__, ICL_TYPE_INT32, __LINE__, ICL_TYPE_POINTER, dcp,
+ ICL_TYPE_INT32, dcp->dflags);
+@@ -763,7 +763,7 @@ afs_DoBulkStat(struct vcache *adp, long dirCookie, struct vrequest *areqp)
+ ObtainReadLock(&dcp->lock);
+ }
+ if (!(adp->f.states & CStatd)
+- || !hsame(adp->f.m.DataVersion, dcp->f.versionNo)) {
++ || !afs_IsDCacheFresh(dcp, adp)) {
+ ReleaseReadLock(&dcp->lock);
+ ReleaseReadLock(&adp->lock);
+ afs_PutDCache(dcp);
+@@ -1685,7 +1685,7 @@ afs_lookup(OSI_VC_DECL(adp), char *aname, struct vcache **avcp, afs_ucred_t *acr
+ if (!afs_InReadDir(adp)) {
+ while ((adp->f.states & CStatd)
+ && (tdc->dflags & DFFetching)
+- && hsame(adp->f.m.DataVersion, tdc->f.versionNo)) {
++ && afs_IsDCacheFresh(tdc, adp)) {
+ ReleaseReadLock(&tdc->lock);
+ ReleaseReadLock(&adp->lock);
+ afs_osi_Sleep(&tdc->validPos);
+@@ -1693,7 +1693,7 @@ afs_lookup(OSI_VC_DECL(adp), char *aname, struct vcache **avcp, afs_ucred_t *acr
+ ObtainReadLock(&tdc->lock);
+ }
+ if (!(adp->f.states & CStatd)
+- || !hsame(adp->f.m.DataVersion, tdc->f.versionNo)) {
++ || !afs_IsDCacheFresh(tdc, adp)) {
+ ReleaseReadLock(&tdc->lock);
+ ReleaseReadLock(&adp->lock);
+ afs_PutDCache(tdc);
+diff --git a/src/afs/VNOPS/afs_vnop_read.c b/src/afs/VNOPS/afs_vnop_read.c
+index dba411715..e5c664207 100644
+--- a/src/afs/VNOPS/afs_vnop_read.c
++++ b/src/afs/VNOPS/afs_vnop_read.c
+@@ -190,7 +190,7 @@ afs_read(struct vcache *avc, struct uio *auio, afs_ucred_t *acred,
+ * 2 requests never return a null dcache entry, btw.
+ */
+ if (!(tdc->dflags & DFFetching)
+- && !hsame(avc->f.m.DataVersion, tdc->f.versionNo)) {
++ && !afs_IsDCacheFresh(tdc, avc)) {
+ /* have cache entry, it is not coming in now,
+ * and we'll need new data */
+ tagain:
+@@ -270,7 +270,7 @@ afs_read(struct vcache *avc, struct uio *auio, afs_ucred_t *acred,
+ } else {
+ /* no longer fetching, verify data version
+ * (avoid new GetDCache call) */
+- if (hsame(avc->f.m.DataVersion, tdc->f.versionNo)
++ if (afs_IsDCacheFresh(tdc, avc)
+ && ((len = tdc->validPos - filePos) > 0)) {
+ offset = filePos - AFS_CHUNKTOBASE(tdc->f.chunk);
+ } else {
+diff --git a/src/afs/VNOPS/afs_vnop_readdir.c b/src/afs/VNOPS/afs_vnop_readdir.c
+index cdc5af56d..8d41c3ef2 100644
+--- a/src/afs/VNOPS/afs_vnop_readdir.c
++++ b/src/afs/VNOPS/afs_vnop_readdir.c
+@@ -702,7 +702,7 @@ afs_readdir(OSI_VC_DECL(avc), struct uio *auio, afs_ucred_t *acred)
+ */
+ while ((avc->f.states & CStatd)
+ && (tdc->dflags & DFFetching)
+- && hsame(avc->f.m.DataVersion, tdc->f.versionNo)) {
++ && afs_IsDCacheFresh(tdc, avc)) {
+ afs_Trace4(afs_iclSetp, CM_TRACE_DCACHEWAIT, ICL_TYPE_STRING,
+ __FILE__, ICL_TYPE_INT32, __LINE__, ICL_TYPE_POINTER, tdc,
+ ICL_TYPE_INT32, tdc->dflags);
+@@ -713,7 +713,7 @@ afs_readdir(OSI_VC_DECL(avc), struct uio *auio, afs_ucred_t *acred)
+ ObtainReadLock(&tdc->lock);
+ }
+ if (!(avc->f.states & CStatd)
+- || !hsame(avc->f.m.DataVersion, tdc->f.versionNo)) {
++ || !afs_IsDCacheFresh(tdc, avc)) {
+ ReleaseReadLock(&tdc->lock);
+ ReleaseReadLock(&avc->lock);
+ afs_PutDCache(tdc);
+diff --git a/src/afs/VNOPS/afs_vnop_remove.c b/src/afs/VNOPS/afs_vnop_remove.c
+index eca9eed24..06a84b060 100644
+--- a/src/afs/VNOPS/afs_vnop_remove.c
++++ b/src/afs/VNOPS/afs_vnop_remove.c
+@@ -234,7 +234,7 @@ afs_remove(OSI_VC_DECL(adp), char *aname, afs_ucred_t *acred)
+ * received a callback while we were waiting for the write lock.
+ */
+ if (!(adp->f.states & CStatd)
+- || (tdc && !hsame(adp->f.m.DataVersion, tdc->f.versionNo))) {
++ || (tdc && !afs_IsDCacheFresh(tdc, adp))) {
+ ReleaseWriteLock(&adp->lock);
+ if (tdc) {
+ ReleaseSharedLock(&tdc->lock);
+diff --git a/src/afs/VNOPS/afs_vnop_rename.c b/src/afs/VNOPS/afs_vnop_rename.c
+index 59a1d5032..d61c80e29 100644
+--- a/src/afs/VNOPS/afs_vnop_rename.c
++++ b/src/afs/VNOPS/afs_vnop_rename.c
+@@ -133,7 +133,7 @@ afsrename(struct vcache *aodp, char *aname1, struct vcache *andp,
+ */
+ if (tdc1) {
+ if (!(aodp->f.states & CStatd)
+- || !hsame(aodp->f.m.DataVersion, tdc1->f.versionNo)) {
++ || !afs_IsDCacheFresh(tdc1, aodp)) {
+
+ ReleaseWriteLock(&aodp->lock);
+ if (!oneDir) {
+diff --git a/src/afs/afs_dcache.c b/src/afs/afs_dcache.c
+index 6a18f80d5..ac9e52269 100644
+--- a/src/afs/afs_dcache.c
++++ b/src/afs/afs_dcache.c
+@@ -1734,6 +1734,24 @@ afs_AllocDCache(struct vcache *avc, afs_int32 chunk, afs_int32 lock,
+ return tdc;
+ }
+
++/*!
++ * Check if a dcache is "fresh". That is, if the dcache's DV matches the DV of
++ * the vcache for that file.
++ *
++ * \param adc The dcache to check
++ * \param avc The vcache for adc
++ *
++ * \return 1 if the dcache does match avc's DV; 0 otherwise.
++ */
++int
++afs_IsDCacheFresh(struct dcache *adc, struct vcache *avc)
++{
++ if (!hsame(adc->f.versionNo, avc->f.m.DataVersion)) {
++ return 0;
++ }
++ return 1;
++}
++
+ /*
+ * afs_GetDCache
+ *
+@@ -1772,7 +1790,7 @@ void
+ updateV2DC(int lockVc, struct vcache *v, struct dcache *d, int src)
+ {
+ if (!lockVc || 0 == NBObtainWriteLock(&v->lock, src)) {
+- if (hsame(v->f.m.DataVersion, d->f.versionNo) && v->callback)
++ if (afs_IsDCacheFresh(d, v) && v->callback)
+ v->dchint = d;
+ if (lockVc)
+ ReleaseWriteLock(&v->lock);
+@@ -1882,7 +1900,7 @@ afs_GetDCache(struct vcache *avc, afs_size_t abyte,
+ ReleaseReadLock(&afs_xdcache);
+ shortcut = 1;
+
+- if (hsame(tdc->f.versionNo, avc->f.m.DataVersion)
++ if (afs_IsDCacheFresh(tdc, avc)
+ && !(tdc->dflags & DFFetching)) {
+
+ afs_stats_cmperf.dcacheHits++;
+@@ -2119,7 +2137,7 @@ afs_GetDCache(struct vcache *avc, afs_size_t abyte,
+ if (AFS_CHUNKTOBASE(chunk) >= avc->f.m.Length &&
+ #endif
+ #endif /* defined(AFS_AIX32_ENV) || defined(AFS_SGI_ENV) */
+- !hsame(avc->f.m.DataVersion, tdc->f.versionNo))
++ !afs_IsDCacheFresh(tdc, avc))
+ doReallyAdjustSize = 1;
+
+ if (doReallyAdjustSize || overWriteWholeChunk) {
+@@ -2183,7 +2201,7 @@ afs_GetDCache(struct vcache *avc, afs_size_t abyte,
+ * avc->lock(W) if !setLocks || slowPass
+ * tdc->lock(S)
+ */
+- if (!hsame(avc->f.m.DataVersion, tdc->f.versionNo) && !overWriteWholeChunk) {
++ if (!afs_IsDCacheFresh(tdc, avc) && !overWriteWholeChunk) {
+ /*
+ * Version number mismatch.
+ */
+@@ -2253,7 +2271,7 @@ afs_GetDCache(struct vcache *avc, afs_size_t abyte,
+ */
+
+ /* Watch for standard race condition around osi_FlushText */
+- if (hsame(avc->f.m.DataVersion, tdc->f.versionNo)) {
++ if (afs_IsDCacheFresh(tdc, avc)) {
+ updateV2DC(setLocks, avc, tdc, 569); /* set hint */
+ afs_stats_cmperf.dcacheHits++;
+ ConvertWToSLock(&tdc->lock);
+@@ -3592,7 +3610,7 @@ afs_ObtainDCacheForWriting(struct vcache *avc, afs_size_t filePos,
+ tdc = afs_FindDCache(avc, filePos);
+ if (tdc) {
+ ObtainWriteLock(&tdc->lock, 658);
+- if (!hsame(tdc->f.versionNo, avc->f.m.DataVersion)
++ if (!afs_IsDCacheFresh(tdc, avc)
+ || (tdc->dflags & DFFetching)) {
+ ReleaseWriteLock(&tdc->lock);
+ afs_PutDCache(tdc);
+diff --git a/src/afs/afs_prototypes.h b/src/afs/afs_prototypes.h
+index b9fd0782b..c8ed43fa7 100644
+--- a/src/afs/afs_prototypes.h
++++ b/src/afs/afs_prototypes.h
+@@ -288,6 +288,7 @@ extern struct dcache *afs_ObtainDCacheForWriting(struct vcache *avc,
+ int noLock);
+ extern void afs_PopulateDCache(struct vcache *avc, afs_size_t apos,
+ struct vrequest *areq);
++extern int afs_IsDCacheFresh(struct dcache *adc, struct vcache *avc);
+
+ /* afs_disconnected.c */
+
+--
+2.36.1
+