]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
smb3: add mount parm nosparse
authorSteve French <stfrench@microsoft.com>
Tue, 24 May 2022 04:17:12 +0000 (23:17 -0500)
committerSteve French <stfrench@microsoft.com>
Tue, 24 May 2022 04:32:54 +0000 (23:32 -0500)
To reduce risk of applications breaking that mount to servers
with only partial sparse file support, add optional mount parm
"nosparse" which disables setting files sparse (and thus
will return EOPNOTSUPP on certain fallocate operations).

Acked-by: Ronnie Sahlberg <lsahlber@redhat.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/cifs/cifs_debug.c
fs/cifs/cifsfs.c
fs/cifs/connect.c
fs/cifs/fs_context.c
fs/cifs/fs_context.h

index 9d334816eac074a5edc2233d44a2008e1956a376..0effc4c95077c952035e579dec967890e2480466 100644 (file)
@@ -116,7 +116,8 @@ static void cifs_debug_tcon(struct seq_file *m, struct cifs_tcon *tcon)
                tcon->ses->server->ops->dump_share_caps(m, tcon);
        if (tcon->use_witness)
                seq_puts(m, " Witness");
-
+       if (tcon->broken_sparse_sup)
+               seq_puts(m, " nosparse");
        if (tcon->need_reconnect)
                seq_puts(m, "\tDISCONNECTED ");
        seq_putc(m, '\n');
index 2b1a1c029c75ec19376a7250fb806b516e59ad03..f539a39d47f50ca6ce78f5eb3cf9fddcc8490040 100644 (file)
@@ -582,6 +582,8 @@ cifs_show_options(struct seq_file *s, struct dentry *root)
                seq_puts(s, ",nocase");
        if (tcon->nodelete)
                seq_puts(s, ",nodelete");
+       if (cifs_sb->ctx->no_sparse)
+               seq_puts(s, ",nosparse");
        if (tcon->local_lease)
                seq_puts(s, ",locallease");
        if (tcon->retry)
index 0b08693d1af8fbf1d23bae8af51857e38c94e5fc..1fd8d6a97d7c6b3659adcefe8eaf185482a52486 100644 (file)
@@ -2509,6 +2509,7 @@ cifs_get_tcon(struct cifs_ses *ses, struct smb3_fs_context *ctx)
         */
        tcon->retry = ctx->retry;
        tcon->nocase = ctx->nocase;
+       tcon->broken_sparse_sup = ctx->no_sparse;
        if (ses->server->capabilities & SMB2_GLOBAL_CAP_DIRECTORY_LEASING)
                tcon->nohandlecache = ctx->nohandlecache;
        else
index a92e9eec521f35ede489af492b56a50af48b30f4..ca1d6957a0999aa26d0b68009e64ce97bd753714 100644 (file)
@@ -119,6 +119,7 @@ const struct fs_parameter_spec smb3_fs_parameters[] = {
        fsparam_flag_no("persistenthandles", Opt_persistent),
        fsparam_flag_no("resilienthandles", Opt_resilient),
        fsparam_flag_no("tcpnodelay", Opt_tcp_nodelay),
+       fsparam_flag("nosparse", Opt_nosparse),
        fsparam_flag("domainauto", Opt_domainauto),
        fsparam_flag("rdma", Opt_rdma),
        fsparam_flag("modesid", Opt_modesid),
@@ -943,6 +944,9 @@ static int smb3_fs_context_parse_param(struct fs_context *fc,
        case Opt_nolease:
                ctx->no_lease = 1;
                break;
+       case Opt_nosparse:
+               ctx->no_sparse = 1;
+               break;
        case Opt_nodelete:
                ctx->nodelete = 1;
                break;
index e54090d9ef368e7562b17e61384bc600df4cf815..6576bb12f5f10ff7fd2c654f2870f5c295a4662b 100644 (file)
@@ -62,6 +62,7 @@ enum cifs_param {
        Opt_noblocksend,
        Opt_noautotune,
        Opt_nolease,
+       Opt_nosparse,
        Opt_hard,
        Opt_soft,
        Opt_perm,
@@ -222,6 +223,7 @@ struct smb3_fs_context {
        bool noautotune:1;
        bool nostrictsync:1; /* do not force expensive SMBflush on every sync */
        bool no_lease:1;     /* disable requesting leases */
+       bool no_sparse:1;    /* do not attempt to set files sparse */
        bool fsc:1;     /* enable fscache */
        bool mfsymlinks:1; /* use Minshall+French Symlinks */
        bool multiuser:1;