Patch "nbd: handle interrupted sendmsg with a sndtimeo set" has been added to the 4.13-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
nbd: handle interrupted sendmsg with a sndtimeo set
to the 4.13-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
nbd-handle-interrupted-sendmsg-with-a-sndtimeo-set.patch
and it can be found in the queue-4.13 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
32e67a3a06b88904155170560b7a63d372b320bdMon Sep 17 00:00:00 2001
From: Josef Bacik <[email protected]>
Date: Tue, 24 Oct 2017 15:57:18 -0400
Subject: nbd: handle interrupted sendmsg with a sndtimeo set
From: Josef Bacik <[email protected]>
commit 32e67a3a06b88904155170560b7a63d372b320bd upstream.
If you do not set sk_sndtimeo you will get -ERESTARTSYS if there is a pending signal when you enter sendmsg, which we handle properly. However if you set a timeout for your commands we'll set sk_sndtimeo to that timeout, which means that sendmsg will start returning -EINTR instead of -ERESTARTSYS. Fix this by checking either cases and doing the correct thing.
--- drivers/block/nbd.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)
drivers/block/nbd.c +11 -2
@@ -386,6 +386,15 @@ static int sock_xmit(struct nbd_device *return result; } +/* +* Different settings for sk->sk_sndtimeo can result in different return values +* if there is a signal pending when we enter sendmsg, because reasons? +*/ +static inline int was_interrupted (int result) +{ +return result == -ERESTARTSYS || result == -EINTR ; +} +/* always call with the tx_lock held */ static int nbd_send_cmd (struct nbd_device *nbd,struct nbd_cmd *cmd,int index) {
@@ -458,7 +467,7 @@ static int nbd_send_cmd(struct nbd_devic result =sock_xmit (nbd, index,1 , &from, (type ==NBD_CMD_WRITE ) ?MSG_MORE :0 , &sent);if (result <=0 ) { -if (result == -ERESTARTSYS ) { +if (was_interrupted (result)) {/* If we havne't sent anything we can just return BUSY, * however if we have sent something we need to make * sure we only allow this req to be sent until we are
@@ -502,7 +511,7 @@ send_pages: } result =sock_xmit (nbd, index,1 , &from, flags, &sent);if (result <=0 ) { -if (result == -ERESTARTSYS ) { +if (was_interrupted (result)) {/* We've already sent the header, we * have no choice but to set pending and * return BUSY.
Patches currently in stable-queue which might be from [email protected] are
queue-4.13/nbd-handle-interrupted-sendmsg-with-a-sndtimeo-set.patch