From: Jeffrey Altman Date: Wed, 23 Jul 2008 05:55:36 +0000 (+0000) Subject: windows-volume-deadlock-20080722 X-Git-Tag: openafs-devel-1_5_61~944 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=2ed0ee573c2b36cc6979693827e36f1ce6bdfa1b;p=packages%2Fo%2Fopenafs.git 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. --- 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;