Windows: wait for I/O on buffers to complete in cm_SetupStoreBIOD
authorJeffrey Altman <jaltman@your-file-system.com>
Fri, 16 Apr 2010 04:09:25 +0000 (00:09 -0400)
committerJeffrey Altman <jaltman@openafs.org>
Sat, 17 Apr 2010 03:05:17 +0000 (20:05 -0700)
cm_SetupStoreBIOD constructs a list of dirty buffers for a file
that are to be written to the file server.  When constructing
the list, if when determining the first dirty buffer we come across
a buffer that is already actively involved in an I/O operation,
call buf_WaitIO() to wait until the buffer is no longer busy before
continuing.  This reduces lock contention and synchronization
conflicts.

LICENSE MIT

Change-Id: Icd79b9578b7411b138f14257bcb885249960eab0
Reviewed-on: http://gerrit.openafs.org/1760
Tested-by: Jeffrey Altman <jaltman@openafs.org>
Reviewed-by: Jeffrey Altman <jaltman@openafs.org>

src/WINNT/afsd/cm_dcache.c

index 32dcf29..ba311d5 100644 (file)
@@ -936,8 +936,15 @@ long cm_SetupStoreBIOD(cm_scache_t *scp, osi_hyper_t *inOffsetp, long inSize,
             /* get buffer mutex and scp mutex safely */
             lock_ReleaseWrite(&scp->rw);
             lock_ObtainMutex(&bufp->mx);
-            lock_ObtainWrite(&scp->rw);
 
+            /*
+             * if the buffer is actively involved in I/O
+             * we wait for the I/O to complete.
+             */
+            if (bufp->flags & (CM_BUF_WRITING|CM_BUF_READING))
+                buf_WaitIO(scp, bufp);
+
+            lock_ObtainWrite(&scp->rw);
             flags = CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS | CM_SCACHESYNC_STOREDATA | CM_SCACHESYNC_BUFLOCKED;
             code = cm_SyncOp(scp, bufp, userp, reqp, 0, flags); 
             if (code) {