<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;

Split __open_or_format_metadata into __format_metadata and __open_metadata in
dm-thin-metadata.

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 |  124 +++++++++++++++++++++++++-----------------
 1 file changed, 74 insertions(+), 50 deletions(-)

Index: linux/drivers/md/dm-thin-metadata.c
===================================================================
--- linux.orig/drivers/md/dm-thin-metadata.c
+++ linux/drivers/md/dm-thin-metadata.c
@@ -485,57 +485,22 @@ bad_locked:
 	return r;
 }
 
-static int __open_or_format_metadata(struct dm_pool_metadata *pmd,
-				     dm_block_t nr_blocks, int create)
+static int __format_metadata(struct dm_pool_metadata *pmd, dm_block_t nr_blocks)
 {
 	int r;
-	struct dm_block *sblock;
 
-	if (create) {
-		r = dm_tm_create_with_sm(pmd-&gt;bm, THIN_SUPERBLOCK_LOCATION,
-					 &amp;pmd-&gt;tm, &amp;pmd-&gt;metadata_sm);
-		if (r &lt; 0) {
-			DMERR("tm_create_with_sm failed");
-			return r;
-		}
-
-		pmd-&gt;data_sm = dm_sm_disk_create(pmd-&gt;tm, nr_blocks);
-		if (IS_ERR(pmd-&gt;data_sm)) {
-			DMERR("sm_disk_create failed");
-			r = PTR_ERR(pmd-&gt;data_sm);
-			goto bad;
-		}
-	} else {
-		struct thin_disk_superblock *disk_super;
-
-		r = dm_bm_read_lock(pmd-&gt;bm, THIN_SUPERBLOCK_LOCATION,
-				    &amp;sb_validator, &amp;sblock);
-		if (r &lt; 0) {
-			DMERR("couldn't read superblock");
-			return r;
-		}
-
-		disk_super = dm_block_data(sblock);
-		r = dm_tm_open_with_sm(pmd-&gt;bm, THIN_SUPERBLOCK_LOCATION,
-				       disk_super-&gt;metadata_space_map_root,
-				       sizeof(disk_super-&gt;metadata_space_map_root),
-				       &amp;pmd-&gt;tm, &amp;pmd-&gt;metadata_sm);
-		if (r &lt; 0) {
-			DMERR("tm_open_with_sm failed");
-			dm_bm_unlock(sblock);
-			return r;
-		}
-
-		pmd-&gt;data_sm = dm_sm_disk_open(pmd-&gt;tm, disk_super-&gt;data_space_map_root,
-					       sizeof(disk_super-&gt;data_space_map_root));
-		if (IS_ERR(pmd-&gt;data_sm)) {
-			DMERR("sm_disk_open failed");
-			dm_bm_unlock(sblock);
-			r = PTR_ERR(pmd-&gt;data_sm);
-			goto bad;
-		}
+	r = dm_tm_create_with_sm(pmd-&gt;bm, THIN_SUPERBLOCK_LOCATION,
+				 &amp;pmd-&gt;tm, &amp;pmd-&gt;metadata_sm);
+	if (r &lt; 0) {
+		DMERR("tm_create_with_sm failed");
+		return r;
+	}
 
-		dm_bm_unlock(sblock);
+	pmd-&gt;data_sm = dm_sm_disk_create(pmd-&gt;tm, nr_blocks);
+	if (IS_ERR(pmd-&gt;data_sm)) {
+		DMERR("sm_disk_create failed");
+		r = PTR_ERR(pmd-&gt;data_sm);
+		goto bad;
 	}
 
 	pmd-&gt;nb_tm = dm_tm_create_non_blocking_clone(pmd-&gt;tm);
@@ -552,9 +517,6 @@ static int __open_or_format_metadata(str
 	pmd-&gt;trans_id = 0;
 	pmd-&gt;flags = 0;
 
-	if (!create)
-		return 0;
-
 	r = dm_btree_empty(&amp;pmd-&gt;info, &amp;pmd-&gt;root);
 	if (r &lt; 0)
 		goto bad_data_sm;
@@ -580,6 +542,68 @@ bad:
 	return r;
 }
 
+static int __open_metadata(struct dm_pool_metadata *pmd)
+{
+	int r;
+	struct dm_block *sblock;
+	struct thin_disk_superblock *disk_super;
+
+	r = dm_bm_read_lock(pmd-&gt;bm, THIN_SUPERBLOCK_LOCATION,
+			    &amp;sb_validator, &amp;sblock);
+	if (r &lt; 0) {
+		DMERR("couldn't read superblock");
+		return r;
+	}
+
+	disk_super = dm_block_data(sblock);
+	r = dm_tm_open_with_sm(pmd-&gt;bm, THIN_SUPERBLOCK_LOCATION,
+			       disk_super-&gt;metadata_space_map_root,
+			       sizeof(disk_super-&gt;metadata_space_map_root),
+			       &amp;pmd-&gt;tm, &amp;pmd-&gt;metadata_sm);
+	if (r &lt; 0) {
+		DMERR("tm_open_with_sm failed");
+		dm_bm_unlock(sblock);
+		return r;
+	}
+
+	pmd-&gt;data_sm = dm_sm_disk_open(pmd-&gt;tm, disk_super-&gt;data_space_map_root,
+				       sizeof(disk_super-&gt;data_space_map_root));
+	if (IS_ERR(pmd-&gt;data_sm)) {
+		DMERR("sm_disk_open failed");
+		dm_bm_unlock(sblock);
+		r = PTR_ERR(pmd-&gt;data_sm);
+		goto bad;
+	}
+
+	dm_bm_unlock(sblock);
+
+	pmd-&gt;nb_tm = dm_tm_create_non_blocking_clone(pmd-&gt;tm);
+	if (!pmd-&gt;nb_tm) {
+		DMERR("could not create clone tm");
+		r = -ENOMEM;
+		goto bad_data_sm;
+	}
+
+	__setup_btree_details(pmd);
+
+bad_data_sm:
+	dm_sm_destroy(pmd-&gt;data_sm);
+bad:
+	dm_tm_destroy(pmd-&gt;tm);
+	dm_sm_destroy(pmd-&gt;metadata_sm);
+
+	return r;
+}
+
+static int __open_or_format_metadata(struct dm_pool_metadata *pmd,
+				     dm_block_t nr_blocks, int create)
+{
+	if (create)
+		return __format_metadata(pmd, nr_blocks);
+	else
+		return __open_metadata(pmd);
+}
+
 static int __create_persistent_data_objects(struct dm_pool_metadata *pmd,
 					    dm_block_t nr_blocks, int *create)
 {
</pre></body></html>