Commit 2b092175 authored by Trond Myklebust's avatar Trond Myklebust
Browse files

NFS: Fix inheritance of the block sizes when automounting



Only inherit the block sizes that were actually specified as mount
parameters for the parent mount.

Fixes: 62a55d08 ("NFS: Additional refactoring for fs_context conversion")
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
parent 8675c698
Loading
Loading
Loading
Loading
+17 −4
Original line number Diff line number Diff line
@@ -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,7 +985,12 @@ EXPORT_SYMBOL_GPL(nfs_probe_server);
void nfs_server_copy_userdata(struct nfs_server *target, struct nfs_server *source)
{
	target->flags = source->flags;
	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;
+0 −1
Original line number Diff line number Diff line
@@ -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;
};

+4 −1
Original line number Diff line number Diff line
@@ -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)) {
+14 −4
Original line number Diff line number Diff line
@@ -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;
+3 −7
Original line number Diff line number Diff line
@@ -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;
Loading