From 1a95df210c51a4e1416e5996b99c5640e4265255 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Thu, 7 Feb 2008 14:47:25 +0000 Subject: [PATCH] windows-volstat-20080207 LICENSE MIT When updating the volume status do not introduce a deadlock by holding cm_serverLock --- src/WINNT/afsd/cm_conn.c | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/src/WINNT/afsd/cm_conn.c b/src/WINNT/afsd/cm_conn.c index b407bd6..8413a19 100644 --- a/src/WINNT/afsd/cm_conn.c +++ b/src/WINNT/afsd/cm_conn.c @@ -267,9 +267,6 @@ cm_Analyze(cm_conn_t *connp, cm_user_t *userp, cm_req_t *reqp, * background daemon thread as they become available */ if (timeLeft > 7 && fidp) { - cm_volume_t *volp; - cm_vol_state_t *statep; - thrd_Sleep(5000); code = cm_GetVolumeByID(cellp, fidp->volume, userp, reqp, @@ -382,20 +379,18 @@ cm_Analyze(cm_conn_t *connp, cm_user_t *userp, cm_req_t *reqp, statep = &volp->ro; else if (fidp->volume == volp->bk.ID) statep = &volp->bk; - - cm_UpdateVolumeStatus(volp, statep->ID); } - - cm_PutVolume(volp); } break; } } lock_ReleaseWrite(&cm_serverLock); - if (statep) + if (statep) { cm_UpdateVolumeStatus(volp, statep->ID); - + cm_PutVolume(volp); + } + if (free_svr_list) { cm_FreeServerList(&serversp, 0); *serverspp = serversp; @@ -455,13 +450,12 @@ cm_Analyze(cm_conn_t *connp, cm_user_t *userp, cm_req_t *reqp, free_svr_list = 1; } } + lock_ObtainWrite(&cm_serverLock); for (tsrp = serversp; tsrp; tsrp=tsrp->next) { if (tsrp->server == serverp) { /* REDIRECT */ if (errorCode == VMOVED) { tsrp->status = srv_deleted; - if (fidp) - cm_ForceUpdateVolume(fidp, userp, reqp); } else { tsrp->status = srv_offline; } @@ -477,13 +471,20 @@ cm_Analyze(cm_conn_t *connp, cm_user_t *userp, cm_req_t *reqp, statep = &volp->ro; else if (fidp->volume == volp->bk.ID) statep = &volp->bk; - - cm_UpdateVolumeStatus(volp, statep->ID); } - cm_PutVolume(volp); } } } + lock_ReleaseWrite(&cm_serverLock); + + if (fidp && errorCode == VMOVED) + cm_ForceUpdateVolume(fidp, userp, reqp); + + if (statep) { + cm_UpdateVolumeStatus(volp, statep->ID); + cm_PutVolume(volp); + } + if (free_svr_list) { cm_FreeServerList(&serversp, 0); *serverspp = serversp; -- 1.9.4