From 1cdb4d92f9718c6b8a9cd094e8de459d742b1b05 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Sun, 24 Aug 2008 18:47:43 +0000 Subject: [PATCH] DEVEL15-windows-prefetch-lock-order-20080824 LICENSE MIT lock order violation between cm_daemonLock and cm_scache_t rw lock (cherry picked from commit 82741251b1f444a1f18e3b9816f8cadac3e168b5) --- src/WINNT/afsd/smb3.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/WINNT/afsd/smb3.c b/src/WINNT/afsd/smb3.c index bceb908b9..ba54a818c 100644 --- a/src/WINNT/afsd/smb3.c +++ b/src/WINNT/afsd/smb3.c @@ -6688,6 +6688,7 @@ long smb_ReceiveNTCreateX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) BOOL foundscp; cm_req_t req; int created = 0; + int prefetch = 0; cm_lock_data_t *ldp = NULL; smb_InitReq(&req); @@ -7463,11 +7464,15 @@ long smb_ReceiveNTCreateX(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *outp) if ((fidp->flags & SMB_FID_EXECUTABLE) && LargeIntegerGreaterThanZero(fidp->scp->length) && !(scp->flags & CM_SCACHEFLAG_PREFETCHING)) { + prefetch = 1; + } + lock_ReleaseRead(&scp->rw); + + if (prefetch) cm_QueueBKGRequest(fidp->scp, cm_BkgPrefetch, 0, 0, fidp->scp->length.LowPart, fidp->scp->length.HighPart, userp); - } - lock_ReleaseRead(&scp->rw); + osi_Log2(smb_logp, "SMB NT CreateX opening fid %d path %S", fidp->fid, osi_LogSaveClientString(smb_logp, realPathp)); @@ -7533,6 +7538,7 @@ long smb_ReceiveNTTranCreate(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *out char *outData; cm_req_t req; int created = 0; + int prefetch = 0; cm_lock_data_t *ldp = NULL; smb_InitReq(&req); @@ -8205,11 +8211,14 @@ long smb_ReceiveNTTranCreate(smb_vc_t *vcp, smb_packet_t *inp, smb_packet_t *out if ((fidp->flags & SMB_FID_EXECUTABLE) && LargeIntegerGreaterThanZero(fidp->scp->length) && !(scp->flags & CM_SCACHEFLAG_PREFETCHING)) { + prefetch = 1; + } + lock_ReleaseRead(&scp->rw); + + if (prefetch) cm_QueueBKGRequest(fidp->scp, cm_BkgPrefetch, 0, 0, fidp->scp->length.LowPart, fidp->scp->length.HighPart, userp); - } - lock_ReleaseRead(&scp->rw); osi_Log1(smb_logp, "SMB NTTranCreate opening fid %d", fidp->fid); -- 2.39.5