|
@@ -237,6 +237,44 @@ int dm_table_create(struct dm_table **result, int mode,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+int dm_create_error_table(struct dm_table **result, struct mapped_device *md)
|
|
|
+{
|
|
|
+ struct dm_table *t;
|
|
|
+ sector_t dev_size = 1;
|
|
|
+ int r;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Find current size of device.
|
|
|
+ * Default to 1 sector if inactive.
|
|
|
+ */
|
|
|
+ t = dm_get_table(md);
|
|
|
+ if (t) {
|
|
|
+ dev_size = dm_table_get_size(t);
|
|
|
+ dm_table_put(t);
|
|
|
+ }
|
|
|
+
|
|
|
+ r = dm_table_create(&t, FMODE_READ, 1, md);
|
|
|
+ if (r)
|
|
|
+ return r;
|
|
|
+
|
|
|
+ r = dm_table_add_target(t, "error", 0, dev_size, NULL);
|
|
|
+ if (r)
|
|
|
+ goto out;
|
|
|
+
|
|
|
+ r = dm_table_complete(t);
|
|
|
+ if (r)
|
|
|
+ goto out;
|
|
|
+
|
|
|
+ *result = t;
|
|
|
+
|
|
|
+out:
|
|
|
+ if (r)
|
|
|
+ dm_table_put(t);
|
|
|
+
|
|
|
+ return r;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(dm_create_error_table);
|
|
|
+
|
|
|
static void free_devices(struct list_head *devices)
|
|
|
{
|
|
|
struct list_head *tmp, *next;
|