aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md
diff options
context:
space:
mode:
authorMike Snitzer <snitzer@redhat.com>2016-02-06 18:38:46 -0500
committerMike Snitzer <snitzer@redhat.com>2016-02-22 11:06:21 -0500
commitf083b09b7819c785db4f82a81f68da3bccfb04bf (patch)
tree894fade789e2499a0bd16cb82c2b9ff21982b043 /drivers/md
parente522c039059b0fdf5ecd15d7007026326fffc9be (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.c3
-rw-r--r--drivers/md/dm-table.c14
-rw-r--r--drivers/md/dm-target.c3
-rw-r--r--drivers/md/dm.h1
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
923struct 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
923bool dm_table_request_based(struct dm_table *t) 937bool 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
151static struct target_type error_target = { 151static 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);
73int dm_table_any_congested(struct dm_table *t, int bdi_bits); 73int dm_table_any_congested(struct dm_table *t, int bdi_bits);
74unsigned dm_table_get_type(struct dm_table *t); 74unsigned dm_table_get_type(struct dm_table *t);
75struct target_type *dm_table_get_immutable_target_type(struct dm_table *t); 75struct target_type *dm_table_get_immutable_target_type(struct dm_table *t);
76struct dm_target *dm_table_get_wildcard_target(struct dm_table *t);
76bool dm_table_request_based(struct dm_table *t); 77bool dm_table_request_based(struct dm_table *t);
77bool dm_table_mq_request_based(struct dm_table *t); 78bool dm_table_mq_request_based(struct dm_table *t);
78void dm_table_free_md_mempools(struct dm_table *t); 79void dm_table_free_md_mempools(struct dm_table *t);