Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

dm table: add dm_table_run_md_queue_async

Introduce dm_table_run_md_queue_async() to run the request_queue of the
mapped_device associated with a request-based DM table.

Also add dm_md_get_queue() wrapper to extract the request_queue from a
mapped_device.

Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Signed-off-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Jun'ichi Nomura <j-nomura@ce.jp.nec.com>

+30
+19
drivers/md/dm-table.c
··· 1618 1618 } 1619 1619 EXPORT_SYMBOL(dm_table_get_md); 1620 1620 1621 + void dm_table_run_md_queue_async(struct dm_table *t) 1622 + { 1623 + struct mapped_device *md; 1624 + struct request_queue *queue; 1625 + unsigned long flags; 1626 + 1627 + if (!dm_table_request_based(t)) 1628 + return; 1629 + 1630 + md = dm_table_get_md(t); 1631 + queue = dm_get_md_queue(md); 1632 + if (queue) { 1633 + spin_lock_irqsave(queue->queue_lock, flags); 1634 + blk_run_queue_async(queue); 1635 + spin_unlock_irqrestore(queue->queue_lock, flags); 1636 + } 1637 + } 1638 + EXPORT_SYMBOL(dm_table_run_md_queue_async); 1639 + 1621 1640 static int device_discard_capable(struct dm_target *ti, struct dm_dev *dev, 1622 1641 sector_t start, sector_t len, void *data) 1623 1642 {
+5
drivers/md/dm.c
··· 468 468 return get_capacity(md->disk); 469 469 } 470 470 471 + struct request_queue *dm_get_md_queue(struct mapped_device *md) 472 + { 473 + return md->queue; 474 + } 475 + 471 476 struct dm_stats *dm_get_stats(struct mapped_device *md) 472 477 { 473 478 return &md->stats;
+1
drivers/md/dm.h
··· 188 188 int dm_cancel_deferred_remove(struct mapped_device *md); 189 189 int dm_request_based(struct mapped_device *md); 190 190 sector_t dm_get_size(struct mapped_device *md); 191 + struct request_queue *dm_get_md_queue(struct mapped_device *md); 191 192 struct dm_stats *dm_get_stats(struct mapped_device *md); 192 193 193 194 int dm_kobject_uevent(struct mapped_device *md, enum kobject_action action,
+5
include/linux/device-mapper.h
··· 463 463 void dm_table_event(struct dm_table *t); 464 464 465 465 /* 466 + * Run the queue for request-based targets. 467 + */ 468 + void dm_table_run_md_queue_async(struct dm_table *t); 469 + 470 + /* 466 471 * The device must be suspended before calling this method. 467 472 * Returns the previous table, which the caller must destroy. 468 473 */