Commit 332627db authored by Joe Thornber's avatar Joe Thornber Committed by Alasdair G Kergon
Browse files

dm thin metadata: move bm creation code into create_persistent_data_objects



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

Signed-off-by: default avatarJoe Thornber <ejt@redhat.com>
Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
Signed-off-by: default avatarAlasdair G Kergon <agk@redhat.com>
parent 77f49a40
Loading
Loading
Loading
Loading
+32 −24
Original line number Diff line number Diff line
@@ -357,7 +357,7 @@ static int superblock_lock(struct dm_pool_metadata *pmd,
				&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,7 +422,7 @@ static void __setup_btree_details(struct dm_pool_metadata *pmd)
	pmd->details_info.value_type.equal = NULL;
}

static int __create_persistent_data_objects(struct dm_pool_metadata *pmd,
static int __open_or_format_metadata(struct dm_pool_metadata *pmd,
				     struct dm_block_manager *bm,
				     dm_block_t nr_blocks, int create)
{
@@ -509,6 +509,32 @@ static int __create_persistent_data_objects(struct dm_pool_metadata *pmd,
	return r;
}

static int __create_persistent_data_objects(struct dm_pool_metadata *pmd,
					    dm_block_t nr_blocks, int *create)
{
	int r;

	pmd->bm = dm_block_manager_create(pmd->bdev, THIN_METADATA_BLOCK_SIZE,
					  THIN_METADATA_CACHE_SIZE,
					  THIN_MAX_CONCURRENT_LOCKS);
	if (IS_ERR(pmd->bm)) {
		DMERR("could not create block manager");
		return PTR_ERR(pmd->bm);
	}

	r = __superblock_all_zeroes(pmd->bm, create);
	if (r) {
		dm_block_manager_destroy(pmd->bm);
		return r;
	}

	r = __open_or_format_metadata(pmd, pmd->bm, nr_blocks, *create);
	if (r)
		dm_block_manager_destroy(pmd->bm);

	return r;
}

static int __begin_transaction(struct dm_pool_metadata *pmd)
{
	int r;
@@ -666,7 +692,6 @@ struct dm_pool_metadata *dm_pool_metadata_open(struct block_device *bdev,
	struct thin_disk_superblock *disk_super;
	struct dm_pool_metadata *pmd;
	sector_t bdev_size = i_size_read(bdev->bd_inode) >> SECTOR_SHIFT;
	struct dm_block_manager *bm;
	int create;
	struct dm_block *sblock;

@@ -676,30 +701,13 @@ struct dm_pool_metadata *dm_pool_metadata_open(struct block_device *bdev,
		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, &create);
	if (r) {
		dm_block_manager_destroy(bm);
		kfree(pmd);
		return ERR_PTR(r);
	}
	pmd->bdev = bdev;

	r = __create_persistent_data_objects(pmd, bm, 0, create);
	r = __create_persistent_data_objects(pmd, 0, &create);
	if (r) {
		dm_block_manager_destroy(bm);
		kfree(pmd);
		return ERR_PTR(r);
	}
	pmd->bdev = bdev;

	if (!create) {
		r = __begin_transaction(pmd);