svcrpc: sends on closed socket should stop immediately
svc_tcp_sendto sets XPT_CLOSE if we fail to transmit the entire reply. However, the XPT_CLOSE won't be acted on immediately. Meanwhile other threads could send further replies before the socket is really shut down. This can manifest as data corruption: for example, if a truncated read reply is followed by another rpc reply, that second reply will look to the client like further read data. Symptoms were data corruption preceded by svc_tcp_sendto logging something like kernel: rpc-srv/tcp: nfsd: sent only 963696 when sending 1048708 bytes - shutting down socket Cc: stable@vger.kernel.org Reported-by: Malahal Naineni <malahal@us.ibm.com> Tested-by: Malahal Naineni <malahal@us.ibm.com> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
This commit is contained in:
parent
be1e44441a
commit
f06f00a24d
@ -794,7 +794,8 @@ int svc_send(struct svc_rqst *rqstp)
|
|||||||
|
|
||||||
/* Grab mutex to serialize outgoing data. */
|
/* Grab mutex to serialize outgoing data. */
|
||||||
mutex_lock(&xprt->xpt_mutex);
|
mutex_lock(&xprt->xpt_mutex);
|
||||||
if (test_bit(XPT_DEAD, &xprt->xpt_flags))
|
if (test_bit(XPT_DEAD, &xprt->xpt_flags)
|
||||||
|
|| test_bit(XPT_CLOSE, &xprt->xpt_flags))
|
||||||
len = -ENOTCONN;
|
len = -ENOTCONN;
|
||||||
else
|
else
|
||||||
len = xprt->xpt_ops->xpo_sendto(rqstp);
|
len = xprt->xpt_ops->xpo_sendto(rqstp);
|
||||||
|
Loading…
Reference in New Issue
Block a user