NFS: disconnect before retrying NFSv4 requests over TCP
RFC3530 section 3.1.1 states an NFSv4 client MUST NOT send a request twice on the same connection unless it is the NULL procedure. Section 3.1.1 suggests that the client should disconnect and reconnect if it wants to retry a request. Implement this by adding an rpc_clnt flag that an ULP can use to specify that the underlying transport should be disconnected on a major timeout. The NFSv4 client asserts this new flag, and requests no retries after a minor retransmit timeout. Note that disconnecting on a retransmit is in general not safe to do if the RPC client does not reuse the TCP port number when reconnecting. See http://bugzilla.linux-nfs.org/show_bug.cgi?id=6 Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
committed by
Trond Myklebust
parent
a301b77771
commit
43d78ef2ba
@@ -735,6 +735,16 @@ void xprt_transmit(struct rpc_task *task)
|
||||
xprt_reset_majortimeo(req);
|
||||
/* Turn off autodisconnect */
|
||||
del_singleshot_timer_sync(&xprt->timer);
|
||||
} else {
|
||||
/* If all request bytes have been sent,
|
||||
* then we must be retransmitting this one */
|
||||
if (!req->rq_bytes_sent) {
|
||||
if (task->tk_client->cl_discrtry) {
|
||||
xprt_disconnect(xprt);
|
||||
task->tk_status = -ENOTCONN;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (!req->rq_bytes_sent)
|
||||
return;
|
||||
|
Reference in New Issue
Block a user