From 489f1d26ab25377e085f102ac00a8981eb6d0ef2 Mon Sep 17 00:00:00 2001 From: Nickolai Zeldovich Date: Sat, 8 Jun 2002 01:31:42 +0000 Subject: [PATCH] STABLE12-avoid-deadlock-while-upgrading-vcache-lock-20020605 Delay calling afs_ProcessFS() and upgrading the shared vcache lock until after the dcache locks have been released, to obey lock ordering and avoid deadlock. (cherry picked from commit 9ab8961c3106402de12f4d0dd80c65e249293fdb) --- src/afs/afs_segments.c | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/src/afs/afs_segments.c b/src/afs/afs_segments.c index f67ab9f36..ea18b8e9a 100644 --- a/src/afs/afs_segments.c +++ b/src/afs/afs_segments.c @@ -284,6 +284,8 @@ afs_StoreAllSegments(avc, areq, sync) if (j) { static afs_uint32 lp1 = 10000, lp2 = 10000; struct AFSStoreStatus InStatus; + struct AFSFetchStatus OutStatus; + int doProcessFS = 0; afs_uint32 base, bytes, nchunks; int nomore; unsigned int first; @@ -475,7 +477,6 @@ afs_StoreAllSegments(avc, areq, sync) * one which has the writing bit turned on. */ } if (!code) { - struct AFSFetchStatus OutStatus; struct AFSVolSync tsync; #ifdef RX_ENABLE_LOCKS AFS_GUNLOCK(); @@ -486,19 +487,7 @@ afs_StoreAllSegments(avc, areq, sync) #endif /* RX_ENABLE_LOCKS */ hadd32(newDV, 1); XSTATS_END_TIME; - - /* Now copy out return params */ - UpgradeSToWLock(&avc->lock,28); /* keep out others for a while */ - if (!code) { /* must wait til RPC completes to be sure of this info */ - afs_ProcessFS(avc, &OutStatus, areq); - /* Keep last (max) size of file on server to see if - * we need to call afs_StoreMini to extend the file. - */ - if (!moredata) - maxStoredLength = OutStatus.Length; - - } - ConvertWToSLock(&avc->lock); + if (!code) doProcessFS = 1; /* Flag to run afs_ProcessFS() later on */ } if (tcall) { #ifdef RX_ENABLE_LOCKS @@ -538,6 +527,19 @@ afs_StoreAllSegments(avc, areq, sync) lockedPutDCache(tdc); } + if (doProcessFS) { + /* Now copy out return params */ + UpgradeSToWLock(&avc->lock,28); /* keep out others for a while */ + afs_ProcessFS(avc, &OutStatus, areq); + /* Keep last (max) size of file on server to see if + * we need to call afs_StoreMini to extend the file. + */ + if (!moredata) + maxStoredLength = OutStatus.Length; + ConvertWToSLock(&avc->lock); + doProcessFS = 0; + } + if (code) { for (j++; j<=high; j++) if ( dcList[j] ) -- 2.39.5