lkml.org 
[lkml]   [2019]   [Oct]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.3 304/344] smb3: allow disabling requesting leases
    Date
    From: Steve French <stfrench@microsoft.com>

    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 | 2 ++
    fs/cifs/cifsglob.h | 2 ++
    fs/cifs/connect.c | 9 ++++++++-
    fs/cifs/smb2pdu.c | 2 +-
    4 files changed, 13 insertions(+), 2 deletions(-)

    --- a/fs/cifs/cifsfs.c
    +++ b/fs/cifs/cifsfs.c
    @@ -433,6 +433,8 @@ cifs_show_options(struct seq_file *s, st
    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)
    --- a/fs/cifs/cifsglob.h
    +++ b/fs/cifs/cifsglob.h
    @@ -576,6 +576,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;
    @@ -1082,6 +1083,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;
    --- a/fs/cifs/connect.c
    +++ b/fs/cifs/connect.c
    @@ -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,
    @@ -134,6 +134,7 @@ static const match_table_t cifs_mount_op
    { Opt_noforcegid, "noforcegid" },
    { Opt_noblocksend, "noblocksend" },
    { Opt_noautotune, "noautotune" },
    + { Opt_nolease, "nolease" },
    { Opt_hard, "hard" },
    { Opt_soft, "soft" },
    { Opt_perm, "perm" },
    @@ -1713,6 +1714,9 @@ cifs_parse_mount_options(const char *mou
    case Opt_noautotune:
    vol->noautotune = 1;
    break;
    + case Opt_nolease:
    + vol->no_lease = 1;
    + break;
    case Opt_hard:
    vol->retry = 1;
    break;
    @@ -3250,6 +3254,8 @@ static int match_tcon(struct cifs_tcon *
    return 0;
    if (tcon->handle_timeout != volume_info->handle_timeout)
    return 0;
    + if (tcon->no_lease != volume_info->no_lease)
    + return 0;
    return 1;
    }

    @@ -3464,6 +3470,7 @@ cifs_get_tcon(struct cifs_ses *ses, stru
    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);
    --- a/fs/cifs/smb2pdu.c
    +++ b/fs/cifs/smb2pdu.c
    @@ -2458,7 +2458,7 @@ SMB2_open_init(struct cifs_tcon *tcon, s
    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) ||

    \
     
     \ /
      Last update: 2019-10-03 18:55    [W:5.858 / U:0.096 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site