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.
Change-Id: I370321b087df480336c833d68e348d7f62d227b3
Reviewed-on: http://gerrit.openafs.org/4955
Tested-by: Jeffrey Altman <jaltman@openafs.org>
Reviewed-by: Jeffrey Altman <jaltman@openafs.org>
int i;
cm_key_t key;
unsigned int pid;
+ afs_uint32 smb_vc_hold_required = 0;
smb_InitReq(&req);
inp->fid = fid;
userp = smb_GetUserFromVCP(vcp, inp);
+ smb_HoldVC(vcp);
lock_ObtainWrite(&scp->rw);
code = cm_SyncOp(scp, NULL, userp, &req, 0,
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);
cm_ReleaseSCache(scp);
cm_ReleaseUser(userp);
smb_ReleaseFID(fidp);
+ if (!smb_vc_hold_required)
+ smb_HoldVC(vcp);
return code;
}