diff options
Diffstat (limited to 'fs/btrfs/ctree.c')
| -rw-r--r-- | fs/btrfs/ctree.c | 148 | 
1 files changed, 4 insertions, 144 deletions
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c index 6d183f60d63..b3343621100 100644 --- a/fs/btrfs/ctree.c +++ b/fs/btrfs/ctree.c @@ -4402,149 +4402,6 @@ void btrfs_extend_item(struct btrfs_trans_handle *trans,  }  /* - * Given a key and some data, insert items into the tree. - * This does all the path init required, making room in the tree if needed. - * Returns the number of keys that were inserted. - */ -int btrfs_insert_some_items(struct btrfs_trans_handle *trans, -			    struct btrfs_root *root, -			    struct btrfs_path *path, -			    struct btrfs_key *cpu_key, u32 *data_size, -			    int nr) -{ -	struct extent_buffer *leaf; -	struct btrfs_item *item; -	int ret = 0; -	int slot; -	int i; -	u32 nritems; -	u32 total_data = 0; -	u32 total_size = 0; -	unsigned int data_end; -	struct btrfs_disk_key disk_key; -	struct btrfs_key found_key; -	struct btrfs_map_token token; - -	btrfs_init_map_token(&token); - -	for (i = 0; i < nr; i++) { -		if (total_size + data_size[i] + sizeof(struct btrfs_item) > -		    BTRFS_LEAF_DATA_SIZE(root)) { -			break; -			nr = i; -		} -		total_data += data_size[i]; -		total_size += data_size[i] + sizeof(struct btrfs_item); -	} -	BUG_ON(nr == 0); - -	ret = btrfs_search_slot(trans, root, cpu_key, path, total_size, 1); -	if (ret == 0) -		return -EEXIST; -	if (ret < 0) -		goto out; - -	leaf = path->nodes[0]; - -	nritems = btrfs_header_nritems(leaf); -	data_end = leaf_data_end(root, leaf); - -	if (btrfs_leaf_free_space(root, leaf) < total_size) { -		for (i = nr; i >= 0; i--) { -			total_data -= data_size[i]; -			total_size -= data_size[i] + sizeof(struct btrfs_item); -			if (total_size < btrfs_leaf_free_space(root, leaf)) -				break; -		} -		nr = i; -	} - -	slot = path->slots[0]; -	BUG_ON(slot < 0); - -	if (slot != nritems) { -		unsigned int old_data = btrfs_item_end_nr(leaf, slot); - -		item = btrfs_item_nr(leaf, slot); -		btrfs_item_key_to_cpu(leaf, &found_key, slot); - -		/* figure out how many keys we can insert in here */ -		total_data = data_size[0]; -		for (i = 1; i < nr; i++) { -			if (btrfs_comp_cpu_keys(&found_key, cpu_key + i) <= 0) -				break; -			total_data += data_size[i]; -		} -		nr = i; - -		if (old_data < data_end) { -			btrfs_print_leaf(root, leaf); -			printk(KERN_CRIT "slot %d old_data %d data_end %d\n", -			       slot, old_data, data_end); -			BUG_ON(1); -		} -		/* -		 * item0..itemN ... dataN.offset..dataN.size .. data0.size -		 */ -		/* first correct the data pointers */ -		for (i = slot; i < nritems; i++) { -			u32 ioff; - -			item = btrfs_item_nr(leaf, i); -			ioff = btrfs_token_item_offset(leaf, item, &token); -			btrfs_set_token_item_offset(leaf, item, -						    ioff - total_data, &token); -		} -		/* shift the items */ -		memmove_extent_buffer(leaf, btrfs_item_nr_offset(slot + nr), -			      btrfs_item_nr_offset(slot), -			      (nritems - slot) * sizeof(struct btrfs_item)); - -		/* shift the data */ -		memmove_extent_buffer(leaf, btrfs_leaf_data(leaf) + -			      data_end - total_data, btrfs_leaf_data(leaf) + -			      data_end, old_data - data_end); -		data_end = old_data; -	} else { -		/* -		 * this sucks but it has to be done, if we are inserting at -		 * the end of the leaf only insert 1 of the items, since we -		 * have no way of knowing whats on the next leaf and we'd have -		 * to drop our current locks to figure it out -		 */ -		nr = 1; -	} - -	/* setup the item for the new data */ -	for (i = 0; i < nr; i++) { -		btrfs_cpu_key_to_disk(&disk_key, cpu_key + i); -		btrfs_set_item_key(leaf, &disk_key, slot + i); -		item = btrfs_item_nr(leaf, slot + i); -		btrfs_set_token_item_offset(leaf, item, -					    data_end - data_size[i], &token); -		data_end -= data_size[i]; -		btrfs_set_token_item_size(leaf, item, data_size[i], &token); -	} -	btrfs_set_header_nritems(leaf, nritems + nr); -	btrfs_mark_buffer_dirty(leaf); - -	ret = 0; -	if (slot == 0) { -		btrfs_cpu_key_to_disk(&disk_key, cpu_key); -		fixup_low_keys(trans, root, path, &disk_key, 1); -	} - -	if (btrfs_leaf_free_space(root, leaf) < 0) { -		btrfs_print_leaf(root, leaf); -		BUG(); -	} -out: -	if (!ret) -		ret = nr; -	return ret; -} - -/*   * this is a helper for btrfs_insert_empty_items, the main goal here is   * to save stack depth by doing the bulk of the work in a function   * that doesn't call btrfs_search_slot @@ -5073,6 +4930,7 @@ static void tree_move_down(struct btrfs_root *root,  			   struct btrfs_path *path,  			   int *level, int root_level)  { +	BUG_ON(*level == 0);  	path->nodes[*level - 1] = read_node_slot(root, path->nodes[*level],  					path->slots[*level]);  	path->slots[*level - 1] = 0; @@ -5089,7 +4947,7 @@ static int tree_move_next_or_upnext(struct btrfs_root *root,  	path->slots[*level]++; -	while (path->slots[*level] == nritems) { +	while (path->slots[*level] >= nritems) {  		if (*level == root_level)  			return -1; @@ -5433,9 +5291,11 @@ int btrfs_compare_trees(struct btrfs_root *left_root,  					goto out;  				advance_right = ADVANCE;  			} else { +				WARN_ON(!extent_buffer_uptodate(left_path->nodes[0]));  				ret = tree_compare_item(left_root, left_path,  						right_path, tmp_buf);  				if (ret) { +					WARN_ON(!extent_buffer_uptodate(left_path->nodes[0]));  					ret = changed_cb(left_root, right_root,  						left_path, right_path,  						&left_key,  |