|
@@ -38,6 +38,8 @@ struct dm_table {
|
|
|
sector_t *highs;
|
|
|
struct dm_target *targets;
|
|
|
|
|
|
+ unsigned barriers_supported:1;
|
|
|
+
|
|
|
/*
|
|
|
* Indicates the rw permissions for the new logical
|
|
|
* device. This should be a combination of FMODE_READ
|
|
@@ -227,6 +229,7 @@ int dm_table_create(struct dm_table **result, fmode_t mode,
|
|
|
|
|
|
INIT_LIST_HEAD(&t->devices);
|
|
|
atomic_set(&t->holders, 1);
|
|
|
+ t->barriers_supported = 1;
|
|
|
|
|
|
if (!num_targets)
|
|
|
num_targets = KEYS_PER_NODE;
|
|
@@ -728,6 +731,10 @@ int dm_table_add_target(struct dm_table *t, const char *type,
|
|
|
/* FIXME: the plan is to combine high here and then have
|
|
|
* the merge fn apply the target level restrictions. */
|
|
|
combine_restrictions_low(&t->limits, &tgt->limits);
|
|
|
+
|
|
|
+ if (!(tgt->type->features & DM_TARGET_SUPPORTS_BARRIERS))
|
|
|
+ t->barriers_supported = 0;
|
|
|
+
|
|
|
return 0;
|
|
|
|
|
|
bad:
|
|
@@ -772,6 +779,12 @@ int dm_table_complete(struct dm_table *t)
|
|
|
|
|
|
check_for_valid_limits(&t->limits);
|
|
|
|
|
|
+ /*
|
|
|
+ * We only support barriers if there is exactly one underlying device.
|
|
|
+ */
|
|
|
+ if (!list_is_singular(&t->devices))
|
|
|
+ t->barriers_supported = 0;
|
|
|
+
|
|
|
/* how many indexes will the btree have ? */
|
|
|
leaf_nodes = dm_div_up(t->num_targets, KEYS_PER_NODE);
|
|
|
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)
|
|
|
return t->md;
|
|
|
}
|
|
|
|
|
|
+int dm_table_barrier_ok(struct dm_table *t)
|
|
|
+{
|
|
|
+ return t->barriers_supported;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(dm_table_barrier_ok);
|
|
|
+
|
|
|
EXPORT_SYMBOL(dm_vcalloc);
|
|
|
EXPORT_SYMBOL(dm_get_device);
|
|
|
EXPORT_SYMBOL(dm_put_device);
|