diff options
author | Steve French <stfrench@microsoft.com> | 2021-11-12 16:55:03 +0100 |
---|---|---|
committer | Steve French <stfrench@microsoft.com> | 2021-11-12 19:59:51 +0100 |
commit | 9e7ffa77b26a8a00a12b6631aa13f161d9900b0c (patch) | |
tree | a088a0935db016b3ea308086e832b400f0d9e29d | |
parent | smb3: add additional null check in SMB2_tcon (diff) | |
download | linux-9e7ffa77b26a8a00a12b6631aa13f161d9900b0c.tar.xz linux-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>
-rw-r--r-- | fs/cifs/connect.c | 7 |
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 |