]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
smb3: allow disabling requesting leases
authorSteve French <stfrench@microsoft.com>
Thu, 12 Sep 2019 02:46:20 +0000 (21:46 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 5 Oct 2019 11:14:12 +0000 (13:14 +0200)
commit 3e7a02d47872081f4b6234a9f72500f1d10f060c upstream.

In some cases to work around server bugs or performance
problems it can be helpful to be able to disable requesting
SMB2.1/SMB3 leases on a particular mount (not to all servers
and all shares we are mounted to). Add new mount parm
"nolease" which turns off requesting leases on directory
or file opens.  Currently the only way to disable leases is
globally through a module load parameter. This is more
granular.

Suggested-by: Pavel Shilovsky <pshilov@microsoft.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
Reviewed-by: Ronnie Sahlberg <lsahlber@redhat.com>
Reviewed-by: Pavel Shilovsky <pshilov@microsoft.com>
CC: Stable <stable@vger.kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/cifs/cifsfs.c
fs/cifs/cifsglob.h
fs/cifs/connect.c
fs/cifs/smb2pdu.c

index 65d9771e49f9daf7cf6bfd4b32209377c9de4088..bd34ea0d27e934b0a67c357bdd85dffc0d5e7c53 100644 (file)
@@ -433,6 +433,8 @@ cifs_show_options(struct seq_file *s, struct dentry *root)
        cifs_show_security(s, tcon->ses);
        cifs_show_cache_flavor(s, cifs_sb);
 
+       if (tcon->no_lease)
+               seq_puts(s, ",nolease");
        if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MULTIUSER)
                seq_puts(s, ",multiuser");
        else if (tcon->ses->user_name)
index 4777b3c4a92c41f53330a603a810041c367e05df..85aa1bc930f19635173a68b460e52a3a1d6ed809 100644 (file)
@@ -575,6 +575,7 @@ struct smb_vol {
        bool noblocksnd:1;
        bool noautotune:1;
        bool nostrictsync:1; /* do not force expensive SMBflush on every sync */
+       bool no_lease:1;     /* disable requesting leases */
        bool fsc:1;     /* enable fscache */
        bool mfsymlinks:1; /* use Minshall+French Symlinks */
        bool multiuser:1;
@@ -1079,6 +1080,7 @@ struct cifs_tcon {
        bool need_reopen_files:1; /* need to reopen tcon file handles */
        bool use_resilient:1; /* use resilient instead of durable handles */
        bool use_persistent:1; /* use persistent instead of durable handles */
+       bool no_lease:1;    /* Do not request leases on files or directories */
        __le32 capabilities;
        __u32 share_flags;
        __u32 maximal_access;
index 85b2107e8a3d70adcfd436a592eaf3076e8c7ec3..bd8c00635ea4e084a7909293e3f33d9e112ab2a2 100644 (file)
@@ -74,7 +74,7 @@ enum {
        Opt_user_xattr, Opt_nouser_xattr,
        Opt_forceuid, Opt_noforceuid,
        Opt_forcegid, Opt_noforcegid,
-       Opt_noblocksend, Opt_noautotune,
+       Opt_noblocksend, Opt_noautotune, Opt_nolease,
        Opt_hard, Opt_soft, Opt_perm, Opt_noperm,
        Opt_mapposix, Opt_nomapposix,
        Opt_mapchars, Opt_nomapchars, Opt_sfu,
@@ -133,6 +133,7 @@ static const match_table_t cifs_mount_option_tokens = {
        { Opt_noforcegid, "noforcegid" },
        { Opt_noblocksend, "noblocksend" },
        { Opt_noautotune, "noautotune" },
+       { Opt_nolease, "nolease" },
        { Opt_hard, "hard" },
        { Opt_soft, "soft" },
        { Opt_perm, "perm" },
@@ -1709,6 +1710,9 @@ cifs_parse_mount_options(const char *mountdata, const char *devname,
                case Opt_noautotune:
                        vol->noautotune = 1;
                        break;
+               case Opt_nolease:
+                       vol->no_lease = 1;
+                       break;
                case Opt_hard:
                        vol->retry = 1;
                        break;
@@ -3230,6 +3234,8 @@ static int match_tcon(struct cifs_tcon *tcon, struct smb_vol *volume_info)
                return 0;
        if (tcon->handle_timeout != volume_info->handle_timeout)
                return 0;
+       if (tcon->no_lease != volume_info->no_lease)
+               return 0;
        return 1;
 }
 
@@ -3444,6 +3450,7 @@ cifs_get_tcon(struct cifs_ses *ses, struct smb_vol *volume_info)
        tcon->nocase = volume_info->nocase;
        tcon->nohandlecache = volume_info->nohandlecache;
        tcon->local_lease = volume_info->local_lease;
+       tcon->no_lease = volume_info->no_lease;
        INIT_LIST_HEAD(&tcon->pending_opens);
 
        spin_lock(&cifs_tcp_ses_lock);
index c3c8de5513dbfa9a0fa76c9059414016502296c2..edd1946150f8b4e587dc1bf3028fae2f2f89c630 100644 (file)
@@ -2370,7 +2370,7 @@ SMB2_open_init(struct cifs_tcon *tcon, struct smb_rqst *rqst, __u8 *oplock,
        iov[1].iov_len = uni_path_len;
        iov[1].iov_base = path;
 
-       if (!server->oplocks)
+       if ((!server->oplocks) || (tcon->no_lease))
                *oplock = SMB2_OPLOCK_LEVEL_NONE;
 
        if (!(server->capabilities & SMB2_GLOBAL_CAP_LEASING) ||