From a2af4f81e1f0ce0c7432d91d7f8a173b48d74c0d Mon Sep 17 00:00:00 2001 From: Joe Thornber Date: Tue, 10 Jul 2012 19:14:53 +0100 Subject: [PATCH 13/34] dm thin metadata: factor some code out of dm_pool_metadata_open Code tidy. Move block manager creation and the check for unformatted metadata to new function __create_persistent_data_objects(). Signed-off-by: Joe Thornber Signed-off-by: Mike Snitzer --- drivers/md/dm-thin-metadata.c | 55 ++++++++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 23 deletions(-) Index: linux-2.6/drivers/md/dm-thin-metadata.c =================================================================== --- linux-2.6.orig/drivers/md/dm-thin-metadata.c +++ linux-2.6/drivers/md/dm-thin-metadata.c @@ -422,9 +422,9 @@ static void __setup_btree_details(struct pmd->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,33 @@ bad: 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 (!pmd->bm) { + DMERR("could not create block manager"); + return -ENOMEM; + } + + 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 +693,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->bd_inode) >> SECTOR_SHIFT; - struct dm_block_manager *bm; int create; struct dm_block *sblock; @@ -676,30 +702,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 (!bm) { - DMERR("could not create block manager"); - kfree(pmd); - return ERR_PTR(-ENOMEM); - } - - 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);