diff options
author | J. Bruce Fields <bfields@redhat.com> | 2011-10-13 15:12:59 -0400 |
---|---|---|
committer | J. Bruce Fields <bfields@redhat.com> | 2011-10-17 17:33:57 -0400 |
commit | d29b20cd589128a599e5045d4effc2d7dbc388f5 (patch) | |
tree | 48794b614b23f4159f2edeef484b1ff9c93ffbd7 /fs/nfsd/nfs4proc.c | |
parent | bcf130f9dfbaccf91376a44b18f51ed8007840d6 (diff) | |
download | op-kernel-dev-d29b20cd589128a599e5045d4effc2d7dbc388f5.zip op-kernel-dev-d29b20cd589128a599e5045d4effc2d7dbc388f5.tar.gz |
nfsd4: clean up open owners on OPEN failure
If process_open1() creates a new open owner, but the open later fails,
the current code will leave the open owner around. It won't be on the
close_lru list, and the client isn't expected to send a CLOSE, so it
will hang around as long as the client does.
Similarly, if process_open1() removes an existing open owner from the
close lru, anticipating that an open owner that previously had no
associated stateid's now will, but the open subsequently fails, then
we'll again be left with the same leak.
Fix both problems.
Reported-by: Bryan Schumaker <bjschuma@netapp.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Diffstat (limited to 'fs/nfsd/nfs4proc.c')
-rw-r--r-- | fs/nfsd/nfs4proc.c | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c index 5b192a2..10b50d7 100644 --- a/fs/nfsd/nfs4proc.c +++ b/fs/nfsd/nfs4proc.c @@ -409,6 +409,7 @@ nfsd4_open(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, */ status = nfsd4_process_open2(rqstp, &cstate->current_fh, open); out: + nfsd4_cleanup_open_state(open, status); if (open->op_openowner) cstate->replay_owner = &open->op_openowner->oo_owner; else |