diff options
author | Mike Snitzer <snitzer@redhat.com> | 2016-02-06 18:38:46 -0500 |
---|---|---|
committer | Mike Snitzer <snitzer@redhat.com> | 2016-02-22 11:06:21 -0500 |
commit | f083b09b7819c785db4f82a81f68da3bccfb04bf (patch) | |
tree | 894fade789e2499a0bd16cb82c2b9ff21982b043 /drivers/md | |
parent | e522c039059b0fdf5ecd15d7007026326fffc9be (diff) |
dm: set DM_TARGET_WILDCARD feature on "error" target
The DM_TARGET_WILDCARD feature indicates that the "error" target may
replace any target; even immutable targets. This feature will be useful
to preserve the ability to replace the "multipath" target even once it
is formally converted over to having the DM_TARGET_IMMUTABLE feature.
Also, implicit in the DM_TARGET_WILDCARD feature flag being set is that
.map, .map_rq, .clone_and_map_rq and .release_clone_rq are all defined
in the target_type.
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Diffstat (limited to 'drivers/md')
-rw-r--r-- | drivers/md/dm-ioctl.c | 3 | ||||
-rw-r--r-- | drivers/md/dm-table.c | 14 | ||||
-rw-r--r-- | drivers/md/dm-target.c | 3 | ||||
-rw-r--r-- | drivers/md/dm.h | 1 |
4 files changed, 19 insertions, 2 deletions
diff --git a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c index 80a439543259..4763c4ae30e4 100644 --- a/drivers/md/dm-ioctl.c +++ b/drivers/md/dm-ioctl.c | |||
@@ -1291,7 +1291,8 @@ static int table_load(struct dm_ioctl *param, size_t param_size) | |||
1291 | 1291 | ||
1292 | immutable_target_type = dm_get_immutable_target_type(md); | 1292 | immutable_target_type = dm_get_immutable_target_type(md); |
1293 | if (immutable_target_type && | 1293 | if (immutable_target_type && |
1294 | (immutable_target_type != dm_table_get_immutable_target_type(t))) { | 1294 | (immutable_target_type != dm_table_get_immutable_target_type(t)) && |
1295 | !dm_table_get_wildcard_target(t)) { | ||
1295 | DMWARN("can't replace immutable target type %s", | 1296 | DMWARN("can't replace immutable target type %s", |
1296 | immutable_target_type->name); | 1297 | immutable_target_type->name); |
1297 | r = -EINVAL; | 1298 | r = -EINVAL; |
diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c index 061152a43730..a49e62b8611f 100644 --- a/drivers/md/dm-table.c +++ b/drivers/md/dm-table.c | |||
@@ -920,6 +920,20 @@ struct target_type *dm_table_get_immutable_target_type(struct dm_table *t) | |||
920 | return t->immutable_target_type; | 920 | return t->immutable_target_type; |
921 | } | 921 | } |
922 | 922 | ||
923 | struct dm_target *dm_table_get_wildcard_target(struct dm_table *t) | ||
924 | { | ||
925 | struct dm_target *uninitialized_var(ti); | ||
926 | unsigned i = 0; | ||
927 | |||
928 | while (i < dm_table_get_num_targets(t)) { | ||
929 | ti = dm_table_get_target(t, i++); | ||
930 | if (dm_target_is_wildcard(ti->type)) | ||
931 | return ti; | ||
932 | } | ||
933 | |||
934 | return NULL; | ||
935 | } | ||
936 | |||
923 | bool dm_table_request_based(struct dm_table *t) | 937 | bool dm_table_request_based(struct dm_table *t) |
924 | { | 938 | { |
925 | return __table_type_request_based(dm_table_get_type(t)); | 939 | return __table_type_request_based(dm_table_get_type(t)); |
diff --git a/drivers/md/dm-target.c b/drivers/md/dm-target.c index 925ec1b15e75..a317dd884ba6 100644 --- a/drivers/md/dm-target.c +++ b/drivers/md/dm-target.c | |||
@@ -150,7 +150,8 @@ static void io_err_release_clone_rq(struct request *clone) | |||
150 | 150 | ||
151 | static struct target_type error_target = { | 151 | static struct target_type error_target = { |
152 | .name = "error", | 152 | .name = "error", |
153 | .version = {1, 3, 0}, | 153 | .version = {1, 4, 0}, |
154 | .features = DM_TARGET_WILDCARD, | ||
154 | .ctr = io_err_ctr, | 155 | .ctr = io_err_ctr, |
155 | .dtr = io_err_dtr, | 156 | .dtr = io_err_dtr, |
156 | .map = io_err_map, | 157 | .map = io_err_map, |
diff --git a/drivers/md/dm.h b/drivers/md/dm.h index 7edcf97dfa5a..53df2585571b 100644 --- a/drivers/md/dm.h +++ b/drivers/md/dm.h | |||
@@ -73,6 +73,7 @@ int dm_table_resume_targets(struct dm_table *t); | |||
73 | int dm_table_any_congested(struct dm_table *t, int bdi_bits); | 73 | int dm_table_any_congested(struct dm_table *t, int bdi_bits); |
74 | unsigned dm_table_get_type(struct dm_table *t); | 74 | unsigned dm_table_get_type(struct dm_table *t); |
75 | struct target_type *dm_table_get_immutable_target_type(struct dm_table *t); | 75 | struct target_type *dm_table_get_immutable_target_type(struct dm_table *t); |
76 | struct dm_target *dm_table_get_wildcard_target(struct dm_table *t); | ||
76 | bool dm_table_request_based(struct dm_table *t); | 77 | bool dm_table_request_based(struct dm_table *t); |
77 | bool dm_table_mq_request_based(struct dm_table *t); | 78 | bool dm_table_mq_request_based(struct dm_table *t); |
78 | void dm_table_free_md_mempools(struct dm_table *t); | 79 | void dm_table_free_md_mempools(struct dm_table *t); |