From 1ffa9c25159f381c6cd3d26e1355a1f2b3873405 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Wed, 23 Jul 2008 05:56:59 +0000 Subject: [PATCH] DEVEL15-windows-volume-deadlock-20080722 LICENSE MIT When updating the volume location information, if a new server must be allocated and the server is down, then it is possible for a deadlock to occur on the cm_volume_t rw lock. Prevent that from happening. (cherry picked from commit 2ed0ee573c2b36cc6979693827e36f1ce6bdfa1b) --- src/WINNT/afsd/cm_volume.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/WINNT/afsd/cm_volume.c b/src/WINNT/afsd/cm_volume.c index cb3feb56a..3e181e57d 100644 --- a/src/WINNT/afsd/cm_volume.c +++ b/src/WINNT/afsd/cm_volume.c @@ -481,10 +481,13 @@ long cm_UpdateVolumeLocation(struct cm_cell *cellp, cm_user_t *userp, cm_req_t * tempAddr = htonl(serverNumber[i]); tsockAddr.sin_addr.s_addr = tempAddr; tsp = cm_FindServer(&tsockAddr, CM_SERVER_FILE); - if (!tsp) - tsp = cm_NewServer(&tsockAddr, CM_SERVER_FILE, - cellp, 0); - + if (!tsp) { + /* cm_NewServer will probe the server which in turn will + * update the state on the volume group object */ + lock_ReleaseWrite(&volp->rw); + tsp = cm_NewServer(&tsockAddr, CM_SERVER_FILE, cellp, 0); + lock_ObtainWrite(&volp->rw); + } /* if this server was created by fs setserverprefs */ if ( !tsp->cellp ) tsp->cellp = cellp; -- 2.39.5