Index: drivers/md/dm-table.c |
diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c |
index e86912864e0443a348f3a829f64f5ed48c2212fb..891fecc5ab3616689eb486b9afbbd4fee8a2c15b 100644 |
--- a/drivers/md/dm-table.c |
+++ b/drivers/md/dm-table.c |
@@ -11,6 +11,7 @@ |
#include <linux/vmalloc.h> |
#include <linux/blkdev.h> |
#include <linux/namei.h> |
+#include <linux/mount.h> |
#include <linux/ctype.h> |
#include <linux/slab.h> |
#include <linux/interrupt.h> |
@@ -901,7 +902,7 @@ static int setup_indexes(struct dm_table *t) |
/* |
* Builds the btree to index the map. |
*/ |
-int dm_table_complete(struct dm_table *t) |
+int dm_table_build_index(struct dm_table *t) |
{ |
int r = 0; |
unsigned int leaf_nodes; |
@@ -920,6 +921,54 @@ int dm_table_complete(struct dm_table *t) |
return r; |
} |
+/* |
+ * Register the mapped device for blk_integrity support if |
+ * the underlying devices support it. |
+ */ |
+static int dm_table_prealloc_integrity(struct dm_table *t, |
+ struct mapped_device *md) |
+{ |
+ struct list_head *devices = dm_table_get_devices(t); |
+ struct dm_dev_internal *dd; |
+ |
+ list_for_each_entry(dd, devices, list) |
+ if (bdev_get_integrity(dd->dm_dev.bdev)) |
+ return blk_integrity_register(dm_disk(md), NULL); |
+ |
+ return 0; |
+} |
+ |
+/* |
+ * Prepares the table for use by building the indices, |
+ * setting the type, and allocating mempools. |
+ */ |
+int dm_table_complete(struct dm_table *t) |
+{ |
+ int r = 0; |
+ r = dm_table_set_type(t); |
+ if (r) { |
+ DMERR("unable to set table type"); |
+ return r; |
+ } |
+ |
+ r = dm_table_build_index(t); |
+ if (r) { |
+ DMERR("unable to build btrees"); |
+ return r; |
+ } |
+ |
+ r = dm_table_prealloc_integrity(t, t->md); |
+ if (r) { |
+ DMERR("could not register integrity profile."); |
+ return r; |
+ } |
+ |
+ r = dm_table_alloc_md_mempools(t); |
+ if (r) |
+ DMERR("unable to allocate mempools"); |
+ return r; |
+} |
+ |
static DEFINE_MUTEX(_event_lock); |
void dm_table_event_callback(struct dm_table *t, |
void (*fn)(void *), void *context) |