]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
ksmbd: avoid to send duplicate oplock break notifications
authorNamjae Jeon <linkinjeon@kernel.org>
Thu, 9 May 2024 06:25:39 +0000 (15:25 +0900)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 30 May 2024 07:48:44 +0000 (09:48 +0200)
commit c91ecba9e421e4f2c9219cf5042fa63a12025310 upstream.

This patch fixes generic/011 when oplocks is enable.

Avoid to send duplicate oplock break notifications like smb2 leases
case.

Fixes: 97c2ec64667b ("ksmbd: avoid to send duplicate lease break notifications")
Cc: stable@vger.kernel.org
Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/smb/server/oplock.c

index dc729ab980dc04b260fa3b626a9edb082c8ba05e..2292ca6ff00b6b0e9162ed919420f2792cbfbe33 100644 (file)
@@ -613,19 +613,24 @@ static int oplock_break_pending(struct oplock_info *opinfo, int req_op_level)
                if (opinfo->op_state == OPLOCK_CLOSING)
                        return -ENOENT;
                else if (opinfo->level <= req_op_level) {
-                       if (opinfo->is_lease &&
-                           opinfo->o_lease->state !=
-                            (SMB2_LEASE_HANDLE_CACHING_LE |
-                             SMB2_LEASE_READ_CACHING_LE))
+                       if (opinfo->is_lease == false)
+                               return 1;
+
+                       if (opinfo->o_lease->state !=
+                           (SMB2_LEASE_HANDLE_CACHING_LE |
+                            SMB2_LEASE_READ_CACHING_LE))
                                return 1;
                }
        }
 
        if (opinfo->level <= req_op_level) {
-               if (opinfo->is_lease &&
-                   opinfo->o_lease->state !=
-                    (SMB2_LEASE_HANDLE_CACHING_LE |
-                     SMB2_LEASE_READ_CACHING_LE)) {
+               if (opinfo->is_lease == false) {
+                       wake_up_oplock_break(opinfo);
+                       return 1;
+               }
+               if (opinfo->o_lease->state !=
+                   (SMB2_LEASE_HANDLE_CACHING_LE |
+                    SMB2_LEASE_READ_CACHING_LE)) {
                        wake_up_oplock_break(opinfo);
                        return 1;
                }