Skip to content

Commit

Permalink
[PATCH] nfsd4: no replays on unconfirmed owners
Browse files Browse the repository at this point in the history
We shouldn't check for replays until after checking whether the open owner is
confirmed.  Clients are allowed to reuse openowners without bumping the seqid.

Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
Signed-off-by: Neil Brown <neilb@suse.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
  • Loading branch information
J. Bruce Fields authored and Linus Torvalds committed Jan 19, 2006
1 parent a525825 commit ae8b625
Showing 1 changed file with 11 additions and 13 deletions.
24 changes: 11 additions & 13 deletions fs/nfsd/nfs4state.c
Original file line number Diff line number Diff line change
Expand Up @@ -1465,8 +1465,16 @@ nfsd4_process_open1(struct nfsd4_open *open)
sop = find_openstateowner_str(strhashval, open);
if (sop) {
open->op_stateowner = sop;
/* check for replay */
if (open->op_seqid == sop->so_seqid - 1){
if (!sop->so_confirmed) {
/* Replace any unconfirmed stateowner without
* even checking for replays */
clp = sop->so_client;
release_stateowner(sop);
} else if (open->op_seqid == sop->so_seqid) {
/* normal case */
goto renew;
} else if (open->op_seqid == sop->so_seqid - 1) {
/* replay */
if (sop->so_replay.rp_buflen)
return NFSERR_REPLAY_ME;
else {
Expand All @@ -1480,19 +1488,9 @@ nfsd4_process_open1(struct nfsd4_open *open)
" replay with no replay cache\n");
goto renew;
}
} else if (sop->so_confirmed) {
if (open->op_seqid == sop->so_seqid)
goto renew;
} else {
status = nfserr_bad_seqid;
goto out;
} else {
/* If we get here, we received an OPEN for an
* unconfirmed nfs4_stateowner. Since the seqid's are
* different, purge the existing nfs4_stateowner, and
* instantiate a new one.
*/
clp = sop->so_client;
release_stateowner(sop);
}
} else {
/* nfs4_stateowner not found.
Expand Down

0 comments on commit ae8b625

Please sign in to comment.