diff options
author | Dan Carpenter <dan.carpenter@oracle.com> | 2019-12-04 10:59:36 +0300 |
---|---|---|
committer | J. Bruce Fields <bfields@redhat.com> | 2019-12-09 19:44:07 +0300 |
commit | 5277a79e2dee458f0185e4ebde1cd4e128f014e9 (patch) | |
tree | e3a0114a1f3d6cf6e50f1c8f11c441c40ae1216a /fs | |
parent | ce0887ac96d35c7105090e166bb0807dc0a0e838 (diff) | |
download | linux-5277a79e2dee458f0185e4ebde1cd4e128f014e9.tar.xz |
nfsd: unlock on error in manage_cpntf_state()
We are holding the "nn->s2s_cp_lock" so we can't return directly
without unlocking first.
Fixes: f3dee17721a0 ("NFSD check stateids against copy stateids")
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/nfsd/nfs4state.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index 296765e693d0..390ad454a229 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c @@ -5695,13 +5695,16 @@ __be32 manage_cpntf_state(struct nfsd_net *nn, stateid_t *st, if (cps_t) { state = container_of(cps_t, struct nfs4_cpntf_state, cp_stateid); - if (state->cp_stateid.sc_type != NFS4_COPYNOTIFY_STID) - return nfserr_bad_stateid; + if (state->cp_stateid.sc_type != NFS4_COPYNOTIFY_STID) { + state = NULL; + goto unlock; + } if (!clp) refcount_inc(&state->cp_stateid.sc_count); else _free_cpntf_state_locked(nn, state); } +unlock: spin_unlock(&nn->s2s_cp_lock); if (!state) return nfserr_bad_stateid; |