diff options
author | sr | 2013-07-18 13:47:01 +0200 |
---|---|---|
committer | sr | 2013-07-18 13:47:01 +0200 |
commit | f2efd7f97baf6ab5d590ac7642bbf7317f8c47ed (patch) | |
tree | 7ed2e5f2ae802742ff59a7d73e6570054df39d78 /src/kernel/blk.c | |
parent | Remove all glib dependencies from server (diff) | |
download | dnbd3-f2efd7f97baf6ab5d590ac7642bbf7317f8c47ed.tar.gz dnbd3-f2efd7f97baf6ab5d590ac7642bbf7317f8c47ed.tar.xz dnbd3-f2efd7f97baf6ab5d590ac7642bbf7317f8c47ed.zip |
kernel module changes
Diffstat (limited to 'src/kernel/blk.c')
-rw-r--r-- | src/kernel/blk.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/src/kernel/blk.c b/src/kernel/blk.c index 938a0e8..2bb70de 100644 --- a/src/kernel/blk.c +++ b/src/kernel/blk.c @@ -106,6 +106,11 @@ int dnbd3_blk_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, u dnbd3_ioctl_t *msg = NULL; //unsigned long irqflags; + while (dev->disconnecting) + { + // do nothing + } + if (arg != 0) { msg = kmalloc(sizeof(*msg), GFP_KERNEL); @@ -232,6 +237,7 @@ void dnbd3_blk_request(struct request_queue *q) { struct request *req; dnbd3_device_t *dev; + unsigned long flags; while ((req = blk_fetch_request(q)) != NULL) { @@ -261,7 +267,9 @@ void dnbd3_blk_request(struct request_queue *q) continue; } + spin_lock_irqsave(&dev->blk_lock, flags); list_add_tail(&req->queuelist, &dev->request_queue_send); + spin_unlock_irqrestore(&dev->blk_lock, flags); spin_unlock_irq(q->queue_lock); wake_up(&dev->process_queue_send); spin_lock_irq(q->queue_lock); @@ -276,7 +284,7 @@ void dnbd3_blk_fail_all_requests(dnbd3_device_t *dev) struct list_head local_copy; int dup; INIT_LIST_HEAD(&local_copy); - spin_lock_irq(&dev->blk_lock); + spin_lock_irqsave(&dev->blk_lock, flags); while (!list_empty(&dev->request_queue_receive)) { list_for_each_entry_safe(blk_request, tmp_request, &dev->request_queue_receive, queuelist) @@ -313,7 +321,7 @@ void dnbd3_blk_fail_all_requests(dnbd3_device_t *dev) if (!dup) list_add(&blk_request->queuelist, &local_copy); } } - spin_unlock_irq(&dev->blk_lock); + spin_unlock_irqrestore(&dev->blk_lock, flags); list_for_each_entry_safe(blk_request, tmp_request, &local_copy, queuelist) { list_del_init(&blk_request->queuelist); |