mirror of
https://github.com/torvalds/linux
synced 2024-07-21 18:51:47 +00:00
nfs: fix regression in handling of fsc= option in NFSv4
Setting the uniquifier for fscache via the fsc= mount option is currently broken in NFSv4. Fix this by passing fscache_uniq to root_fc if possible. Signed-off-by: Chen Hanxiao <chenhx.fnst@fujitsu.com> Reviewed-by: Jeff Layton <jlayton@kernel.org> Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
This commit is contained in:
parent
47f7c95632
commit
1443f76b26
|
@ -145,6 +145,7 @@ static int do_nfs4_mount(struct nfs_server *server,
|
||||||
const char *export_path)
|
const char *export_path)
|
||||||
{
|
{
|
||||||
struct nfs_fs_context *root_ctx;
|
struct nfs_fs_context *root_ctx;
|
||||||
|
struct nfs_fs_context *ctx;
|
||||||
struct fs_context *root_fc;
|
struct fs_context *root_fc;
|
||||||
struct vfsmount *root_mnt;
|
struct vfsmount *root_mnt;
|
||||||
struct dentry *dentry;
|
struct dentry *dentry;
|
||||||
|
@ -157,6 +158,12 @@ static int do_nfs4_mount(struct nfs_server *server,
|
||||||
.dirfd = -1,
|
.dirfd = -1,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct fs_parameter param_fsc = {
|
||||||
|
.key = "fsc",
|
||||||
|
.type = fs_value_is_string,
|
||||||
|
.dirfd = -1,
|
||||||
|
};
|
||||||
|
|
||||||
if (IS_ERR(server))
|
if (IS_ERR(server))
|
||||||
return PTR_ERR(server);
|
return PTR_ERR(server);
|
||||||
|
|
||||||
|
@ -168,9 +175,26 @@ static int do_nfs4_mount(struct nfs_server *server,
|
||||||
kfree(root_fc->source);
|
kfree(root_fc->source);
|
||||||
root_fc->source = NULL;
|
root_fc->source = NULL;
|
||||||
|
|
||||||
|
ctx = nfs_fc2context(fc);
|
||||||
root_ctx = nfs_fc2context(root_fc);
|
root_ctx = nfs_fc2context(root_fc);
|
||||||
root_ctx->internal = true;
|
root_ctx->internal = true;
|
||||||
root_ctx->server = server;
|
root_ctx->server = server;
|
||||||
|
|
||||||
|
if (ctx->fscache_uniq) {
|
||||||
|
len = strlen(ctx->fscache_uniq);
|
||||||
|
param_fsc.size = len;
|
||||||
|
param_fsc.string = kmemdup_nul(ctx->fscache_uniq, len, GFP_KERNEL);
|
||||||
|
if (param_fsc.string == NULL) {
|
||||||
|
put_fs_context(root_fc);
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
ret = vfs_parse_fs_param(root_fc, ¶m_fsc);
|
||||||
|
kfree(param_fsc.string);
|
||||||
|
if (ret < 0) {
|
||||||
|
put_fs_context(root_fc);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
/* We leave export_path unset as it's not used to find the root. */
|
/* We leave export_path unset as it's not used to find the root. */
|
||||||
|
|
||||||
len = strlen(hostname) + 5;
|
len = strlen(hostname) + 5;
|
||||||
|
|
Loading…
Reference in a new issue