diff options
| author | Joe Thornber <ejt@redhat.com> | 2012-07-27 10:08:09 -0400 |
|---|---|---|
| committer | Alasdair G Kergon <agk@redhat.com> | 2012-07-27 10:08:09 -0400 |
| commit | 384ef0e62e409e52c80adef5b1ff83075377c19e (patch) | |
| tree | 734db218c323e88a303f64218661286f94f9e52a /drivers/md/persistent-data | |
| parent | eb04cf634fc2d5e3bc8fe88fbf434eda4921d875 (diff) | |
dm persistent data: tidy transaction manager creation fns
Tidy the transaction manager creation functions.
They no longer lock the superblock. Superblock locking is pulled out to
the caller.
Also export dm_bm_write_lock_zero.
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/persistent-data')
| -rw-r--r-- | drivers/md/persistent-data/dm-block-manager.c | 1 | ||||
| -rw-r--r-- | drivers/md/persistent-data/dm-transaction-manager.c | 47 | ||||
| -rw-r--r-- | drivers/md/persistent-data/dm-transaction-manager.h | 11 |
3 files changed, 19 insertions, 40 deletions
diff --git a/drivers/md/persistent-data/dm-block-manager.c b/drivers/md/persistent-data/dm-block-manager.c index c70ad6e303d3..4b5c504f47af 100644 --- a/drivers/md/persistent-data/dm-block-manager.c +++ b/drivers/md/persistent-data/dm-block-manager.c | |||
| @@ -565,6 +565,7 @@ int dm_bm_write_lock_zero(struct dm_block_manager *bm, | |||
| 565 | 565 | ||
| 566 | return 0; | 566 | return 0; |
| 567 | } | 567 | } |
| 568 | EXPORT_SYMBOL_GPL(dm_bm_write_lock_zero); | ||
| 568 | 569 | ||
| 569 | int dm_bm_unlock(struct dm_block *b) | 570 | int dm_bm_unlock(struct dm_block *b) |
| 570 | { | 571 | { |
diff --git a/drivers/md/persistent-data/dm-transaction-manager.c b/drivers/md/persistent-data/dm-transaction-manager.c index 86c3705052a4..b4f05830af07 100644 --- a/drivers/md/persistent-data/dm-transaction-manager.c +++ b/drivers/md/persistent-data/dm-transaction-manager.c | |||
| @@ -310,12 +310,10 @@ struct dm_block_manager *dm_tm_get_bm(struct dm_transaction_manager *tm) | |||
| 310 | 310 | ||
| 311 | static int dm_tm_create_internal(struct dm_block_manager *bm, | 311 | static int dm_tm_create_internal(struct dm_block_manager *bm, |
| 312 | dm_block_t sb_location, | 312 | dm_block_t sb_location, |
| 313 | struct dm_block_validator *sb_validator, | ||
| 314 | size_t root_offset, size_t root_max_len, | ||
| 315 | struct dm_transaction_manager **tm, | 313 | struct dm_transaction_manager **tm, |
| 316 | struct dm_space_map **sm, | 314 | struct dm_space_map **sm, |
| 317 | struct dm_block **sblock, | 315 | int create, |
| 318 | int create) | 316 | void *sm_root, size_t sm_len) |
| 319 | { | 317 | { |
| 320 | int r; | 318 | int r; |
| 321 | 319 | ||
| @@ -330,64 +328,43 @@ static int dm_tm_create_internal(struct dm_block_manager *bm, | |||
| 330 | } | 328 | } |
| 331 | 329 | ||
| 332 | if (create) { | 330 | if (create) { |
| 333 | r = dm_bm_write_lock_zero(dm_tm_get_bm(*tm), sb_location, | ||
| 334 | sb_validator, sblock); | ||
| 335 | if (r < 0) { | ||
| 336 | DMERR("couldn't lock superblock"); | ||
| 337 | goto bad1; | ||
| 338 | } | ||
| 339 | |||
| 340 | r = dm_sm_metadata_create(*sm, *tm, dm_bm_nr_blocks(bm), | 331 | r = dm_sm_metadata_create(*sm, *tm, dm_bm_nr_blocks(bm), |
| 341 | sb_location); | 332 | sb_location); |
| 342 | if (r) { | 333 | if (r) { |
| 343 | DMERR("couldn't create metadata space map"); | 334 | DMERR("couldn't create metadata space map"); |
| 344 | goto bad2; | 335 | goto bad; |
| 345 | } | 336 | } |
| 346 | 337 | ||
| 347 | } else { | 338 | } else { |
| 348 | r = dm_bm_write_lock(dm_tm_get_bm(*tm), sb_location, | 339 | r = dm_sm_metadata_open(*sm, *tm, sm_root, sm_len); |
| 349 | sb_validator, sblock); | ||
| 350 | if (r < 0) { | ||
| 351 | DMERR("couldn't lock superblock"); | ||
| 352 | goto bad1; | ||
| 353 | } | ||
| 354 | |||
| 355 | r = dm_sm_metadata_open(*sm, *tm, | ||
| 356 | dm_block_data(*sblock) + root_offset, | ||
| 357 | root_max_len); | ||
| 358 | if (r) { | 340 | if (r) { |
| 359 | DMERR("couldn't open metadata space map"); | 341 | DMERR("couldn't open metadata space map"); |
| 360 | goto bad2; | 342 | goto bad; |
| 361 | } | 343 | } |
| 362 | } | 344 | } |
| 363 | 345 | ||
| 364 | return 0; | 346 | return 0; |
| 365 | 347 | ||
| 366 | bad2: | 348 | bad: |
| 367 | dm_tm_unlock(*tm, *sblock); | ||
| 368 | bad1: | ||
| 369 | dm_tm_destroy(*tm); | 349 | dm_tm_destroy(*tm); |
| 350 | dm_sm_destroy(*sm); | ||
| 370 | return r; | 351 | return r; |
| 371 | } | 352 | } |
| 372 | 353 | ||
| 373 | int dm_tm_create_with_sm(struct dm_block_manager *bm, dm_block_t sb_location, | 354 | int dm_tm_create_with_sm(struct dm_block_manager *bm, dm_block_t sb_location, |
| 374 | struct dm_block_validator *sb_validator, | ||
| 375 | struct dm_transaction_manager **tm, | 355 | struct dm_transaction_manager **tm, |
| 376 | struct dm_space_map **sm, struct dm_block **sblock) | 356 | struct dm_space_map **sm) |
| 377 | { | 357 | { |
| 378 | return dm_tm_create_internal(bm, sb_location, sb_validator, | 358 | return dm_tm_create_internal(bm, sb_location, tm, sm, 1, NULL, 0); |
| 379 | 0, 0, tm, sm, sblock, 1); | ||
| 380 | } | 359 | } |
| 381 | EXPORT_SYMBOL_GPL(dm_tm_create_with_sm); | 360 | EXPORT_SYMBOL_GPL(dm_tm_create_with_sm); |
| 382 | 361 | ||
| 383 | int dm_tm_open_with_sm(struct dm_block_manager *bm, dm_block_t sb_location, | 362 | int dm_tm_open_with_sm(struct dm_block_manager *bm, dm_block_t sb_location, |
| 384 | struct dm_block_validator *sb_validator, | 363 | void *sm_root, size_t root_len, |
| 385 | size_t root_offset, size_t root_max_len, | ||
| 386 | struct dm_transaction_manager **tm, | 364 | struct dm_transaction_manager **tm, |
| 387 | struct dm_space_map **sm, struct dm_block **sblock) | 365 | struct dm_space_map **sm) |
| 388 | { | 366 | { |
| 389 | return dm_tm_create_internal(bm, sb_location, sb_validator, root_offset, | 367 | return dm_tm_create_internal(bm, sb_location, tm, sm, 0, sm_root, root_len); |
| 390 | root_max_len, tm, sm, sblock, 0); | ||
| 391 | } | 368 | } |
| 392 | EXPORT_SYMBOL_GPL(dm_tm_open_with_sm); | 369 | EXPORT_SYMBOL_GPL(dm_tm_open_with_sm); |
| 393 | 370 | ||
diff --git a/drivers/md/persistent-data/dm-transaction-manager.h b/drivers/md/persistent-data/dm-transaction-manager.h index 6da784871db4..b5b139076ca5 100644 --- a/drivers/md/persistent-data/dm-transaction-manager.h +++ b/drivers/md/persistent-data/dm-transaction-manager.h | |||
| @@ -115,16 +115,17 @@ struct dm_block_manager *dm_tm_get_bm(struct dm_transaction_manager *tm); | |||
| 115 | * | 115 | * |
| 116 | * Returns a tm that has an open transaction to write the new disk sm. | 116 | * Returns a tm that has an open transaction to write the new disk sm. |
| 117 | * Caller should store the new sm root and commit. | 117 | * Caller should store the new sm root and commit. |
| 118 | * | ||
| 119 | * The superblock location is passed so the metadata space map knows it | ||
| 120 | * shouldn't be used. | ||
| 118 | */ | 121 | */ |
| 119 | int dm_tm_create_with_sm(struct dm_block_manager *bm, dm_block_t sb_location, | 122 | int dm_tm_create_with_sm(struct dm_block_manager *bm, dm_block_t sb_location, |
| 120 | struct dm_block_validator *sb_validator, | ||
| 121 | struct dm_transaction_manager **tm, | 123 | struct dm_transaction_manager **tm, |
| 122 | struct dm_space_map **sm, struct dm_block **sblock); | 124 | struct dm_space_map **sm); |
| 123 | 125 | ||
| 124 | int dm_tm_open_with_sm(struct dm_block_manager *bm, dm_block_t sb_location, | 126 | int dm_tm_open_with_sm(struct dm_block_manager *bm, dm_block_t sb_location, |
| 125 | struct dm_block_validator *sb_validator, | 127 | void *sm_root, size_t root_len, |
| 126 | size_t root_offset, size_t root_max_len, | ||
| 127 | struct dm_transaction_manager **tm, | 128 | struct dm_transaction_manager **tm, |
| 128 | struct dm_space_map **sm, struct dm_block **sblock); | 129 | struct dm_space_map **sm); |
| 129 | 130 | ||
| 130 | #endif /* _LINUX_DM_TRANSACTION_MANAGER_H */ | 131 | #endif /* _LINUX_DM_TRANSACTION_MANAGER_H */ |
