From 111de76ea8dac713247c99ebe2182ae16cc0a3c0 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Sun, 22 Jan 2012 18:33:43 -0500 Subject: [PATCH] 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 --- src/WINNT/afsd/cm_dcache.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) 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; } -- 2.39.5