aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/dm-table.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/md/dm-table.c')
-rw-r--r--drivers/md/dm-table.c19
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
1002int dm_table_barrier_ok(struct dm_table *t)
1003{
1004 return t->barriers_supported;
1005}
1006EXPORT_SYMBOL(dm_table_barrier_ok);
1007
989EXPORT_SYMBOL(dm_vcalloc); 1008EXPORT_SYMBOL(dm_vcalloc);
990EXPORT_SYMBOL(dm_get_device); 1009EXPORT_SYMBOL(dm_get_device);
991EXPORT_SYMBOL(dm_put_device); 1010EXPORT_SYMBOL(dm_put_device);