Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ae8b6253 authored by J. Bruce Fields's avatar J. Bruce Fields Committed by Linus Torvalds
Browse files

[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: default avatarJ. Bruce Fields <bfields@citi.umich.edu>
Signed-off-by: default avatarNeil Brown <neilb@suse.de>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent a525825d
Loading
Loading
Loading
Loading
+11 −13
Original line number Diff line number Diff line
@@ -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.