diff options
author | Mike Snitzer <snitzer@redhat.com> | 2014-12-17 21:08:12 -0500 |
---|---|---|
committer | Mike Snitzer <snitzer@redhat.com> | 2015-02-09 13:06:47 -0500 |
commit | e5863d9ad754926e7d3f38b43ac8bd48ef73b097 (patch) | |
tree | 0e4d75672884b7dc93296beea8ddf3833b4d7f38 /include/linux/device-mapper.h | |
parent | 466d89a6bcd500f64896b514f78b32e8d0b0303a (diff) |
dm: allocate requests in target when stacking on blk-mq devices
For blk-mq request-based DM the responsibility of allocating a cloned
request is transfered from DM core to the target type. Doing so
enables the cloned request to be allocated from the appropriate
blk-mq request_queue's pool (only the DM target, e.g. multipath, can
know which block device to send a given cloned request to).
Care was taken to preserve compatibility with old-style block request
completion that requires request-based DM _not_ acquire the clone
request's queue lock in the completion path. As such, there are now 2
different request-based DM target_type interfaces:
1) the original .map_rq() interface will continue to be used for
non-blk-mq devices -- the preallocated clone request is passed in
from DM core.
2) a new .clone_and_map_rq() and .release_clone_rq() will be used for
blk-mq devices -- blk_get_request() and blk_put_request() are used
respectively from these hooks.
dm_table_set_type() was updated to detect if the request-based target is
being stacked on blk-mq devices, if so DM_TYPE_MQ_REQUEST_BASED is set.
DM core disallows switching the DM table's type after it is set. This
means that there is no mixing of non-blk-mq and blk-mq devices within
the same request-based DM table.
[This patch was started by Keith and later heavily modified by Mike]
Tested-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Keith Busch <keith.busch@intel.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Diffstat (limited to 'include/linux/device-mapper.h')
-rw-r--r-- | include/linux/device-mapper.h | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/include/linux/device-mapper.h b/include/linux/device-mapper.h index 19296fba58e8..2646aed1d3fe 100644 --- a/include/linux/device-mapper.h +++ b/include/linux/device-mapper.h | |||
@@ -48,6 +48,11 @@ typedef void (*dm_dtr_fn) (struct dm_target *ti); | |||
48 | typedef int (*dm_map_fn) (struct dm_target *ti, struct bio *bio); | 48 | typedef int (*dm_map_fn) (struct dm_target *ti, struct bio *bio); |
49 | typedef int (*dm_map_request_fn) (struct dm_target *ti, struct request *clone, | 49 | typedef int (*dm_map_request_fn) (struct dm_target *ti, struct request *clone, |
50 | union map_info *map_context); | 50 | union map_info *map_context); |
51 | typedef int (*dm_clone_and_map_request_fn) (struct dm_target *ti, | ||
52 | struct request *rq, | ||
53 | union map_info *map_context, | ||
54 | struct request **clone); | ||
55 | typedef void (*dm_release_clone_request_fn) (struct request *clone); | ||
51 | 56 | ||
52 | /* | 57 | /* |
53 | * Returns: | 58 | * Returns: |
@@ -143,6 +148,8 @@ struct target_type { | |||
143 | dm_dtr_fn dtr; | 148 | dm_dtr_fn dtr; |
144 | dm_map_fn map; | 149 | dm_map_fn map; |
145 | dm_map_request_fn map_rq; | 150 | dm_map_request_fn map_rq; |
151 | dm_clone_and_map_request_fn clone_and_map_rq; | ||
152 | dm_release_clone_request_fn release_clone_rq; | ||
146 | dm_endio_fn end_io; | 153 | dm_endio_fn end_io; |
147 | dm_request_endio_fn rq_end_io; | 154 | dm_request_endio_fn rq_end_io; |
148 | dm_presuspend_fn presuspend; | 155 | dm_presuspend_fn presuspend; |