diff options
Diffstat (limited to 'drivers/md')
-rw-r--r-- | drivers/md/dm-linear.c | 1 | ||||
-rw-r--r-- | drivers/md/dm-table.c | 19 | ||||
-rw-r--r-- | drivers/md/dm.c | 15 | ||||
-rw-r--r-- | drivers/md/dm.h | 1 |
4 files changed, 10 insertions, 26 deletions
diff --git a/drivers/md/dm-linear.c b/drivers/md/dm-linear.c index bfa107f59d96..79fb53e51c70 100644 --- a/drivers/md/dm-linear.c +++ b/drivers/md/dm-linear.c | |||
@@ -142,7 +142,6 @@ static struct target_type linear_target = { | |||
142 | .status = linear_status, | 142 | .status = linear_status, |
143 | .ioctl = linear_ioctl, | 143 | .ioctl = linear_ioctl, |
144 | .merge = linear_merge, | 144 | .merge = linear_merge, |
145 | .features = DM_TARGET_SUPPORTS_BARRIERS, | ||
146 | }; | 145 | }; |
147 | 146 | ||
148 | int __init dm_linear_init(void) | 147 | int __init dm_linear_init(void) |
diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c index 02d0b489fad6..429b50b975d5 100644 --- a/drivers/md/dm-table.c +++ b/drivers/md/dm-table.c | |||
@@ -52,8 +52,6 @@ struct dm_table { | |||
52 | sector_t *highs; | 52 | sector_t *highs; |
53 | struct dm_target *targets; | 53 | struct dm_target *targets; |
54 | 54 | ||
55 | unsigned barriers_supported:1; | ||
56 | |||
57 | /* | 55 | /* |
58 | * Indicates the rw permissions for the new logical | 56 | * Indicates the rw permissions for the new logical |
59 | * device. This should be a combination of FMODE_READ | 57 | * device. This should be a combination of FMODE_READ |
@@ -243,7 +241,6 @@ int dm_table_create(struct dm_table **result, fmode_t mode, | |||
243 | 241 | ||
244 | INIT_LIST_HEAD(&t->devices); | 242 | INIT_LIST_HEAD(&t->devices); |
245 | atomic_set(&t->holders, 0); | 243 | atomic_set(&t->holders, 0); |
246 | t->barriers_supported = 1; | ||
247 | 244 | ||
248 | if (!num_targets) | 245 | if (!num_targets) |
249 | num_targets = KEYS_PER_NODE; | 246 | num_targets = KEYS_PER_NODE; |
@@ -751,10 +748,6 @@ int dm_table_add_target(struct dm_table *t, const char *type, | |||
751 | /* FIXME: the plan is to combine high here and then have | 748 | /* FIXME: the plan is to combine high here and then have |
752 | * the merge fn apply the target level restrictions. */ | 749 | * the merge fn apply the target level restrictions. */ |
753 | combine_restrictions_low(&t->limits, &tgt->limits); | 750 | combine_restrictions_low(&t->limits, &tgt->limits); |
754 | |||
755 | if (!(tgt->type->features & DM_TARGET_SUPPORTS_BARRIERS)) | ||
756 | t->barriers_supported = 0; | ||
757 | |||
758 | return 0; | 751 | return 0; |
759 | 752 | ||
760 | bad: | 753 | bad: |
@@ -799,12 +792,6 @@ int dm_table_complete(struct dm_table *t) | |||
799 | 792 | ||
800 | check_for_valid_limits(&t->limits); | 793 | check_for_valid_limits(&t->limits); |
801 | 794 | ||
802 | /* | ||
803 | * We only support barriers if there is exactly one underlying device. | ||
804 | */ | ||
805 | if (!list_is_singular(&t->devices)) | ||
806 | t->barriers_supported = 0; | ||
807 | |||
808 | /* how many indexes will the btree have ? */ | 795 | /* how many indexes will the btree have ? */ |
809 | leaf_nodes = dm_div_up(t->num_targets, KEYS_PER_NODE); | 796 | leaf_nodes = dm_div_up(t->num_targets, KEYS_PER_NODE); |
810 | t->depth = 1 + int_log(leaf_nodes, CHILDREN_PER_NODE); | 797 | t->depth = 1 + int_log(leaf_nodes, CHILDREN_PER_NODE); |
@@ -1059,12 +1046,6 @@ struct mapped_device *dm_table_get_md(struct dm_table *t) | |||
1059 | return t->md; | 1046 | return t->md; |
1060 | } | 1047 | } |
1061 | 1048 | ||
1062 | int dm_table_barrier_ok(struct dm_table *t) | ||
1063 | { | ||
1064 | return t->barriers_supported; | ||
1065 | } | ||
1066 | EXPORT_SYMBOL(dm_table_barrier_ok); | ||
1067 | |||
1068 | EXPORT_SYMBOL(dm_vcalloc); | 1049 | EXPORT_SYMBOL(dm_vcalloc); |
1069 | EXPORT_SYMBOL(dm_get_device); | 1050 | EXPORT_SYMBOL(dm_get_device); |
1070 | EXPORT_SYMBOL(dm_put_device); | 1051 | EXPORT_SYMBOL(dm_put_device); |
diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 25d86e2c01f2..ab3b5d84df65 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c | |||
@@ -851,11 +851,7 @@ static void __split_and_process_bio(struct mapped_device *md, struct bio *bio) | |||
851 | bio_io_error(bio); | 851 | bio_io_error(bio); |
852 | return; | 852 | return; |
853 | } | 853 | } |
854 | if (unlikely(bio_barrier(bio) && !dm_table_barrier_ok(ci.map))) { | 854 | |
855 | dm_table_put(ci.map); | ||
856 | bio_endio(bio, -EOPNOTSUPP); | ||
857 | return; | ||
858 | } | ||
859 | ci.md = md; | 855 | ci.md = md; |
860 | ci.bio = bio; | 856 | ci.bio = bio; |
861 | ci.io = alloc_io(md); | 857 | ci.io = alloc_io(md); |
@@ -937,6 +933,15 @@ static int dm_request(struct request_queue *q, struct bio *bio) | |||
937 | struct mapped_device *md = q->queuedata; | 933 | struct mapped_device *md = q->queuedata; |
938 | int cpu; | 934 | int cpu; |
939 | 935 | ||
936 | /* | ||
937 | * There is no use in forwarding any barrier request since we can't | ||
938 | * guarantee it is (or can be) handled by the targets correctly. | ||
939 | */ | ||
940 | if (unlikely(bio_barrier(bio))) { | ||
941 | bio_endio(bio, -EOPNOTSUPP); | ||
942 | return 0; | ||
943 | } | ||
944 | |||
940 | down_read(&md->io_lock); | 945 | down_read(&md->io_lock); |
941 | 946 | ||
942 | cpu = part_stat_lock(); | 947 | cpu = part_stat_lock(); |
diff --git a/drivers/md/dm.h b/drivers/md/dm.h index b48397c0abbd..a31506d93e91 100644 --- a/drivers/md/dm.h +++ b/drivers/md/dm.h | |||
@@ -52,7 +52,6 @@ int dm_table_any_congested(struct dm_table *t, int bdi_bits); | |||
52 | * To check the return value from dm_table_find_target(). | 52 | * To check the return value from dm_table_find_target(). |
53 | */ | 53 | */ |
54 | #define dm_target_is_valid(t) ((t)->table) | 54 | #define dm_target_is_valid(t) ((t)->table) |
55 | int dm_table_barrier_ok(struct dm_table *t); | ||
56 | 55 | ||
57 | /*----------------------------------------------------------------- | 56 | /*----------------------------------------------------------------- |
58 | * A registry of target types. | 57 | * A registry of target types. |