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>
/* 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) {