mirror of
https://git.openafs.org/openafs.git
synced 2025-01-19 07:20:11 +00:00
Windows: wait for I/O on buffers to complete in cm_SetupStoreBIOD
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>
This commit is contained in:
parent
349f533351
commit
5a253b1911
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user