From d658c031ea057acfad1ed918fc265456faa9f117 Mon Sep 17 00:00:00 2001 From: Joe Thornber Date: Thu, 12 Jul 2012 11:38:32 +0100 Subject: [PATCH 35/41] dm thin metadata: add a mode param to dm_pool_metadata_open Signed-off-by: Joe Thornber Signed-off-by: Mike Snitzer --- drivers/md/dm-thin-metadata.c | 17 ++++++++++------- drivers/md/dm-thin-metadata.h | 8 +++++++- drivers/md/dm-thin.c | 2 +- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/drivers/md/dm-thin-metadata.c b/drivers/md/dm-thin-metadata.c index 172f2ab..de69ef1 100644 --- a/drivers/md/dm-thin-metadata.c +++ b/drivers/md/dm-thin-metadata.c @@ -626,7 +626,8 @@ out_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, + enum dm_thin_metadata_mode mode) { int r, unformatted; @@ -635,12 +636,13 @@ static int __open_or_format_metadata(struct dm_pool_metadata *pmd) return r; if (unformatted) - return __format_metadata(pmd); + return (mode & DM_THIN_FORMAT) ? __format_metadata(pmd) : -EPERM; else - return __open_metadata(pmd); + return (mode & DM_THIN_OPEN) ? __open_metadata(pmd) : -EPERM; } -static int __create_persistent_data_objects(struct dm_pool_metadata *pmd) +static int __create_persistent_data_objects(struct dm_pool_metadata *pmd, + enum dm_thin_metadata_mode mode) { int r; @@ -652,7 +654,7 @@ static int __create_persistent_data_objects(struct dm_pool_metadata *pmd) return -ENOMEM; } - r = __open_or_format_metadata(pmd); + r = __open_or_format_metadata(pmd, mode); if (r) dm_block_manager_destroy(pmd->bm); @@ -794,7 +796,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, + enum dm_thin_metadata_mode mode) { int r; struct dm_pool_metadata *pmd; @@ -811,7 +814,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, mode); if (r) { kfree(pmd); return ERR_PTR(r); diff --git a/drivers/md/dm-thin-metadata.h b/drivers/md/dm-thin-metadata.h index 7b47c0a..2be27df 100644 --- a/drivers/md/dm-thin-metadata.h +++ b/drivers/md/dm-thin-metadata.h @@ -37,8 +37,14 @@ typedef uint64_t dm_thin_id; /* * Reopens or creates a new, empty metadata volume. */ +enum dm_thin_metadata_mode { + DM_THIN_OPEN = 1, + DM_THIN_FORMAT = 2 +}; + struct dm_pool_metadata *dm_pool_metadata_open(struct block_device *bdev, - sector_t data_block_size); + sector_t data_block_size, + enum dm_thin_metadata_mode mode); int dm_pool_metadata_close(struct dm_pool_metadata *pmd); diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c index 2042a1a..3b739d1 100644 --- a/drivers/md/dm-thin.c +++ b/drivers/md/dm-thin.c @@ -1712,7 +1712,7 @@ static struct pool *pool_create(struct mapped_device *pool_md, 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, DM_THIN_FORMAT | DM_THIN_OPEN); if (IS_ERR(pmd)) { *error = "Error creating metadata object"; return (struct pool *)pmd; -- 1.7.1