From: J. Bruce Fields 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 Signed-off-by: Neil Brown Signed-off-by: Andrew Morton --- fs/nfsd/nfs4state.c | 24 +++++++++++------------- 1 files changed, 11 insertions(+), 13 deletions(-) diff -puN fs/nfsd/nfs4state.c~nfsd4-no-replays-on-unconfirmed-owners fs/nfsd/nfs4state.c --- 25/fs/nfsd/nfs4state.c~nfsd4-no-replays-on-unconfirmed-owners Fri Jan 13 17:54:24 2006 +++ 25-akpm/fs/nfsd/nfs4state.c Fri Jan 13 17:54:24 2006 @@ -1466,8 +1466,16 @@ nfsd4_process_open1(struct nfsd4_open *o 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 { @@ -1481,19 +1489,9 @@ nfsd4_process_open1(struct nfsd4_open *o " 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. _