From cbf9d922fdbe19e65e8710dd72d6832e35144fc5 Mon Sep 17 00:00:00 2001 From: sr Date: Sat, 25 Aug 2012 18:59:12 +0200 Subject: [KERNEL] Make it possible to receive push messages by the server --- src/kernel/blk.c | 42 ++++++++++++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 12 deletions(-) (limited to 'src/kernel/blk.c') 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) -- cgit v1.2.3-55-g7522