diff options
| author | Joe Thornber <ejt@redhat.com> | 2012-07-27 15:08:09 +0100 | 
|---|---|---|
| committer | Alasdair G Kergon <agk@redhat.com> | 2012-07-27 15:08:09 +0100 | 
| 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,  	return 0;  } +EXPORT_SYMBOL_GPL(dm_bm_write_lock_zero);  int dm_bm_unlock(struct dm_block *b)  { 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)  static int dm_tm_create_internal(struct dm_block_manager *bm,  				 dm_block_t sb_location, -				 struct dm_block_validator *sb_validator, -				 size_t root_offset, size_t root_max_len,  				 struct dm_transaction_manager **tm,  				 struct dm_space_map **sm, -				 struct dm_block **sblock, -				 int create) +				 int create, +				 void *sm_root, size_t sm_len)  {  	int r; @@ -330,64 +328,43 @@ static int dm_tm_create_internal(struct dm_block_manager *bm,  	}  	if (create) { -		r = dm_bm_write_lock_zero(dm_tm_get_bm(*tm), sb_location, -					  sb_validator, sblock); -		if (r < 0) { -			DMERR("couldn't lock superblock"); -			goto bad1; -		} -  		r = dm_sm_metadata_create(*sm, *tm, dm_bm_nr_blocks(bm),  					  sb_location);  		if (r) {  			DMERR("couldn't create metadata space map"); -			goto bad2; +			goto bad;  		}  	} else { -		r = dm_bm_write_lock(dm_tm_get_bm(*tm), sb_location, -				     sb_validator, sblock); -		if (r < 0) { -			DMERR("couldn't lock superblock"); -			goto bad1; -		} - -		r = dm_sm_metadata_open(*sm, *tm, -					dm_block_data(*sblock) + root_offset, -					root_max_len); +		r = dm_sm_metadata_open(*sm, *tm, sm_root, sm_len);  		if (r) {  			DMERR("couldn't open metadata space map"); -			goto bad2; +			goto bad;  		}  	}  	return 0; -bad2: -	dm_tm_unlock(*tm, *sblock); -bad1: +bad:  	dm_tm_destroy(*tm); +	dm_sm_destroy(*sm);  	return r;  }  int dm_tm_create_with_sm(struct dm_block_manager *bm, dm_block_t sb_location, -			 struct dm_block_validator *sb_validator,  			 struct dm_transaction_manager **tm, -			 struct dm_space_map **sm, struct dm_block **sblock) +			 struct dm_space_map **sm)  { -	return dm_tm_create_internal(bm, sb_location, sb_validator, -				     0, 0, tm, sm, sblock, 1); +	return dm_tm_create_internal(bm, sb_location, tm, sm, 1, NULL, 0);  }  EXPORT_SYMBOL_GPL(dm_tm_create_with_sm);  int dm_tm_open_with_sm(struct dm_block_manager *bm, dm_block_t sb_location, -		       struct dm_block_validator *sb_validator, -		       size_t root_offset, size_t root_max_len, +		       void *sm_root, size_t root_len,  		       struct dm_transaction_manager **tm, -		       struct dm_space_map **sm, struct dm_block **sblock) +		       struct dm_space_map **sm)  { -	return dm_tm_create_internal(bm, sb_location, sb_validator, root_offset, -				     root_max_len, tm, sm, sblock, 0); +	return dm_tm_create_internal(bm, sb_location, tm, sm, 0, sm_root, root_len);  }  EXPORT_SYMBOL_GPL(dm_tm_open_with_sm); 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);   *   * Returns a tm that has an open transaction to write the new disk sm.   * Caller should store the new sm root and commit. + * + * The superblock location is passed so the metadata space map knows it + * shouldn't be used.   */  int dm_tm_create_with_sm(struct dm_block_manager *bm, dm_block_t sb_location, -			 struct dm_block_validator *sb_validator,  			 struct dm_transaction_manager **tm, -			 struct dm_space_map **sm, struct dm_block **sblock); +			 struct dm_space_map **sm);  int dm_tm_open_with_sm(struct dm_block_manager *bm, dm_block_t sb_location, -		       struct dm_block_validator *sb_validator, -		       size_t root_offset, size_t root_max_len, +		       void *sm_root, size_t root_len,  		       struct dm_transaction_manager **tm, -		       struct dm_space_map **sm, struct dm_block **sblock); +		       struct dm_space_map **sm);  #endif	/* _LINUX_DM_TRANSACTION_MANAGER_H */ | 
