diff options
Diffstat (limited to 'drivers/md/dm-table.c')
-rw-r--r-- | drivers/md/dm-table.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c index 04e5fd742c2c..ebaaf72cd822 100644 --- a/drivers/md/dm-table.c +++ b/drivers/md/dm-table.c | |||
@@ -38,6 +38,8 @@ struct dm_table { | |||
38 | sector_t *highs; | 38 | sector_t *highs; |
39 | struct dm_target *targets; | 39 | struct dm_target *targets; |
40 | 40 | ||
41 | unsigned barriers_supported:1; | ||
42 | |||
41 | /* | 43 | /* |
42 | * Indicates the rw permissions for the new logical | 44 | * Indicates the rw permissions for the new logical |
43 | * device. This should be a combination of FMODE_READ | 45 | * device. This should be a combination of FMODE_READ |
@@ -227,6 +229,7 @@ int dm_table_create(struct dm_table **result, fmode_t mode, | |||
227 | 229 | ||
228 | INIT_LIST_HEAD(&t->devices); | 230 | INIT_LIST_HEAD(&t->devices); |
229 | atomic_set(&t->holders, 1); | 231 | atomic_set(&t->holders, 1); |
232 | t->barriers_supported = 1; | ||
230 | 233 | ||
231 | if (!num_targets) | 234 | if (!num_targets) |
232 | num_targets = KEYS_PER_NODE; | 235 | num_targets = KEYS_PER_NODE; |
@@ -728,6 +731,10 @@ int dm_table_add_target(struct dm_table *t, const char *type, | |||
728 | /* FIXME: the plan is to combine high here and then have | 731 | /* FIXME: the plan is to combine high here and then have |
729 | * the merge fn apply the target level restrictions. */ | 732 | * the merge fn apply the target level restrictions. */ |
730 | combine_restrictions_low(&t->limits, &tgt->limits); | 733 | combine_restrictions_low(&t->limits, &tgt->limits); |
734 | |||
735 | if (!(tgt->type->features & DM_TARGET_SUPPORTS_BARRIERS)) | ||
736 | t->barriers_supported = 0; | ||
737 | |||
731 | return 0; | 738 | return 0; |
732 | 739 | ||
733 | bad: | 740 | bad: |
@@ -772,6 +779,12 @@ int dm_table_complete(struct dm_table *t) | |||
772 | 779 | ||
773 | check_for_valid_limits(&t->limits); | 780 | check_for_valid_limits(&t->limits); |
774 | 781 | ||
782 | /* | ||
783 | * We only support barriers if there is exactly one underlying device. | ||
784 | */ | ||
785 | if (!list_is_singular(&t->devices)) | ||
786 | t->barriers_supported = 0; | ||
787 | |||
775 | /* how many indexes will the btree have ? */ | 788 | /* how many indexes will the btree have ? */ |
776 | leaf_nodes = dm_div_up(t->num_targets, KEYS_PER_NODE); | 789 | leaf_nodes = dm_div_up(t->num_targets, KEYS_PER_NODE); |
777 | t->depth = 1 + int_log(leaf_nodes, CHILDREN_PER_NODE); | 790 | t->depth = 1 + int_log(leaf_nodes, CHILDREN_PER_NODE); |
@@ -986,6 +999,12 @@ struct mapped_device *dm_table_get_md(struct dm_table *t) | |||
986 | return t->md; | 999 | return t->md; |
987 | } | 1000 | } |
988 | 1001 | ||
1002 | int dm_table_barrier_ok(struct dm_table *t) | ||
1003 | { | ||
1004 | return t->barriers_supported; | ||
1005 | } | ||
1006 | EXPORT_SYMBOL(dm_table_barrier_ok); | ||
1007 | |||
989 | EXPORT_SYMBOL(dm_vcalloc); | 1008 | EXPORT_SYMBOL(dm_vcalloc); |
990 | EXPORT_SYMBOL(dm_get_device); | 1009 | EXPORT_SYMBOL(dm_get_device); |
991 | EXPORT_SYMBOL(dm_put_device); | 1010 | EXPORT_SYMBOL(dm_put_device); |