Commit d68ce834 authored by Shyam Prasad N's avatar Shyam Prasad N Committed by Steve French
Browse files

cifs: abort open_cached_dir if we don't request leases



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: default avatarBharath SM <bharathsm@microsoft.com>
Signed-off-by: default avatarShyam Prasad N <sprasad@microsoft.com>
Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
parent 7fd2df20
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -286,6 +286,14 @@ int open_cached_dir(unsigned int xid, struct cifs_tcon *tcon,
			    &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));