summaryrefslogtreecommitdiffstats
path: root/src/kernel/blk.c
diff options
context:
space:
mode:
authorsr2012-08-25 18:59:12 +0200
committersr2012-08-25 18:59:12 +0200
commitcbf9d922fdbe19e65e8710dd72d6832e35144fc5 (patch)
tree19e09a155d2492ef43d8e708c3c5a979c033ebb4 /src/kernel/blk.c
parent[*] Fix bug in serializer_get_* (diff)
downloaddnbd3-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.c42
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)