Commit 1f70ef96 authored by Alexey Khoroshilov's avatar Alexey Khoroshilov Committed by Trond Myklebust

NFS: add checks for returned value of try_module_get()

There is a couple of places in client code where returned value
of try_module_get() is ignored. As a result there is a small chance
to premature unload module because of unbalanced refcounting.

The patch adds error handling in that places.

Found by Linux Driver Verification project (linuxtesting.org).
Signed-off-by: default avatarAlexey Khoroshilov <khoroshilov@ispras.ru>
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@primarydata.com>
parent 411a99ad
...@@ -110,8 +110,8 @@ struct nfs_subversion *get_nfs_version(unsigned int version) ...@@ -110,8 +110,8 @@ struct nfs_subversion *get_nfs_version(unsigned int version)
mutex_unlock(&nfs_version_mutex); mutex_unlock(&nfs_version_mutex);
} }
if (!IS_ERR(nfs)) if (!IS_ERR(nfs) && !try_module_get(nfs->owner))
try_module_get(nfs->owner); return ERR_PTR(-EAGAIN);
return nfs; return nfs;
} }
...@@ -158,7 +158,8 @@ struct nfs_client *nfs_alloc_client(const struct nfs_client_initdata *cl_init) ...@@ -158,7 +158,8 @@ struct nfs_client *nfs_alloc_client(const struct nfs_client_initdata *cl_init)
goto error_0; goto error_0;
clp->cl_nfs_mod = cl_init->nfs_mod; clp->cl_nfs_mod = cl_init->nfs_mod;
try_module_get(clp->cl_nfs_mod->owner); if (!try_module_get(clp->cl_nfs_mod->owner))
goto error_dealloc;
clp->rpc_ops = clp->cl_nfs_mod->rpc_ops; clp->rpc_ops = clp->cl_nfs_mod->rpc_ops;
...@@ -190,6 +191,7 @@ struct nfs_client *nfs_alloc_client(const struct nfs_client_initdata *cl_init) ...@@ -190,6 +191,7 @@ struct nfs_client *nfs_alloc_client(const struct nfs_client_initdata *cl_init)
error_cleanup: error_cleanup:
put_nfs_version(clp->cl_nfs_mod); put_nfs_version(clp->cl_nfs_mod);
error_dealloc:
kfree(clp); kfree(clp);
error_0: error_0:
return ERR_PTR(err); return ERR_PTR(err);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment