From: Jeffrey Altman Date: Sun, 22 Jan 2012 23:33:43 +0000 (-0500) Subject: Windows; release BIOD after status merge X-Git-Tag: upstream/1.8.0_pre1^2~2809 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=111de76ea8dac713247c99ebe2182ae16cc0a3c0;p=packages%2Fo%2Fopenafs.git Windows; release BIOD after status merge 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 Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman --- diff --git a/src/WINNT/afsd/cm_dcache.c b/src/WINNT/afsd/cm_dcache.c index 389764301..79fe80b6a 100644 --- a/src/WINNT/afsd/cm_dcache.c +++ b/src/WINNT/afsd/cm_dcache.c @@ -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; }