forked from Minki/linux
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
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user