Commit 8675c698 authored by Trond Myklebust's avatar Trond Myklebust
Browse files

NFS: Automounted filesystems should inherit ro,noexec,nodev,sync flags



When a filesystem is being automounted, it needs to preserve the
user-set superblock mount options, such as the "ro" flag.

Reported-by: default avatarLi Lingfeng <lilingfeng3@huawei.com>
Link: https://lore.kernel.org/all/20240604112636.236517-3-lilingfeng@huaweicloud.com/


Fixes: f2aedb71 ("NFS: Add fs_context support.")
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
parent d4a26d34
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -149,6 +149,7 @@ struct vfsmount *nfs_d_automount(struct path *path)
	struct vfsmount *mnt = ERR_PTR(-ENOMEM);
	struct nfs_server *server = NFS_SB(path->dentry->d_sb);
	struct nfs_client *client = server->nfs_client;
	unsigned long s_flags = path->dentry->d_sb->s_flags;
	int timeout = READ_ONCE(nfs_mountpoint_expiry_timeout);
	int ret;

@@ -174,6 +175,11 @@ struct vfsmount *nfs_d_automount(struct path *path)
		fc->net_ns = get_net(client->cl_net);
	}

	/* Inherit the flags covered by NFS_SB_MASK */
	fc->sb_flags_mask |= NFS_SB_MASK;
	fc->sb_flags &= ~NFS_SB_MASK;
	fc->sb_flags |= s_flags & NFS_SB_MASK;

	/* for submounts we want the same server; referrals will reassign */
	memcpy(&ctx->nfs_server._address, &client->cl_addr, client->cl_addrlen);
	ctx->nfs_server.addrlen	= client->cl_addrlen;
+0 −4
Original line number Diff line number Diff line
@@ -1315,10 +1315,6 @@ int nfs_get_tree_common(struct fs_context *fc)
	if (server->flags & NFS_MOUNT_NOAC)
		fc->sb_flags |= SB_SYNCHRONOUS;

	if (ctx->clone_data.sb)
		if (ctx->clone_data.sb->s_flags & SB_SYNCHRONOUS)
			fc->sb_flags |= SB_SYNCHRONOUS;

	/* Get a superblock - note that we may end up sharing one that already exists */
	fc->s_fs_info = server;
	s = sget_fc(fc, compare_super, nfs_set_super);