]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
NFS: Fix inheritance of the block sizes when automounting
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Fri, 28 Nov 2025 21:06:41 +0000 (16:06 -0500)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Sat, 29 Nov 2025 22:23:03 +0000 (17:23 -0500)
Only inherit the block sizes that were actually specified as mount
parameters for the parent mount.

Fixes: 62a55d088cd8 ("NFS: Additional refactoring for fs_context conversion")
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
fs/nfs/client.c
fs/nfs/internal.h
fs/nfs/namespace.c
fs/nfs/nfs4client.c
fs/nfs/super.c
include/linux/nfs_fs_sb.h

index 54699299d5b16811e1475dce2c5a1d648c26228e..2aaea9c98c2cd01264db190a33ac787d3e98c761 100644 (file)
@@ -784,10 +784,18 @@ static int nfs_init_server(struct nfs_server *server,
                server->fattr_valid = NFS_ATTR_FATTR_V4;
        }
 
-       if (ctx->rsize)
+       if (ctx->bsize) {
+               server->bsize = ctx->bsize;
+               server->automount_inherit |= NFS_AUTOMOUNT_INHERIT_BSIZE;
+       }
+       if (ctx->rsize) {
                server->rsize = nfs_io_size(ctx->rsize, clp->cl_proto);
-       if (ctx->wsize)
+               server->automount_inherit |= NFS_AUTOMOUNT_INHERIT_RSIZE;
+       }
+       if (ctx->wsize) {
                server->wsize = nfs_io_size(ctx->wsize, clp->cl_proto);
+               server->automount_inherit |= NFS_AUTOMOUNT_INHERIT_WSIZE;
+       }
 
        server->acregmin = ctx->acregmin * HZ;
        server->acregmax = ctx->acregmax * HZ;
@@ -977,8 +985,13 @@ EXPORT_SYMBOL_GPL(nfs_probe_server);
 void nfs_server_copy_userdata(struct nfs_server *target, struct nfs_server *source)
 {
        target->flags = source->flags;
-       target->rsize = source->rsize;
-       target->wsize = source->wsize;
+       target->automount_inherit = source->automount_inherit;
+       if (source->automount_inherit & NFS_AUTOMOUNT_INHERIT_BSIZE)
+               target->bsize = source->bsize;
+       if (source->automount_inherit & NFS_AUTOMOUNT_INHERIT_RSIZE)
+               target->rsize = source->rsize;
+       if (source->automount_inherit & NFS_AUTOMOUNT_INHERIT_WSIZE)
+               target->wsize = source->wsize;
        target->acregmin = source->acregmin;
        target->acregmax = source->acregmax;
        target->acdirmin = source->acdirmin;
index ffd382aa31ac0c29d8479e9ae5c46a79e199aba0..2e596244799f391199a3ab5c9a2c387388f6ae2f 100644 (file)
@@ -152,7 +152,6 @@ struct nfs_fs_context {
                struct super_block      *sb;
                struct dentry           *dentry;
                struct nfs_fattr        *fattr;
-               unsigned int            inherited_bsize;
        } clone_data;
 };
 
index dca055676c4f317de067af6c721314cbf935c52d..9e4d94f41fc674c4b887df615495ba314c8801ca 100644 (file)
@@ -190,6 +190,10 @@ struct vfsmount *nfs_d_automount(struct path *path)
        ctx->nfs_mod            = client->cl_nfs_mod;
        get_nfs_version(ctx->nfs_mod);
 
+       /* Inherit block sizes if they were specified as mount parameters */
+       if (server->automount_inherit & NFS_AUTOMOUNT_INHERIT_BSIZE)
+               ctx->bsize = server->bsize;
+
        ret = client->rpc_ops->submount(fc, server);
        if (ret < 0) {
                mnt = ERR_PTR(ret);
@@ -289,7 +293,6 @@ int nfs_do_submount(struct fs_context *fc)
                return -ENOMEM;
 
        ctx->internal           = true;
-       ctx->clone_data.inherited_bsize = ctx->clone_data.sb->s_blocksize_bits;
 
        p = nfs_devname(dentry, buffer, 4096);
        if (IS_ERR(p)) {
index 4e972f85d0caf25f12fc75c47db6989142b37c70..96bccefbe2cb2e65ce753f3b4facaf154329126f 100644 (file)
@@ -1179,10 +1179,20 @@ static int nfs4_init_server(struct nfs_server *server, struct fs_context *fc)
        if (error < 0)
                return error;
 
-       if (ctx->rsize)
-               server->rsize = nfs_io_size(ctx->rsize, server->nfs_client->cl_proto);
-       if (ctx->wsize)
-               server->wsize = nfs_io_size(ctx->wsize, server->nfs_client->cl_proto);
+       if (ctx->bsize) {
+               server->bsize = ctx->bsize;
+               server->automount_inherit |= NFS_AUTOMOUNT_INHERIT_BSIZE;
+       }
+       if (ctx->rsize) {
+               server->rsize =
+                       nfs_io_size(ctx->rsize, server->nfs_client->cl_proto);
+               server->automount_inherit |= NFS_AUTOMOUNT_INHERIT_RSIZE;
+       }
+       if (ctx->wsize) {
+               server->wsize =
+                       nfs_io_size(ctx->wsize, server->nfs_client->cl_proto);
+               server->automount_inherit |= NFS_AUTOMOUNT_INHERIT_WSIZE;
+       }
 
        server->acregmin = ctx->acregmin * HZ;
        server->acregmax = ctx->acregmax * HZ;
index 66413133b43e3f527c2399b7e6223d8785051638..57d372db03b936362e59d280fcd809405bbf3c02 100644 (file)
@@ -1091,8 +1091,9 @@ static void nfs_fill_super(struct super_block *sb, struct nfs_fs_context *ctx)
        sb->s_blocksize = 0;
        sb->s_xattr = server->nfs_client->cl_nfs_mod->xattr;
        sb->s_op = server->nfs_client->cl_nfs_mod->sops;
-       if (ctx->bsize)
-               sb->s_blocksize = nfs_block_size(ctx->bsize, &sb->s_blocksize_bits);
+       if (server->bsize)
+               sb->s_blocksize =
+                       nfs_block_size(server->bsize, &sb->s_blocksize_bits);
 
        switch (server->nfs_client->rpc_ops->version) {
        case 2:
@@ -1338,13 +1339,8 @@ int nfs_get_tree_common(struct fs_context *fc)
        }
 
        if (!s->s_root) {
-               unsigned bsize = ctx->clone_data.inherited_bsize;
                /* initial superblock/root creation */
                nfs_fill_super(s, ctx);
-               if (bsize) {
-                       s->s_blocksize_bits = bsize;
-                       s->s_blocksize = 1U << bsize;
-               }
                error = nfs_get_cache_cookie(s, ctx);
                if (error < 0)
                        goto error_splat_super;
index 4ba04de6b1caec2d4e5de09b217c497539d94d71..c58b870f31eeaf2b5d874a04a1deb0a789d7326c 100644 (file)
@@ -172,6 +172,11 @@ struct nfs_server {
 #define NFS_MOUNT_FORCE_RDIRPLUS       0x20000000
 #define NFS_MOUNT_NETUNREACH_FATAL     0x40000000
 
+       unsigned int            automount_inherit; /* Properties inherited by automount */
+#define NFS_AUTOMOUNT_INHERIT_BSIZE    0x0001
+#define NFS_AUTOMOUNT_INHERIT_RSIZE    0x0002
+#define NFS_AUTOMOUNT_INHERIT_WSIZE    0x0004
+
        unsigned int            caps;           /* server capabilities */
        __u64                   fattr_valid;    /* Valid attributes */
        unsigned int            rsize;          /* read size */