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: 62a55d088c ("NFS: Additional refactoring for fs_context conversion")
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
master
parent
8675c69816
commit
2b092175f5
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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)) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
Loading…
Reference in New Issue