From db5a93a43fea2aa3c3bbaf8c48d238e60d834676 Mon Sep 17 00:00:00 2001 From: Manuel Bentele Date: Mon, 9 Nov 2020 07:16:07 +0100 Subject: [KERNEL] protect access to server list if alt server is added/removed This patch locks the protecting spinlock of the DNBD3 device's new server list. Otherwise a race condition between ioctl ADD_SRV/REM_SRV (process context) and dnbd3 discover thread would be possible. --- src/kernel/blk.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/kernel/blk.c b/src/kernel/blk.c index afdeea8..7e043c0 100644 --- a/src/kernel/blk.c +++ b/src/kernel/blk.c @@ -39,6 +39,7 @@ static int dnbd3_blk_ioctl(struct block_device *bdev, fmode_t mode, unsigned int struct request_queue *blk_queue = dev->disk->queue; char *imgname = NULL; dnbd3_ioctl_t *msg = NULL; + unsigned long irqflags; int i = 0; while (dev->disconnecting) { /* do nothing */ } @@ -193,9 +194,11 @@ static int dnbd3_blk_ioctl(struct block_device *bdev, fmode_t mode, unsigned int } else { + spin_lock_irqsave(&dev->blk_lock, irqflags); memcpy(&dev->new_servers[dev->new_servers_num].host, &msg->hosts[0], sizeof(msg->hosts[0])); dev->new_servers[dev->new_servers_num].failures = (cmd == IOCTL_ADD_SRV ? 0 : 1); // 0 = ADD, 1 = REM ++dev->new_servers_num; + spin_unlock_irqrestore(&dev->blk_lock, irqflags); result = 0; } break; -- cgit v1.2.3-55-g7522