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

Commit 550f5747 authored by Trond Myklebust's avatar Trond Myklebust
Browse files

NFSv4: Ensure that we recover from the OPEN + OPEN_CONFIRM BAD_STATEID race



 If the server is in the unconfirmed OPEN state for a given open owner
 and receives a second OPEN for the same open owner, it will cancel the
 state of the first request and set up an OPEN_CONFIRM for the second.

 This can cause a race that is discussed in rfc3530 on page 181.

 The following patch allows the client to recover by retrying the
 original open request.

 Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent b8e5c4c2
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -785,6 +785,16 @@ static struct nfs4_state *nfs4_do_open(struct inode *dir, struct dentry *dentry,
			exception.retry = 1;
			continue;
		}
		/*
		 * BAD_STATEID on OPEN means that the server cancelled our
		 * state before it received the OPEN_CONFIRM.
		 * Recover by retrying the request as per the discussion
		 * on Page 181 of RFC3530.
		 */
		if (status == -NFS4ERR_BAD_STATEID) {
			exception.retry = 1;
			continue;
		}
		res = ERR_PTR(nfs4_handle_exception(NFS_SERVER(dir),
					status, &exception));
	} while (exception.retry);