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: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
b8e5c4c297
commit
550f57470c
1 changed files with 10 additions and 0 deletions
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue