diff options
Diffstat (limited to 'drivers/md/persistent-data/dm-btree-remove.c')
| -rw-r--r-- | drivers/md/persistent-data/dm-btree-remove.c | 46 | 
1 files changed, 24 insertions, 22 deletions
| diff --git a/drivers/md/persistent-data/dm-btree-remove.c b/drivers/md/persistent-data/dm-btree-remove.c index c4f28133ef8..b88757cd0d1 100644 --- a/drivers/md/persistent-data/dm-btree-remove.c +++ b/drivers/md/persistent-data/dm-btree-remove.c @@ -139,15 +139,8 @@ struct child {  	struct btree_node *n;  }; -static struct dm_btree_value_type le64_type = { -	.context = NULL, -	.size = sizeof(__le64), -	.inc = NULL, -	.dec = NULL, -	.equal = NULL -}; - -static int init_child(struct dm_btree_info *info, struct btree_node *parent, +static int init_child(struct dm_btree_info *info, struct dm_btree_value_type *vt, +		      struct btree_node *parent,  		      unsigned index, struct child *result)  {  	int r, inc; @@ -164,7 +157,7 @@ static int init_child(struct dm_btree_info *info, struct btree_node *parent,  	result->n = dm_block_data(result->block);  	if (inc) -		inc_children(info->tm, result->n, &le64_type); +		inc_children(info->tm, result->n, vt);  	*((__le64 *) value_ptr(parent, index)) =  		cpu_to_le64(dm_block_location(result->block)); @@ -236,7 +229,7 @@ static void __rebalance2(struct dm_btree_info *info, struct btree_node *parent,  }  static int rebalance2(struct shadow_spine *s, struct dm_btree_info *info, -		      unsigned left_index) +		      struct dm_btree_value_type *vt, unsigned left_index)  {  	int r;  	struct btree_node *parent; @@ -244,11 +237,11 @@ static int rebalance2(struct shadow_spine *s, struct dm_btree_info *info,  	parent = dm_block_data(shadow_current(s)); -	r = init_child(info, parent, left_index, &left); +	r = init_child(info, vt, parent, left_index, &left);  	if (r)  		return r; -	r = init_child(info, parent, left_index + 1, &right); +	r = init_child(info, vt, parent, left_index + 1, &right);  	if (r) {  		exit_child(info, &left);  		return r; @@ -368,7 +361,7 @@ static void __rebalance3(struct dm_btree_info *info, struct btree_node *parent,  }  static int rebalance3(struct shadow_spine *s, struct dm_btree_info *info, -		      unsigned left_index) +		      struct dm_btree_value_type *vt, unsigned left_index)  {  	int r;  	struct btree_node *parent = dm_block_data(shadow_current(s)); @@ -377,17 +370,17 @@ static int rebalance3(struct shadow_spine *s, struct dm_btree_info *info,  	/*  	 * FIXME: fill out an array?  	 */ -	r = init_child(info, parent, left_index, &left); +	r = init_child(info, vt, parent, left_index, &left);  	if (r)  		return r; -	r = init_child(info, parent, left_index + 1, ¢er); +	r = init_child(info, vt, parent, left_index + 1, ¢er);  	if (r) {  		exit_child(info, &left);  		return r;  	} -	r = init_child(info, parent, left_index + 2, &right); +	r = init_child(info, vt, parent, left_index + 2, &right);  	if (r) {  		exit_child(info, &left);  		exit_child(info, ¢er); @@ -434,7 +427,8 @@ static int get_nr_entries(struct dm_transaction_manager *tm,  }  static int rebalance_children(struct shadow_spine *s, -			      struct dm_btree_info *info, uint64_t key) +			      struct dm_btree_info *info, +			      struct dm_btree_value_type *vt, uint64_t key)  {  	int i, r, has_left_sibling, has_right_sibling;  	uint32_t child_entries; @@ -472,13 +466,13 @@ static int rebalance_children(struct shadow_spine *s,  	has_right_sibling = i < (le32_to_cpu(n->header.nr_entries) - 1);  	if (!has_left_sibling) -		r = rebalance2(s, info, i); +		r = rebalance2(s, info, vt, i);  	else if (!has_right_sibling) -		r = rebalance2(s, info, i - 1); +		r = rebalance2(s, info, vt, i - 1);  	else -		r = rebalance3(s, info, i - 1); +		r = rebalance3(s, info, vt, i - 1);  	return r;  } @@ -529,7 +523,7 @@ static int remove_raw(struct shadow_spine *s, struct dm_btree_info *info,  		if (le32_to_cpu(n->header.flags) & LEAF_NODE)  			return do_leaf(n, key, index); -		r = rebalance_children(s, info, key); +		r = rebalance_children(s, info, vt, key);  		if (r)  			break; @@ -550,6 +544,14 @@ static int remove_raw(struct shadow_spine *s, struct dm_btree_info *info,  	return r;  } +static struct dm_btree_value_type le64_type = { +	.context = NULL, +	.size = sizeof(__le64), +	.inc = NULL, +	.dec = NULL, +	.equal = NULL +}; +  int dm_btree_remove(struct dm_btree_info *info, dm_block_t root,  		    uint64_t *keys, dm_block_t *new_root)  { |