diff options
-rw-r--r-- | drivers/md/dm-thin-metadata.c | 44 |
1 files changed, 38 insertions, 6 deletions
diff --git a/drivers/md/dm-thin-metadata.c b/drivers/md/dm-thin-metadata.c index 5ead655706d4..2c44c5c10987 100644 --- a/drivers/md/dm-thin-metadata.c +++ b/drivers/md/dm-thin-metadata.c | |||
@@ -422,38 +422,70 @@ static void __setup_btree_details(struct dm_pool_metadata *pmd) | |||
422 | pmd->details_info.value_type.equal = NULL; | 422 | pmd->details_info.value_type.equal = NULL; |
423 | } | 423 | } |
424 | 424 | ||
425 | static int __begin_transaction(struct dm_pool_metadata *pmd); | ||
425 | static int __write_initial_superblock(struct dm_pool_metadata *pmd) | 426 | static int __write_initial_superblock(struct dm_pool_metadata *pmd) |
426 | { | 427 | { |
427 | int r; | 428 | int r; |
428 | struct dm_block *sblock; | 429 | struct dm_block *sblock; |
430 | size_t metadata_len, data_len; | ||
429 | struct thin_disk_superblock *disk_super; | 431 | struct thin_disk_superblock *disk_super; |
430 | sector_t bdev_size = i_size_read(pmd->bdev->bd_inode) >> SECTOR_SHIFT; | 432 | sector_t bdev_size = i_size_read(pmd->bdev->bd_inode) >> SECTOR_SHIFT; |
431 | 433 | ||
432 | if (bdev_size > THIN_METADATA_MAX_SECTORS) | 434 | if (bdev_size > THIN_METADATA_MAX_SECTORS) |
433 | bdev_size = THIN_METADATA_MAX_SECTORS; | 435 | bdev_size = THIN_METADATA_MAX_SECTORS; |
434 | 436 | ||
437 | r = dm_sm_root_size(pmd->metadata_sm, &metadata_len); | ||
438 | if (r < 0) | ||
439 | return r; | ||
440 | |||
441 | r = dm_sm_root_size(pmd->data_sm, &data_len); | ||
442 | if (r < 0) | ||
443 | return r; | ||
444 | |||
445 | r = dm_sm_commit(pmd->data_sm); | ||
446 | if (r < 0) | ||
447 | return r; | ||
448 | |||
449 | r = dm_tm_pre_commit(pmd->tm); | ||
450 | if (r < 0) | ||
451 | return r; | ||
452 | |||
435 | r = superblock_lock_zero(pmd, &sblock); | 453 | r = superblock_lock_zero(pmd, &sblock); |
436 | if (r) | 454 | if (r) |
437 | return r; | 455 | return r; |
438 | 456 | ||
439 | disk_super = dm_block_data(sblock); | 457 | disk_super = dm_block_data(sblock); |
458 | disk_super->flags = 0; | ||
440 | disk_super->magic = cpu_to_le64(THIN_SUPERBLOCK_MAGIC); | 459 | disk_super->magic = cpu_to_le64(THIN_SUPERBLOCK_MAGIC); |
441 | disk_super->version = cpu_to_le32(THIN_VERSION); | 460 | disk_super->version = cpu_to_le32(THIN_VERSION); |
442 | disk_super->time = 0; | 461 | disk_super->time = 0; |
462 | disk_super->trans_id = 0; | ||
463 | disk_super->held_root = 0; | ||
464 | |||
465 | r = dm_sm_copy_root(pmd->metadata_sm, &disk_super->metadata_space_map_root, | ||
466 | metadata_len); | ||
467 | if (r < 0) | ||
468 | goto bad_locked; | ||
469 | |||
470 | r = dm_sm_copy_root(pmd->data_sm, &disk_super->data_space_map_root, | ||
471 | data_len); | ||
472 | if (r < 0) | ||
473 | goto bad_locked; | ||
474 | |||
475 | disk_super->data_mapping_root = cpu_to_le64(pmd->root); | ||
476 | disk_super->device_details_root = cpu_to_le64(pmd->details_root); | ||
443 | disk_super->metadata_block_size = cpu_to_le32(THIN_METADATA_BLOCK_SIZE >> SECTOR_SHIFT); | 477 | disk_super->metadata_block_size = cpu_to_le32(THIN_METADATA_BLOCK_SIZE >> SECTOR_SHIFT); |
444 | disk_super->metadata_nr_blocks = cpu_to_le64(bdev_size >> SECTOR_TO_BLOCK_SHIFT); | 478 | disk_super->metadata_nr_blocks = cpu_to_le64(bdev_size >> SECTOR_TO_BLOCK_SHIFT); |
445 | disk_super->data_block_size = cpu_to_le32(pmd->data_block_size); | 479 | disk_super->data_block_size = cpu_to_le32(pmd->data_block_size); |
446 | 480 | ||
447 | r = dm_bm_unlock(sblock); | 481 | r = dm_tm_commit(pmd->tm, sblock); |
448 | if (r) | 482 | if (r) |
449 | return r; | 483 | return r; |
450 | 484 | ||
451 | pmd->flags = 0; | 485 | return __begin_transaction(pmd); |
452 | r = dm_pool_commit_metadata(pmd); | ||
453 | if (r < 0) | ||
454 | DMERR("%s: dm_pool_commit_metadata() failed, error = %d", | ||
455 | __func__, r); | ||
456 | 486 | ||
487 | bad_locked: | ||
488 | dm_bm_unlock(sblock); | ||
457 | return r; | 489 | return r; |
458 | } | 490 | } |
459 | 491 | ||