aboutsummaryrefslogtreecommitdiffstats
path: root/fs/cifs
diff options
context:
space:
mode:
authorSteve French <stfrench@microsoft.com>2021-11-12 09:55:03 -0600
committerSteve French <stfrench@microsoft.com>2021-11-12 12:59:51 -0600
commit9e7ffa77b26a8a00a12b6631aa13f161d9900b0c (patch)
treea088a0935db016b3ea308086e832b400f0d9e29d /fs/cifs
parentsmb3: add additional null check in SMB2_tcon (diff)
downloadlinux-dev-9e7ffa77b26a8a00a12b6631aa13f161d9900b0c.tar.xz
linux-dev-9e7ffa77b26a8a00a12b6631aa13f161d9900b0c.zip
cifs: release lock earlier in dequeue_mid error case
In dequeue_mid we can log an error while holding a spinlock, GlobalMid_Lock. Coverity notes that the error logging also grabs a lock so it is cleaner (and a bit safer) to release the GlobalMid_Lock before logging the warning. Addresses-Coverity: 1507573 ("Thread deadlock") Reviewed-by: Paulo Alcantara (SUSE) <pc@cjr.nz> Signed-off-by: Steve French <stfrench@microsoft.com>
Diffstat (limited to 'fs/cifs')
-rw-r--r--fs/cifs/connect.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
index df3365958603..ae21dff02f30 100644
--- a/fs/cifs/connect.c
+++ b/fs/cifs/connect.c
@@ -709,13 +709,14 @@ dequeue_mid(struct mid_q_entry *mid, bool malformed)
* Trying to handle/dequeue a mid after the send_recv()
* function has finished processing it is a bug.
*/
- if (mid->mid_flags & MID_DELETED)
+ if (mid->mid_flags & MID_DELETED) {
+ spin_unlock(&GlobalMid_Lock);
pr_warn_once("trying to dequeue a deleted mid\n");
- else {
+ } else {
list_del_init(&mid->qhead);
mid->mid_flags |= MID_DELETED;
+ spin_unlock(&GlobalMid_Lock);
}
- spin_unlock(&GlobalMid_Lock);
}
static unsigned int