Skip to content

Commit

Permalink
dm: detect lost queue
Browse files Browse the repository at this point in the history
Detect and report buggy drivers that destroy their request_queue.

Signed-off-by: Alasdair G Kergon <agk@redhat.com>
Cc: Stefan Raspl <raspl@linux.vnet.ibm.com>
Cc: Jens Axboe <jens.axboe@oracle.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
  • Loading branch information
Alasdair G Kergon committed Oct 10, 2008
1 parent 5416090 commit 0c2322e
Showing 1 changed file with 23 additions and 3 deletions.
26 changes: 23 additions & 3 deletions drivers/md/dm-table.c
Original file line number Diff line number Diff line change
Expand Up @@ -482,6 +482,13 @@ void dm_set_device_limits(struct dm_target *ti, struct block_device *bdev)
{
struct request_queue *q = bdev_get_queue(bdev);
struct io_restrictions *rs = &ti->limits;
char b[BDEVNAME_SIZE];

if (unlikely(!q)) {
DMWARN("%s: Cannot set limits for nonexistent device %s",
dm_device_name(ti->table->md), bdevname(bdev, b));
return;
}

/*
* Combine the device limits low.
Expand Down Expand Up @@ -950,7 +957,14 @@ int dm_table_any_congested(struct dm_table *t, int bdi_bits)

list_for_each_entry(dd, devices, list) {
struct request_queue *q = bdev_get_queue(dd->dm_dev.bdev);
r |= bdi_congested(&q->backing_dev_info, bdi_bits);
char b[BDEVNAME_SIZE];

if (likely(q))
r |= bdi_congested(&q->backing_dev_info, bdi_bits);
else
DMWARN_LIMIT("%s: any_congested: nonexistent device %s",
dm_device_name(t->md),
bdevname(dd->dm_dev.bdev, b));
}

return r;
Expand All @@ -963,8 +977,14 @@ void dm_table_unplug_all(struct dm_table *t)

list_for_each_entry(dd, devices, list) {
struct request_queue *q = bdev_get_queue(dd->dm_dev.bdev);

blk_unplug(q);
char b[BDEVNAME_SIZE];

if (likely(q))
blk_unplug(q);
else
DMWARN_LIMIT("%s: Cannot unplug nonexistent device %s",
dm_device_name(t->md),
bdevname(dd->dm_dev.bdev, b));
}
}

Expand Down

0 comments on commit 0c2322e

Please sign in to comment.