From 59db9812209d5e54cc47fc32d626b8b73f7fc22b Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Tue, 19 Jun 2007 12:51:11 +0000 Subject: [PATCH] windows-deadlock-20070619 fix deadlock on cm_volumeLock introduced by last week's work in cm_Analyze, make sure we get a cm_cell_t reference otherwise we won't find the cm_volume_t we are searching for when ALLOFFLINE or ALLBUSY. --- src/WINNT/afsd/cm_conn.c | 3 +++ src/WINNT/afsd/cm_volume.c | 14 +++++++------- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/WINNT/afsd/cm_conn.c b/src/WINNT/afsd/cm_conn.c index 7a8ff4fd9..01fc39953 100644 --- a/src/WINNT/afsd/cm_conn.c +++ b/src/WINNT/afsd/cm_conn.c @@ -211,6 +211,9 @@ cm_Analyze(cm_conn_t *connp, cm_user_t *userp, cm_req_t *reqp, if ( refp->server ) cellp = refp->server->cellp; } + } + if (cellp == NULL && fidp) { + cellp = cm_FindCellByID(fidp->cell); } } diff --git a/src/WINNT/afsd/cm_volume.c b/src/WINNT/afsd/cm_volume.c index b56c33d2f..5016a1683 100644 --- a/src/WINNT/afsd/cm_volume.c +++ b/src/WINNT/afsd/cm_volume.c @@ -758,16 +758,16 @@ long cm_GetVolumeByName(struct cm_cell *cellp, char *volumeNamep, cm_AddVolumeToNameHashTable(volp); lock_ReleaseWrite(&cm_volumeLock); } - else if (volp) { + else { lock_ReleaseRead(&cm_volumeLock); - cm_GetVolume(volp); - lock_ObtainMutex(&volp->mx); + if (volp) { + cm_GetVolume(volp); + lock_ObtainMutex(&volp->mx); + } else { + return CM_ERROR_NOSUCHVOLUME; + } } - /* if we don't have a volp structure return no such volume */ - if (!volp) - return CM_ERROR_NOSUCHVOLUME; - /* if we get here we are holding the mutex */ if (volp->flags & CM_VOLUMEFLAG_RESET) { code = cm_UpdateVolume(cellp, userp, reqp, volp); -- 2.39.5