]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
Windows; release BIOD after status merge
authorJeffrey Altman <jaltman@your-file-system.com>
Sun, 22 Jan 2012 23:33:43 +0000 (18:33 -0500)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Sun, 26 Feb 2012 15:06:03 +0000 (07:06 -0800)
Releasing the BIOD permits the accumulated buffers to be accessed.
Releasing the BIOD before the cm_MergeStatus() call creates a
window where the buffer data version is larger than the cm_scache
data version.  Release the BIOD after the status merge.

Reviewed-on: http://gerrit.openafs.org/6598
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Jeffrey Altman <jaltman@secure-endpoints.com>
Tested-by: Jeffrey Altman <jaltman@secure-endpoints.com>
(cherry picked from commit 111de76ea8dac713247c99ebe2182ae16cc0a3c0)

Change-Id: I7c8dd9f3e22e83b82679b9d3a4ee3aa5f45a49aa
Reviewed-on: http://gerrit.openafs.org/6824
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Jeffrey Altman <jaltman@secure-endpoints.com>
Tested-by: Jeffrey Altman <jaltman@secure-endpoints.com>
src/WINNT/afsd/cm_dcache.c

index 855c68d010413e93fd7cdccd0c5cb3b70f88148d..78212d0505fc3f711048a3235b339d112d1e1d49 100644 (file)
@@ -347,8 +347,6 @@ long cm_BufWrite(void *vscp, osi_hyper_t *offsetp, long length, long flags,
     /* now, clean up our state */
     lock_ObtainWrite(&scp->rw);
 
-    cm_ReleaseBIOD(&biod, 1, code, 1);
-
     if (code == 0) {
         osi_hyper_t t;
         /* now, here's something a little tricky: in AFS 3, a dirty
@@ -388,6 +386,8 @@ long cm_BufWrite(void *vscp, osi_hyper_t *offsetp, long length, long flags,
         else if (code == CM_ERROR_QUOTA)
             _InterlockedOr(&scp->flags, CM_SCACHEFLAG_OVERQUOTA);
     }
+
+    cm_ReleaseBIOD(&biod, 1, code, 1);
     cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_STOREDATA_EXCL);
 
     if (!scp_locked)
@@ -2098,14 +2098,14 @@ long cm_GetBuffer(cm_scache_t *scp, cm_buf_t *bufp, int *cpffp, cm_user_t *userp
         }
     }
 
-    /* release scatter/gather I/O structure (buffers, locks) */
-    cm_ReleaseBIOD(&biod, 0, code, 1);
-
     if (code == 0)
         cm_MergeStatus(NULL, scp, &afsStatus, &volSync, userp, reqp, CM_MERGEFLAG_FETCHDATA);
     else
         InterlockedDecrement(&scp->activeRPCs);
 
+    /* release scatter/gather I/O structure (buffers, locks) */
+    cm_ReleaseBIOD(&biod, 0, code, 1);
+
     return code;
 }