diff options
author | Joe Thornber <ejt@redhat.com> | 2012-07-27 16:08:14 +0200 |
---|---|---|
committer | Alasdair G Kergon <agk@redhat.com> | 2012-07-27 16:08:14 +0200 |
commit | 66b1edc05e3f4c1227f51e40f2ead3e973c00cb0 (patch) | |
tree | e9c549057d91f1bb57755b1ac0a38512fcea3664 /drivers/md/dm-thin-metadata.c | |
parent | dm thin metadata: tidy up open and format error paths (diff) | |
download | linux-66b1edc05e3f4c1227f51e40f2ead3e973c00cb0.tar.xz linux-66b1edc05e3f4c1227f51e40f2ead3e973c00cb0.zip |
dm thin metadata: add format option to dm_pool_metadata_open
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 <ejt@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Signed-off-by: Alasdair G Kergon <agk@redhat.com>
Diffstat (limited to 'drivers/md/dm-thin-metadata.c')
-rw-r--r-- | drivers/md/dm-thin-metadata.c | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/drivers/md/dm-thin-metadata.c b/drivers/md/dm-thin-metadata.c index 1b6d2857b3f1..5ae31185e47c 100644 --- a/drivers/md/dm-thin-metadata.c +++ b/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(struct dm_pool_metadata *pmd) 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_objects(struct dm_pool_metadata *pmd) 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_metadata_open(struct block_device *bdev, 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); |