]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
cifs: abort open_cached_dir if we don't request leases
authorShyam Prasad N <sprasad@microsoft.com>
Tue, 28 Apr 2026 16:07:47 +0000 (21:37 +0530)
committerSteve French <stfrench@microsoft.com>
Mon, 4 May 2026 02:06:02 +0000 (21:06 -0500)
It is possible that SMB2_open_init may not set lease context based
on the requested oplock level. This can happen when leases have been
temporarily or permanently disabled. When this happens, we will have
open_cached_dir making an open without lease context and the response
will anyway be rejected by open_cached_dir (thereby forcing a close to
discard this open). That's unnecessary two round-trips to the server.

This change adds a check before making the open request to the server
to make sure that SMB2_open_init did add the expected lease context
to the open in open_cached_dir.

Cc: <stable@vger.kernel.org>
Reviewed-by: Bharath SM <bharathsm@microsoft.com>
Signed-off-by: Shyam Prasad N <sprasad@microsoft.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/smb/client/cached_dir.c

index 02791ec3c5a169980abbbc5e14aba258c141607b..88d5e9a32f28b3c479eff2219be3808f5898a882 100644 (file)
@@ -286,6 +286,14 @@ replay_again:
                            &rqst[0], &oplock, &oparms, utf16_path);
        if (rc)
                goto oshr_free;
+
+       if (oplock != SMB2_OPLOCK_LEVEL_II) {
+               rc = -EINVAL;
+               cifs_dbg(FYI, "%s: Oplock level %d not suitable for cached directory\n",
+                        __func__, oplock);
+               goto oshr_free;
+       }
+
        smb2_set_next_command(tcon, &rqst[0]);
 
        memset(&qi_iov, 0, sizeof(qi_iov));