diff options
author | Kiyoshi Ueda <k-ueda@ct.jp.nec.com> | 2009-06-22 05:12:36 -0400 |
---|---|---|
committer | Alasdair G Kergon <agk@redhat.com> | 2009-06-22 05:12:36 -0400 |
commit | e6ee8c0b767540f59e20da3ced282601db8aa502 (patch) | |
tree | 101cb830994734eb45a4a47cd5988f24da67fa4f /drivers/md/dm-ioctl.c | |
parent | cec47e3d4a861e1d942b3a580d0bbef2700d2bb2 (diff) |
dm: enable request based option
This patch enables request-based dm.
o Request-based dm and bio-based dm coexist, since there are
some target drivers which are more fitting to bio-based dm.
Also, there are other bio-based devices in the kernel
(e.g. md, loop).
Since bio-based device can't receive struct request,
there are some limitations on device stacking between
bio-based and request-based.
type of underlying device
bio-based request-based
----------------------------------------------
bio-based OK OK
request-based -- OK
The device type is recognized by the queue flag in the kernel,
so dm follows that.
o The type of a dm device is decided at the first table binding time.
Once the type of a dm device is decided, the type can't be changed.
o Mempool allocations are deferred to at the table loading time, since
mempools for request-based dm are different from those for bio-based
dm and needed mempool type is fixed by the type of table.
o Currently, request-based dm supports only tables that have a single
target. To support multiple targets, we need to support request
splitting or prevent bio/request from spanning multiple targets.
The former needs lots of changes in the block layer, and the latter
needs that all target drivers support merge() function.
Both will take a time.
Signed-off-by: Kiyoshi Ueda <k-ueda@ct.jp.nec.com>
Signed-off-by: Jun'ichi Nomura <j-nomura@ce.jp.nec.com>
Signed-off-by: Alasdair G Kergon <agk@redhat.com>
Diffstat (limited to 'drivers/md/dm-ioctl.c')
-rw-r--r-- | drivers/md/dm-ioctl.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c index 1c871736f48c..7f77f18fcafa 100644 --- a/drivers/md/dm-ioctl.c +++ b/drivers/md/dm-ioctl.c | |||
@@ -1050,6 +1050,12 @@ static int populate_table(struct dm_table *table, | |||
1050 | next = spec->next; | 1050 | next = spec->next; |
1051 | } | 1051 | } |
1052 | 1052 | ||
1053 | r = dm_table_set_type(table); | ||
1054 | if (r) { | ||
1055 | DMWARN("unable to set table type"); | ||
1056 | return r; | ||
1057 | } | ||
1058 | |||
1053 | return dm_table_complete(table); | 1059 | return dm_table_complete(table); |
1054 | } | 1060 | } |
1055 | 1061 | ||
@@ -1095,6 +1101,13 @@ static int table_load(struct dm_ioctl *param, size_t param_size) | |||
1095 | goto out; | 1101 | goto out; |
1096 | } | 1102 | } |
1097 | 1103 | ||
1104 | r = dm_table_alloc_md_mempools(t); | ||
1105 | if (r) { | ||
1106 | DMWARN("unable to allocate mempools for this table"); | ||
1107 | dm_table_destroy(t); | ||
1108 | goto out; | ||
1109 | } | ||
1110 | |||
1098 | down_write(&_hash_lock); | 1111 | down_write(&_hash_lock); |
1099 | hc = dm_get_mdptr(md); | 1112 | hc = dm_get_mdptr(md); |
1100 | if (!hc || hc->md != md) { | 1113 | if (!hc || hc->md != md) { |