mirror of
https://github.com/torvalds/linux.git
synced 2026-05-25 23:52:08 +02:00
nfsd: nfserr_jukebox in nlm_fopen should lead to a retry
When v3 NLM request finds a conflicting delegation, it triggers
a delegation recall and nfsd_open fails with EAGAIN. nfsd_open
then translates EAGAIN into nfserr_jukebox. In nlm_fopen, instead
of returning nlm_failed for when there is a conflicting delegation,
drop this NLM request so that the client retries. Once delegation
is recalled and if a local lock is claimed, a retry would lead to
nfsd returning a nlm_lck_blocked error or a successful nlm lock.
Fixes: d343fce148 ("[PATCH] knfsd: Allow lockd to drop replies as appropriate")
Cc: stable@vger.kernel.org # v6.6
Signed-off-by: Olga Kornievskaia <okorniev@redhat.com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
This commit is contained in:
parent
8ddd06be9a
commit
a082e4b4d0
|
|
@ -57,6 +57,21 @@ nlm_fopen(struct svc_rqst *rqstp, struct nfs_fh *f, struct file **filp,
|
|||
switch (nfserr) {
|
||||
case nfs_ok:
|
||||
return 0;
|
||||
case nfserr_jukebox:
|
||||
/* this error can indicate a presence of a conflicting
|
||||
* delegation to an NLM lock request. Options are:
|
||||
* (1) For now, drop this request and make the client
|
||||
* retry. When delegation is returned, client's lock retry
|
||||
* will complete.
|
||||
* (2) NLM4_DENIED as per "spec" signals to the client
|
||||
* that the lock is unavailable now but client can retry.
|
||||
* Linux client implementation does not. It treats
|
||||
* NLM4_DENIED same as NLM4_FAILED and errors the request.
|
||||
* (3) For the future, treat this as blocked lock and try
|
||||
* to callback when the delegation is returned but might
|
||||
* not have a proper lock request to block on.
|
||||
*/
|
||||
fallthrough;
|
||||
case nfserr_dropit:
|
||||
return nlm_drop_reply;
|
||||
case nfserr_stale:
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user