NFS: Implement get_nfs_version()

This is a pair for put_nfs_version(), and is used for incrementing the
reference count on the nfs version module. I also updated the callers I
could find who had this hardcoded up until now.

Signed-off-by: Anna Schumaker <anna.schumaker@oracle.com>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
This commit is contained in:
Anna Schumaker 2024-10-01 16:33:44 -04:00 committed by Trond Myklebust
parent 3c91e4b7ae
commit 288d7224db
4 changed files with 12 additions and 5 deletions

View File

@ -100,12 +100,18 @@ struct nfs_subversion *find_nfs_version(unsigned int version)
if (!nfs) if (!nfs)
return ERR_PTR(-EPROTONOSUPPORT); return ERR_PTR(-EPROTONOSUPPORT);
if (!try_module_get(nfs->owner)) if (!get_nfs_version(nfs))
return ERR_PTR(-EAGAIN); return ERR_PTR(-EAGAIN);
return nfs; return nfs;
} }
int get_nfs_version(struct nfs_subversion *nfs)
{
return try_module_get(nfs->owner);
}
EXPORT_SYMBOL_GPL(get_nfs_version);
void put_nfs_version(struct nfs_subversion *nfs) void put_nfs_version(struct nfs_subversion *nfs)
{ {
module_put(nfs->owner); module_put(nfs->owner);
@ -149,7 +155,7 @@ struct nfs_client *nfs_alloc_client(const struct nfs_client_initdata *cl_init)
clp->cl_minorversion = cl_init->minorversion; clp->cl_minorversion = cl_init->minorversion;
clp->cl_nfs_mod = cl_init->nfs_mod; clp->cl_nfs_mod = cl_init->nfs_mod;
if (!try_module_get(clp->cl_nfs_mod->owner)) if (!get_nfs_version(clp->cl_nfs_mod))
goto error_dealloc; goto error_dealloc;
clp->rpc_ops = clp->cl_nfs_mod->rpc_ops; clp->rpc_ops = clp->cl_nfs_mod->rpc_ops;

View File

@ -1541,7 +1541,7 @@ static int nfs_fs_context_dup(struct fs_context *fc, struct fs_context *src_fc)
} }
nfs_copy_fh(ctx->mntfh, src->mntfh); nfs_copy_fh(ctx->mntfh, src->mntfh);
__module_get(ctx->nfs_mod->owner); get_nfs_version(ctx->nfs_mod);
ctx->client_address = NULL; ctx->client_address = NULL;
ctx->mount_server.hostname = NULL; ctx->mount_server.hostname = NULL;
ctx->nfs_server.export_path = NULL; ctx->nfs_server.export_path = NULL;
@ -1633,7 +1633,7 @@ static int nfs_init_fs_context(struct fs_context *fc)
} }
ctx->nfs_mod = nfss->nfs_client->cl_nfs_mod; ctx->nfs_mod = nfss->nfs_client->cl_nfs_mod;
__module_get(ctx->nfs_mod->owner); get_nfs_version(ctx->nfs_mod);
} else { } else {
/* defaults */ /* defaults */
ctx->timeo = NFS_UNSPEC_TIMEO; ctx->timeo = NFS_UNSPEC_TIMEO;

View File

@ -182,7 +182,7 @@ struct vfsmount *nfs_d_automount(struct path *path)
ctx->version = client->rpc_ops->version; ctx->version = client->rpc_ops->version;
ctx->minorversion = client->cl_minorversion; ctx->minorversion = client->cl_minorversion;
ctx->nfs_mod = client->cl_nfs_mod; ctx->nfs_mod = client->cl_nfs_mod;
__module_get(ctx->nfs_mod->owner); get_nfs_version(ctx->nfs_mod);
ret = client->rpc_ops->submount(fc, server); ret = client->rpc_ops->submount(fc, server);
if (ret < 0) { if (ret < 0) {

View File

@ -22,6 +22,7 @@ struct nfs_subversion {
}; };
struct nfs_subversion *find_nfs_version(unsigned int); struct nfs_subversion *find_nfs_version(unsigned int);
int get_nfs_version(struct nfs_subversion *);
void put_nfs_version(struct nfs_subversion *); void put_nfs_version(struct nfs_subversion *);
void register_nfs_version(struct nfs_subversion *); void register_nfs_version(struct nfs_subversion *);
void unregister_nfs_version(struct nfs_subversion *); void unregister_nfs_version(struct nfs_subversion *);