summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorManuel Bentele2020-11-09 07:16:07 +0100
committerManuel Bentele2020-11-09 07:16:07 +0100
commitdb5a93a43fea2aa3c3bbaf8c48d238e60d834676 (patch)
tree83f0098e32e5b3641567480bea07ccdc978d61fb
parent[KERNEL]: change probing logic to select first available server (diff)
downloaddnbd3-db5a93a43fea2aa3c3bbaf8c48d238e60d834676.tar.gz
dnbd3-db5a93a43fea2aa3c3bbaf8c48d238e60d834676.tar.xz
dnbd3-db5a93a43fea2aa3c3bbaf8c48d238e60d834676.zip
[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.
-rw-r--r--src/kernel/blk.c3
1 files changed, 3 insertions, 0 deletions
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;