diff options
author | sr | 2012-08-25 18:59:12 +0200 |
---|---|---|
committer | sr | 2012-08-25 18:59:12 +0200 |
commit | cbf9d922fdbe19e65e8710dd72d6832e35144fc5 (patch) | |
tree | 19e09a155d2492ef43d8e708c3c5a979c033ebb4 /src/kernel/blk.c | |
parent | [*] Fix bug in serializer_get_* (diff) | |
download | dnbd3-cbf9d922fdbe19e65e8710dd72d6832e35144fc5.tar.gz dnbd3-cbf9d922fdbe19e65e8710dd72d6832e35144fc5.tar.xz dnbd3-cbf9d922fdbe19e65e8710dd72d6832e35144fc5.zip |
[KERNEL] Make it possible to receive push messages by the server
Diffstat (limited to 'src/kernel/blk.c')
-rw-r--r-- | src/kernel/blk.c | 42 |
1 files changed, 30 insertions, 12 deletions
diff --git a/src/kernel/blk.c b/src/kernel/blk.c index b0b0912..f8ef4fd 100644 --- a/src/kernel/blk.c +++ b/src/kernel/blk.c @@ -159,9 +159,10 @@ int dnbd3_blk_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd, u break; case IOCTL_CLOSE: - set_capacity(dev->disk, 0); + dnbd3_blk_fail_all_requests(dev); result = dnbd3_net_disconnect(dev); dnbd3_blk_fail_all_requests(dev); + set_capacity(dev->disk, 0); if (dev->imgname) { kfree(dev->imgname); @@ -240,24 +241,41 @@ void dnbd3_blk_fail_all_requests(dnbd3_device_t *dev) int dup; INIT_LIST_HEAD(&local_copy); spin_lock_irq(&dev->blk_lock); - list_for_each_entry_safe(blk_request, tmp_request, &dev->request_queue_receive, queuelist) + while (!list_empty(&dev->request_queue_receive)) { - list_del_init(&blk_request->queuelist); - list_add(&blk_request->queuelist, &local_copy); + list_for_each_entry_safe(blk_request, tmp_request, &dev->request_queue_receive, queuelist) + { + list_del_init(&blk_request->queuelist); + dup = 0; + list_for_each_entry_safe(blk_request2, tmp_request2, &local_copy, queuelist) + { + if (blk_request == blk_request2) + { + printk("WARNING: Request is in both lists!\n"); + dup = 1; + break; + } + } + if (!dup) list_add(&blk_request->queuelist, &local_copy); + } } - list_for_each_entry_safe(blk_request, tmp_request, &dev->request_queue_send, queuelist) + while (!list_empty(&dev->request_queue_send)) { - list_del_init(&blk_request->queuelist); - dup = 0; - list_for_each_entry_safe(blk_request2, tmp_request2, &local_copy, queuelist) + list_for_each_entry_safe(blk_request, tmp_request, &dev->request_queue_send, queuelist) { - if (blk_request == blk_request2) + list_del_init(&blk_request->queuelist); + dup = 0; + list_for_each_entry_safe(blk_request2, tmp_request2, &local_copy, queuelist) { - printk("WARNING: Request is in both lists!\n"); - dup = 1; + if (blk_request == blk_request2) + { + printk("WARNING: Request is in both lists!\n"); + dup = 1; + break; + } } + if (!dup) list_add(&blk_request->queuelist, &local_copy); } - if (!dup) list_add(&blk_request->queuelist, &local_copy); } spin_unlock_irq(&dev->blk_lock); list_for_each_entry_safe(blk_request, tmp_request, &local_copy, queuelist) |