From: Joe Thornber Add a parameter to dm_pool_metadata_open to indicate whether or not an unformatted metadata area should be formatted. Signed-off-by: Joe Thornber Signed-off-by: Mike Snitzer Signed-off-by: Alasdair G Kergon --- drivers/md/dm-thin-metadata.c | 17 +++++++++-------- drivers/md/dm-thin-metadata.h | 3 ++- drivers/md/dm-thin.c | 2 +- 3 files changed, 12 insertions(+), 10 deletions(-) Index: linux-3.5-rc7/drivers/md/dm-thin-metadata.c =================================================================== --- linux-3.5-rc7.orig/drivers/md/dm-thin-metadata.c +++ linux-3.5-rc7/drivers/md/dm-thin-metadata.c @@ -624,7 +624,7 @@ bad_unlock_sblock: return r; } -static int __open_or_format_metadata(struct dm_pool_metadata *pmd) +static int __open_or_format_metadata(struct dm_pool_metadata *pmd, bool format_device) { int r, unformatted; @@ -633,12 +633,12 @@ static int __open_or_format_metadata(str return r; if (unformatted) - return __format_metadata(pmd); - else - return __open_metadata(pmd); + return format_device ? __format_metadata(pmd) : -EPERM; + + return __open_metadata(pmd); } -static int __create_persistent_data_objects(struct dm_pool_metadata *pmd) +static int __create_persistent_data_objects(struct dm_pool_metadata *pmd, bool format_device) { int r; @@ -650,7 +650,7 @@ static int __create_persistent_data_obje return PTR_ERR(pmd->bm); } - r = __open_or_format_metadata(pmd); + r = __open_or_format_metadata(pmd, format_device); if (r) dm_block_manager_destroy(pmd->bm); @@ -792,7 +792,8 @@ out_locked: } struct dm_pool_metadata *dm_pool_metadata_open(struct block_device *bdev, - sector_t data_block_size) + sector_t data_block_size, + bool format_device) { int r; struct dm_pool_metadata *pmd; @@ -809,7 +810,7 @@ struct dm_pool_metadata *dm_pool_metadat pmd->bdev = bdev; pmd->data_block_size = data_block_size; - r = __create_persistent_data_objects(pmd); + r = __create_persistent_data_objects(pmd, format_device); if (r) { kfree(pmd); return ERR_PTR(r); Index: linux-3.5-rc7/drivers/md/dm-thin-metadata.h =================================================================== --- linux-3.5-rc7.orig/drivers/md/dm-thin-metadata.h +++ linux-3.5-rc7/drivers/md/dm-thin-metadata.h @@ -38,7 +38,8 @@ typedef uint64_t dm_thin_id; * Reopens or creates a new, empty metadata volume. */ struct dm_pool_metadata *dm_pool_metadata_open(struct block_device *bdev, - sector_t data_block_size); + sector_t data_block_size, + bool format_device); int dm_pool_metadata_close(struct dm_pool_metadata *pmd); Index: linux-3.5-rc7/drivers/md/dm-thin.c =================================================================== --- linux-3.5-rc7.orig/drivers/md/dm-thin.c +++ linux-3.5-rc7/drivers/md/dm-thin.c @@ -1712,7 +1712,7 @@ static struct pool *pool_create(struct m struct pool *pool; struct dm_pool_metadata *pmd; - pmd = dm_pool_metadata_open(metadata_dev, block_size); + pmd = dm_pool_metadata_open(metadata_dev, block_size, true); if (IS_ERR(pmd)) { *error = "Error creating metadata object"; return (struct pool *)pmd;