Re: [PATCH 3/8] nfsd: when CB_SEQUENCE gets NFS4ERR_DELAY, release the slot

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 1/23/25 3:25 PM, Jeff Layton wrote:
RFC8881, 15.1.1.3 says this about NFS4ERR_DELAY:

"For any of a number of reasons, the replier could not process this
  operation in what was deemed a reasonable time. The client should wait
  and then try the request with a new slot and sequence value."

A little farther down, Section 15.1.1.3 says this:

"If NFS4ERR_DELAY is returned on a SEQUENCE operation, the request is
 retried in full with the SEQUENCE operation containing the same slot
 and sequence values."

And:

"If NFS4ERR_DELAY is returned on an operation other than the first in
 the request, the request when retried MUST contain a SEQUENCE operation
 that is different than the original one, with either the slot ID or the
 sequence value different from that in the original request."

My impression is that the slot needs to be held and used again only if
the server responded with NFS4ERR_DELAY on the SEQUENCE operation. If
the NFS4ERR_DELAY was the status of the 2nd or later operation in the
COMPOUND, then yes, a different slot, or the same slot with a bumped
sequence number, must be used.

The current code in nfsd4_cb_sequence_done() appears to be correct in
this regard.


This is CB_SEQUENCE, but I believe the same rule applies. Release the
slot before submitting the delayed RPC.

Fixes: 7ba6cad6c88f ("nfsd: New helper nfsd4_cb_sequence_done() for processing more cb errors")
Signed-off-by: Jeff Layton <jlayton@xxxxxxxxxx>
---
  fs/nfsd/nfs4callback.c | 1 +
  1 file changed, 1 insertion(+)

diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c
index bfc9de1fcb67b4f05ed2f7a28038cd8290809c17..c26ccb9485b95499fc908833a384d741e966a8db 100644
--- a/fs/nfsd/nfs4callback.c
+++ b/fs/nfsd/nfs4callback.c
@@ -1392,6 +1392,7 @@ static bool nfsd4_cb_sequence_done(struct rpc_task *task, struct nfsd4_callback
  		goto need_restart;
  	case -NFS4ERR_DELAY:
  		cb->cb_seq_status = 1;
+		nfsd41_cb_release_slot(cb);
  		if (!rpc_restart_call(task))
  			goto out;


--
Chuck Lever




[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux