]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/md/dm-table.c
dm: support barriers on simple devices
[linux-2.6-omap-h63xx.git] / drivers / md / dm-table.c
index 04e5fd742c2c29e42fbba920e1303b889229ccf7..ebaaf72cd8220c62e7f5287b8e32dee756186ee0 100644 (file)
@@ -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);