]> 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>
Mon, 23 Jan 2012 05:24:28 +0000 (21:24 -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.

Change-Id: I023413cd41fbbd2d844d79a3b29c087792fffa24
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>
src/WINNT/afsd/cm_dcache.c

index 3897643016d49e1be511046b929b1589f1e91356..79fe80b6aee44e402ac0b51d332ad4bbc9b4ecb4 100644 (file)
@@ -383,8 +383,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
@@ -425,6 +423,8 @@ long cm_BufWrite(void *vscp, osi_hyper_t *offsetp, long length, long flags,
             _InterlockedOr(&scp->flags, CM_SCACHEFLAG_OVERQUOTA);
     }
 
+    cm_ReleaseBIOD(&biod, 1, code, 1);
+
   exit_storedata_excl:
     if (storedata_excl)
         cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_STOREDATA_EXCL);
@@ -2147,14 +2147,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;
 }