diff options
author | Dave Wysochanski <dwysocha@redhat.com> | 2017-04-27 16:45:15 +0200 |
---|---|---|
committer | Trond Myklebust <trond.myklebust@primarydata.com> | 2017-05-05 19:01:32 +0200 |
commit | 5c737cb29977896eb0f373d3adbcdea73b815808 (patch) | |
tree | ce7e35e6df011d9739dca0bfef786de0efbcf644 /fs/nfs | |
parent | NFSv4.1: RECLAIM_COMPLETE must handle NFS4ERR_CONN_NOT_BOUND_TO_SESSION (diff) | |
download | linux-5c737cb29977896eb0f373d3adbcdea73b815808.tar.xz linux-5c737cb29977896eb0f373d3adbcdea73b815808.zip |
Fix nfs_client refcounting if kmalloc fails in nfs4_proc_exchange_id and nfs4_proc_async_renew
If memory allocation fails for the callback data, we need to put the nfs_client
or we end up with an elevated refcount.
Signed-off-by: Dave Wysochanski <dwysocha@redhat.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Diffstat (limited to 'fs/nfs')
-rw-r--r-- | fs/nfs/nfs4proc.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 62fc8eed53cc..f48dfb7f3691 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -4807,8 +4807,10 @@ static int nfs4_proc_async_renew(struct nfs_client *clp, struct rpc_cred *cred, if (!atomic_inc_not_zero(&clp->cl_count)) return -EIO; data = kmalloc(sizeof(*data), GFP_NOFS); - if (data == NULL) + if (data == NULL) { + nfs_put_client(clp); return -ENOMEM; + } data->client = clp; data->timestamp = jiffies; return rpc_call_async(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT, @@ -7454,8 +7456,10 @@ static int _nfs4_proc_exchange_id(struct nfs_client *clp, struct rpc_cred *cred, return -EIO; calldata = kzalloc(sizeof(*calldata), GFP_NOFS); - if (!calldata) + if (!calldata) { + nfs_put_client(clp); return -ENOMEM; + } if (!xprt) nfs4_init_boot_verifier(clp, &verifier); |