]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob
65454e8bb528ddd5b57dae37652eb6507d988045
[thirdparty/kernel/stable-queue.git] /
1 From 9e31678fb403eae0f4fe37c6374be098835c73cd Mon Sep 17 00:00:00 2001
2 From: Bharath SM <bharathsm@microsoft.com>
3 Date: Thu, 11 Aug 2022 19:46:11 +0000
4 Subject: SMB3: fix lease break timeout when multiple deferred close handles for the same file.
5
6 From: Bharath SM <bharathsm@microsoft.com>
7
8 commit 9e31678fb403eae0f4fe37c6374be098835c73cd upstream.
9
10 Solution is to send lease break ack immediately even in case of
11 deferred close handles to avoid lease break request timing out
12 and let deferred closed handle gets closed as scheduled.
13 Later patches could optimize cases where we then close some
14 of these handles sooner for the cases where lease break is to 'none'
15
16 Cc: stable@kernel.org
17 Signed-off-by: Bharath SM <bharathsm@microsoft.com>
18 Signed-off-by: Steve French <stfrench@microsoft.com>
19 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
20 ---
21 fs/cifs/file.c | 20 +-------------------
22 1 file changed, 1 insertion(+), 19 deletions(-)
23
24 --- a/fs/cifs/file.c
25 +++ b/fs/cifs/file.c
26 @@ -4807,8 +4807,6 @@ void cifs_oplock_break(struct work_struc
27 struct TCP_Server_Info *server = tcon->ses->server;
28 int rc = 0;
29 bool purge_cache = false;
30 - bool is_deferred = false;
31 - struct cifs_deferred_close *dclose;
32
33 wait_on_bit(&cinode->flags, CIFS_INODE_PENDING_WRITERS,
34 TASK_UNINTERRUPTIBLE);
35 @@ -4845,22 +4843,6 @@ void cifs_oplock_break(struct work_struc
36
37 oplock_break_ack:
38 /*
39 - * When oplock break is received and there are no active
40 - * file handles but cached, then schedule deferred close immediately.
41 - * So, new open will not use cached handle.
42 - */
43 - spin_lock(&CIFS_I(inode)->deferred_lock);
44 - is_deferred = cifs_is_deferred_close(cfile, &dclose);
45 - spin_unlock(&CIFS_I(inode)->deferred_lock);
46 - if (is_deferred &&
47 - cfile->deferred_close_scheduled &&
48 - delayed_work_pending(&cfile->deferred)) {
49 - if (cancel_delayed_work(&cfile->deferred)) {
50 - _cifsFileInfo_put(cfile, false, false);
51 - goto oplock_break_done;
52 - }
53 - }
54 - /*
55 * releasing stale oplock after recent reconnect of smb session using
56 * a now incorrect file handle is not a data integrity issue but do
57 * not bother sending an oplock release if session to server still is
58 @@ -4871,7 +4853,7 @@ oplock_break_ack:
59 cinode);
60 cifs_dbg(FYI, "Oplock release rc = %d\n", rc);
61 }
62 -oplock_break_done:
63 +
64 _cifsFileInfo_put(cfile, false /* do not wait for ourself */, false);
65 cifs_done_oplock_break(cinode);
66 }