aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/md/dm-thin-metadata.c44
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
425static int __begin_transaction(struct dm_pool_metadata *pmd);
425static int __write_initial_superblock(struct dm_pool_metadata *pmd) 426static 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
487bad_locked:
488 dm_bm_unlock(sblock);
457 return r; 489 return r;
458} 490}
459 491