NFS Client Bugfixes for Linux 5.6-rc5
Fixes:
- Ensure the fs_context has the correct fs_type when mounting and submounting
- Fix leaking of ctx->nfs_server.hostname
- Add minor version to fscache key to prevent collisions
-----BEGIN PGP SIGNATURE-----
iQIzBAABCAAdFiEEnZ5MQTpR7cLU7KEp18tUv7ClQOsFAl5r+QkACgkQ18tUv7Cl
QOtq4Q/+Oo707rb3N7DrPikUARB8D7FMTs/m/+xSPNm2DSllImIXJUdckqaoZkwc
DwBMLw+ZDvHtcNytytJQOWJNp9LGjHpZ20g0TLr2p2/JRrQyGgpc0FxTJONwA5Pp
zU6MSgqqfMZ5nLgxpMKsqoPNzO45sS8SKi2I6yZIupLZlsZOzF8L1wL/zc6gJvv8
71UGrSId9mEMKCrE8EQRx7etct5VPuP+pXfDGz4oaI1tdEmfmx3FoJlzZA1/Pf90
YSHdGZb7mR3LFkFRDlnh6NFHWU+yE+b5iWCt32ifO8pCN/CyIUvBxQblx4VLA47H
6S5nrYA96zRcQwhh9B/8yWLiqqxXo2hNl574uBJL/iDqSKSmkEBxZmCbE3aFEGa8
ClWlF6T5z4dlcAlKWXQkn3EXBHzL5+Opev5dArMhqNkr55g4z9Opsa6sc0ZWdywf
h/rSM8bHn9SNYkCGFHQ1MjAn6eNU0vVQ/s9DhM2xdtyfyTQOOHx5yA/KF6aGG5oQ
3mlVEJCEfsBKyWWjHhq3e/7ezgLlKRRlauxdLgjmKy+PmtlY6mGii0eF601e9OSL
RvK7I5/9spbcYmkyyQs0BxitrDZObyhxk31hgNrUMlN/JJrhPhKiyll8/Z7Z4sq6
QP6T/Vfn2FORA3ZAMtMH6V/ZOeiXUZjOkBRVWArIrPwOBJn/EQY=
=3DDn
-----END PGP SIGNATURE-----
Merge tag 'nfs-for-5.6-3' of git://git.linux-nfs.org/projects/anna/linux-nfs
Pull NFS client bugfixes from Anna Schumaker:
"These are mostly fscontext fixes, but there is also one that fixes
collisions seen in fscache:
- Ensure the fs_context has the correct fs_type when mounting and
submounting
- Fix leaking of ctx->nfs_server.hostname
- Add minor version to fscache key to prevent collisions"
* tag 'nfs-for-5.6-3' of git://git.linux-nfs.org/projects/anna/linux-nfs:
nfs: add minor version to nfs_server_key for fscache
NFS: Fix leak of ctx->nfs_server.hostname
NFS: Don't hard-code the fs_type when submounting
NFS: Ensure the fs_context has the correct fs_type before mounting
This commit is contained in:
commit
b0ea262a23
5 changed files with 13 additions and 2 deletions
|
|
@ -153,6 +153,7 @@ struct nfs_client *nfs_alloc_client(const struct nfs_client_initdata *cl_init)
|
|||
if ((clp = kzalloc(sizeof(*clp), GFP_KERNEL)) == NULL)
|
||||
goto error_0;
|
||||
|
||||
clp->cl_minorversion = cl_init->minorversion;
|
||||
clp->cl_nfs_mod = cl_init->nfs_mod;
|
||||
if (!try_module_get(clp->cl_nfs_mod->owner))
|
||||
goto error_dealloc;
|
||||
|
|
|
|||
|
|
@ -832,6 +832,8 @@ static int nfs_parse_source(struct fs_context *fc,
|
|||
if (len > maxnamlen)
|
||||
goto out_hostname;
|
||||
|
||||
kfree(ctx->nfs_server.hostname);
|
||||
|
||||
/* N.B. caller will free nfs_server.hostname in all cases */
|
||||
ctx->nfs_server.hostname = kmemdup_nul(dev_name, len, GFP_KERNEL);
|
||||
if (!ctx->nfs_server.hostname)
|
||||
|
|
@ -1240,6 +1242,13 @@ static int nfs_fs_context_validate(struct fs_context *fc)
|
|||
}
|
||||
ctx->nfs_mod = nfs_mod;
|
||||
}
|
||||
|
||||
/* Ensure the filesystem context has the correct fs_type */
|
||||
if (fc->fs_type != ctx->nfs_mod->nfs_fs) {
|
||||
module_put(fc->fs_type->owner);
|
||||
__module_get(ctx->nfs_mod->nfs_fs->owner);
|
||||
fc->fs_type = ctx->nfs_mod->nfs_fs;
|
||||
}
|
||||
return 0;
|
||||
|
||||
out_no_device_name:
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@ static DEFINE_SPINLOCK(nfs_fscache_keys_lock);
|
|||
struct nfs_server_key {
|
||||
struct {
|
||||
uint16_t nfsversion; /* NFS protocol version */
|
||||
uint32_t minorversion; /* NFSv4 minor version */
|
||||
uint16_t family; /* address family */
|
||||
__be16 port; /* IP port */
|
||||
} hdr;
|
||||
|
|
@ -55,6 +56,7 @@ void nfs_fscache_get_client_cookie(struct nfs_client *clp)
|
|||
|
||||
memset(&key, 0, sizeof(key));
|
||||
key.hdr.nfsversion = clp->rpc_ops->version;
|
||||
key.hdr.minorversion = clp->cl_minorversion;
|
||||
key.hdr.family = clp->cl_addr.ss_family;
|
||||
|
||||
switch (clp->cl_addr.ss_family) {
|
||||
|
|
|
|||
|
|
@ -153,7 +153,7 @@ struct vfsmount *nfs_d_automount(struct path *path)
|
|||
/* Open a new filesystem context, transferring parameters from the
|
||||
* parent superblock, including the network namespace.
|
||||
*/
|
||||
fc = fs_context_for_submount(&nfs_fs_type, path->dentry);
|
||||
fc = fs_context_for_submount(path->mnt->mnt_sb->s_type, path->dentry);
|
||||
if (IS_ERR(fc))
|
||||
return ERR_CAST(fc);
|
||||
|
||||
|
|
|
|||
|
|
@ -216,7 +216,6 @@ struct nfs_client *nfs4_alloc_client(const struct nfs_client_initdata *cl_init)
|
|||
INIT_LIST_HEAD(&clp->cl_ds_clients);
|
||||
rpc_init_wait_queue(&clp->cl_rpcwaitq, "NFS client");
|
||||
clp->cl_state = 1 << NFS4CLNT_LEASE_EXPIRED;
|
||||
clp->cl_minorversion = cl_init->minorversion;
|
||||
clp->cl_mvops = nfs_v4_minor_ops[cl_init->minorversion];
|
||||
clp->cl_mig_gen = 1;
|
||||
#if IS_ENABLED(CONFIG_NFS_V4_1)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue