From: J. Bruce Fields Date: Thu, 19 Jan 2006 01:43:32 +0000 (-0800) Subject: [PATCH] nfsd4: no replays on unconfirmed owners X-Git-Tag: v2.6.16-rc2~291 X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ae8b625313db4dd4b060962c2a02f3a2837ca61b;p=linux-2.6 [PATCH] nfsd4: no replays on unconfirmed owners 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 Signed-off-by: Linus Torvalds --- diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index e13d2233ff..dc792b6b45 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c @@ -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 { @@ -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.