Patch "nbd: Fix hung when signal interrupts nbd_start_device_ioctl()" has been added to the 5.15-stable tree

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

 



This is a note to let you know that I've just added the patch titled

    nbd: Fix hung when signal interrupts nbd_start_device_ioctl()

to the 5.15-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-fix-hung-when-signal-interrupts-nbd_start_device.patch
and it can be found in the queue-5.15 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 9c8215d1c2ee24dba0fef37a3da1145ea578b8b2
Author: Shigeru Yoshida <syoshida@xxxxxxxxxx>
Date:   Thu Sep 8 01:35:02 2022 +0900

    nbd: Fix hung when signal interrupts nbd_start_device_ioctl()
    
    [ Upstream commit 1de7c3cf48fc41cd95adb12bd1ea9033a917798a ]
    
    syzbot reported hung task [1].  The following program is a simplified
    version of the reproducer:
    
    int main(void)
    {
            int sv[2], fd;
    
            if (socketpair(AF_UNIX, SOCK_STREAM, 0, sv) < 0)
                    return 1;
            if ((fd = open("/dev/nbd0", 0)) < 0)
                    return 1;
            if (ioctl(fd, NBD_SET_SIZE_BLOCKS, 0x81) < 0)
                    return 1;
            if (ioctl(fd, NBD_SET_SOCK, sv[0]) < 0)
                    return 1;
            if (ioctl(fd, NBD_DO_IT) < 0)
                    return 1;
            return 0;
    }
    
    When signal interrupt nbd_start_device_ioctl() waiting the condition
    atomic_read(&config->recv_threads) == 0, the task can hung because it
    waits the completion of the inflight IOs.
    
    This patch fixes the issue by clearing queue, not just shutdown, when
    signal interrupt nbd_start_device_ioctl().
    
    Link: https://syzkaller.appspot.com/bug?id=7d89a3ffacd2b83fdd39549bc4d8e0a89ef21239 [1]
    Reported-by: syzbot+38e6c55d4969a14c1534@xxxxxxxxxxxxxxxxxxxxxxxxx
    Signed-off-by: Shigeru Yoshida <syoshida@xxxxxxxxxx>
    Reviewed-by: Josef Bacik <josef@xxxxxxxxxxxxxx>
    Link: https://lore.kernel.org/r/20220907163502.577561-1-syoshida@xxxxxxxxxx
    Signed-off-by: Jens Axboe <axboe@xxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c
index b391ca062add..ec2b5dd2ce4a 100644
--- a/drivers/block/nbd.c
+++ b/drivers/block/nbd.c
@@ -1351,10 +1351,12 @@ static int nbd_start_device_ioctl(struct nbd_device *nbd, struct block_device *b
 	mutex_unlock(&nbd->config_lock);
 	ret = wait_event_interruptible(config->recv_wq,
 					 atomic_read(&config->recv_threads) == 0);
-	if (ret)
+	if (ret) {
 		sock_shutdown(nbd);
-	flush_workqueue(nbd->recv_workq);
+		nbd_clear_que(nbd);
+	}
 
+	flush_workqueue(nbd->recv_workq);
 	mutex_lock(&nbd->config_lock);
 	nbd_bdev_reset(bdev);
 	/* user requested, ignore socket errors */



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux