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

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
...@@ -785,6 +785,16 @@ static struct nfs4_state *nfs4_do_open(struct inode *dir, struct dentry *dentry, ...@@ -785,6 +785,16 @@ static struct nfs4_state *nfs4_do_open(struct inode *dir, struct dentry *dentry,
exception.retry = 1; exception.retry = 1;
continue; 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), res = ERR_PTR(nfs4_handle_exception(NFS_SERVER(dir),
status, &exception)); status, &exception));
} while (exception.retry); } while (exception.retry);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment