]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
dm thin metadata: add format option to dm_pool_metadata_open
authorJoe Thornber <ejt@redhat.com>
Fri, 27 Jul 2012 14:08:14 +0000 (15:08 +0100)
committerAlasdair G Kergon <agk@redhat.com>
Fri, 27 Jul 2012 14:08:14 +0000 (15:08 +0100)
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>
drivers/md/dm-thin-metadata.c
drivers/md/dm-thin-metadata.h
drivers/md/dm-thin.c

index 1b6d2857b3f1d321bca36a1ae613a40dd126c5b6..5ae31185e47caad41e3b67e8fb7fb17a27154a10 100644 (file)
@@ -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);
index 7b47c0a9a8e3bf5fbe6eacfa1fa8d3c1e3b0959d..7e6656c49bd5707eb5f34d48c0101b2d69582079 100644 (file)
@@ -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 026215566abd57a35082a58fbbb842f6bed43aa5..bc9d08c0218b782459f692277a43a0109ef0256e 100644 (file)
@@ -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, true);
        if (IS_ERR(pmd)) {
                *error = "Error creating metadata object";
                return (struct pool *)pmd;