<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">From: Joe Thornber &lt;ejt@redhat.com&gt;

Move block manager creation and the check for unformatted metadata into 
__create_persistent_data_objects().

Signed-off-by: Joe Thornber &lt;ejt@redhat.com&gt;
Signed-off-by: Mike Snitzer &lt;snitzer@redhat.com&gt;
Signed-off-by: Alasdair G Kergon &lt;agk@redhat.com&gt;
---
 drivers/md/dm-thin-metadata.c |   56 ++++++++++++++++++++++++------------------
 1 file changed, 32 insertions(+), 24 deletions(-)

Index: linux/drivers/md/dm-thin-metadata.c
===================================================================
--- linux.orig/drivers/md/dm-thin-metadata.c
+++ linux/drivers/md/dm-thin-metadata.c
@@ -357,7 +357,7 @@ static int superblock_lock(struct dm_poo
 				&amp;sb_validator, sblock);
 }
 
-static int superblock_all_zeroes(struct dm_block_manager *bm, int *result)
+static int __superblock_all_zeroes(struct dm_block_manager *bm, int *result)
 {
 	int r;
 	unsigned i;
@@ -422,9 +422,9 @@ static void __setup_btree_details(struct
 	pmd-&gt;details_info.value_type.equal = NULL;
 }
 
-static int __create_persistent_data_objects(struct dm_pool_metadata *pmd,
-					    struct dm_block_manager *bm,
-					    dm_block_t nr_blocks, int create)
+static int __open_or_format_metadata(struct dm_pool_metadata *pmd,
+				     struct dm_block_manager *bm,
+				     dm_block_t nr_blocks, int create)
 {
 	int r;
 	struct dm_space_map *sm, *data_sm;
@@ -509,6 +509,32 @@ bad:
 	return r;
 }
 
+static int __create_persistent_data_objects(struct dm_pool_metadata *pmd,
+					    dm_block_t nr_blocks, int *create)
+{
+	int r;
+
+	pmd-&gt;bm = dm_block_manager_create(pmd-&gt;bdev, THIN_METADATA_BLOCK_SIZE,
+					  THIN_METADATA_CACHE_SIZE,
+					  THIN_MAX_CONCURRENT_LOCKS);
+	if (IS_ERR(pmd-&gt;bm)) {
+		DMERR("could not create block manager");
+		return PTR_ERR(pmd-&gt;bm);
+	}
+
+	r = __superblock_all_zeroes(pmd-&gt;bm, create);
+	if (r) {
+		dm_block_manager_destroy(pmd-&gt;bm);
+		return r;
+	}
+
+	r = __open_or_format_metadata(pmd, pmd-&gt;bm, nr_blocks, *create);
+	if (r)
+		dm_block_manager_destroy(pmd-&gt;bm);
+
+	return r;
+}
+
 static int __begin_transaction(struct dm_pool_metadata *pmd)
 {
 	int r;
@@ -666,7 +692,6 @@ struct dm_pool_metadata *dm_pool_metadat
 	struct thin_disk_superblock *disk_super;
 	struct dm_pool_metadata *pmd;
 	sector_t bdev_size = i_size_read(bdev-&gt;bd_inode) &gt;&gt; SECTOR_SHIFT;
-	struct dm_block_manager *bm;
 	int create;
 	struct dm_block *sblock;
 
@@ -676,30 +701,13 @@ struct dm_pool_metadata *dm_pool_metadat
 		return ERR_PTR(-ENOMEM);
 	}
 
-	bm = dm_block_manager_create(bdev, THIN_METADATA_BLOCK_SIZE,
-				     THIN_METADATA_CACHE_SIZE,
-				     THIN_MAX_CONCURRENT_LOCKS);
-	if (IS_ERR(bm)) {
-		r = PTR_ERR(bm);
-		DMERR("could not create block manager");
-		kfree(pmd);
-		return ERR_PTR(r);
-	}
-
-	r = superblock_all_zeroes(bm, &amp;create);
-	if (r) {
-		dm_block_manager_destroy(bm);
-		kfree(pmd);
-		return ERR_PTR(r);
-	}
+	pmd-&gt;bdev = bdev;
 
-	r = __create_persistent_data_objects(pmd, bm, 0, create);
+	r = __create_persistent_data_objects(pmd, 0, &amp;create);
 	if (r) {
-		dm_block_manager_destroy(bm);
 		kfree(pmd);
 		return ERR_PTR(r);
 	}
-	pmd-&gt;bdev = bdev;
 
 	if (!create) {
 		r = __begin_transaction(pmd);
</pre></body></html>