From c49b446ca51f7cef1ae0f04ec475eca6efe367da Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Fri, 8 Jul 2011 15:27:22 -0400 Subject: [PATCH] Windows: out of order lock smb v3 locking Do not obtain the smb_rctLock after holding the cm_scache_t->rw lock. At most one hold is required in case of lock failure. Obtain it as the start of processing and drop it at the end if not required. Reviewed-on: http://gerrit.openafs.org/4955 Tested-by: Jeffrey Altman Reviewed-by: Jeffrey Altman (cherry picked from commit da6c97678f530ca76334613e229337a75f94e297) Change-Id: I6b530366c74fd45ba585fd7af4615a1dc96ac055 Reviewed-on: http://gerrit.openafs.org/4960 Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman --- src/WINNT/afsd/smb3.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/WINNT/afsd/smb3.c b/src/WINNT/afsd/smb3.c index 0d6e5841c..8f1467849 100644 --- a/src/WINNT/afsd/smb3.c +++ b/src/WINNT/afsd/smb3.c @@ -6584,6 +6584,7 @@ long smb_ReceiveV3LockingX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) int i; cm_key_t key; unsigned int pid; + afs_uint32 smb_vc_hold_required = 0; smb_InitReq(&req); @@ -6619,6 +6620,7 @@ long smb_ReceiveV3LockingX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) inp->fid = fid; userp = smb_GetUserFromVCP(vcp, inp); + smb_HoldVC(vcp); lock_ObtainWrite(&scp->rw); code = cm_SyncOp(scp, NULL, userp, &req, 0, @@ -6725,7 +6727,7 @@ long smb_ReceiveV3LockingX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) osi_assertx(wlRequest != NULL, "null wlRequest"); wlRequest->vcp = vcp; - smb_HoldVC(vcp); + smb_vc_hold_required = 1; wlRequest->scp = scp; osi_Log2(smb_logp,"smb_ReceiveV3LockingX wlRequest 0x%p scp 0x%p", wlRequest, scp); cm_HoldSCache(scp); @@ -6857,6 +6859,8 @@ long smb_ReceiveV3LockingX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) cm_ReleaseSCache(scp); cm_ReleaseUser(userp); smb_ReleaseFID(fidp); + if (!smb_vc_hold_required) + smb_HoldVC(vcp); return code; } -- 2.39.5