Merge branches 'pm-cpufreq', 'pm-cpuidle' and 'acpi-cppc'
[cascardo/linux.git] / drivers / md / dm-table.c
index 061152a..f9e8f0b 100644 (file)
@@ -364,6 +364,26 @@ static int upgrade_mode(struct dm_dev_internal *dd, fmode_t new_mode,
        return 0;
 }
 
+/*
+ * Convert the path to a device
+ */
+dev_t dm_get_dev_t(const char *path)
+{
+       dev_t uninitialized_var(dev);
+       struct block_device *bdev;
+
+       bdev = lookup_bdev(path);
+       if (IS_ERR(bdev))
+               dev = name_to_dev_t(path);
+       else {
+               dev = bdev->bd_dev;
+               bdput(bdev);
+       }
+
+       return dev;
+}
+EXPORT_SYMBOL_GPL(dm_get_dev_t);
+
 /*
  * Add a device to the list, or just increment the usage count if
  * it's already present.
@@ -372,23 +392,15 @@ int dm_get_device(struct dm_target *ti, const char *path, fmode_t mode,
                  struct dm_dev **result)
 {
        int r;
-       dev_t uninitialized_var(dev);
+       dev_t dev;
        struct dm_dev_internal *dd;
        struct dm_table *t = ti->table;
-       struct block_device *bdev;
 
        BUG_ON(!t);
 
-       /* convert the path to a device */
-       bdev = lookup_bdev(path);
-       if (IS_ERR(bdev)) {
-               dev = name_to_dev_t(path);
-               if (!dev)
-                       return -ENODEV;
-       } else {
-               dev = bdev->bd_dev;
-               bdput(bdev);
-       }
+       dev = dm_get_dev_t(path);
+       if (!dev)
+               return -ENODEV;
 
        dd = find_device(&t->devices, dev);
        if (!dd) {
@@ -920,6 +932,30 @@ struct target_type *dm_table_get_immutable_target_type(struct dm_table *t)
        return t->immutable_target_type;
 }
 
+struct dm_target *dm_table_get_immutable_target(struct dm_table *t)
+{
+       /* Immutable target is implicitly a singleton */
+       if (t->num_targets > 1 ||
+           !dm_target_is_immutable(t->targets[0].type))
+               return NULL;
+
+       return t->targets;
+}
+
+struct dm_target *dm_table_get_wildcard_target(struct dm_table *t)
+{
+       struct dm_target *uninitialized_var(ti);
+       unsigned i = 0;
+
+       while (i < dm_table_get_num_targets(t)) {
+               ti = dm_table_get_target(t, i++);
+               if (dm_target_is_wildcard(ti->type))
+                       return ti;
+       }
+
+       return NULL;
+}
+
 bool dm_table_request_based(struct dm_table *t)
 {
        return __table_type_request_based(dm_table_get_type(t));
@@ -933,7 +969,7 @@ bool dm_table_mq_request_based(struct dm_table *t)
 static int dm_table_alloc_md_mempools(struct dm_table *t, struct mapped_device *md)
 {
        unsigned type = dm_table_get_type(t);
-       unsigned per_bio_data_size = 0;
+       unsigned per_io_data_size = 0;
        struct dm_target *tgt;
        unsigned i;
 
@@ -945,10 +981,10 @@ static int dm_table_alloc_md_mempools(struct dm_table *t, struct mapped_device *
        if (type == DM_TYPE_BIO_BASED)
                for (i = 0; i < t->num_targets; i++) {
                        tgt = t->targets + i;
-                       per_bio_data_size = max(per_bio_data_size, tgt->per_bio_data_size);
+                       per_io_data_size = max(per_io_data_size, tgt->per_io_data_size);
                }
 
-       t->mempools = dm_alloc_md_mempools(md, type, t->integrity_supported, per_bio_data_size);
+       t->mempools = dm_alloc_md_mempools(md, type, t->integrity_supported, per_io_data_size);
        if (!t->mempools)
                return -ENOMEM;