Btrfs: Allow tails larger than one page

Signed-off-by: Chris Mason <chris.mason@oracle.com>
このコミットが含まれているのは:
Chris Mason
2007-10-15 16:18:25 -04:00
コミット 3326d1b07c
5個のファイルの変更155行の追加55行の削除

ファイルの表示

@@ -1766,8 +1766,9 @@ static int split_leaf(struct btrfs_trans_handle *trans, struct btrfs_root
/* first try to make some room by pushing left and right */
wret = push_leaf_left(trans, root, path, data_size);
if (wret < 0)
if (wret < 0) {
return wret;
}
if (wret) {
wret = push_leaf_right(trans, root, path, data_size);
if (wret < 0)
@@ -1777,8 +1778,9 @@ static int split_leaf(struct btrfs_trans_handle *trans, struct btrfs_root
/* did the pushes work? */
if (btrfs_leaf_free_space(root, l) >=
sizeof(struct btrfs_item) + data_size)
sizeof(struct btrfs_item) + data_size) {
return 0;
}
if (!path->nodes[1]) {
ret = insert_new_root(trans, root, path, 1);
@@ -1822,7 +1824,11 @@ static int split_leaf(struct btrfs_trans_handle *trans, struct btrfs_root
return ret;
}
mid = slot;
double_split = 1;
if (mid != nritems &&
leaf_space_used(l, mid, nritems - mid) +
space_needed > BTRFS_LEAF_DATA_SIZE(root)) {
double_split = 1;
}
}
} else {
if (leaf_space_used(l, 0, mid + 1) + space_needed >
@@ -1910,8 +1916,9 @@ static int split_leaf(struct btrfs_trans_handle *trans, struct btrfs_root
BUG_ON(path->slots[0] < 0);
if (!double_split)
if (!double_split) {
return ret;
}
right = btrfs_alloc_free_block(trans, root, root->leafsize,
l->start, 0);
@@ -2048,7 +2055,11 @@ int btrfs_extend_item(struct btrfs_trans_handle *trans,
old_data = btrfs_item_end_nr(leaf, slot);
BUG_ON(slot < 0);
BUG_ON(slot >= nritems);
if (slot >= nritems) {
btrfs_print_leaf(root, leaf);
printk("slot %d too large, nritems %d\n", slot, nritems);
BUG_ON(1);
}
/*
* item0..itemN ... dataN.offset..dataN.size .. data0.size
@@ -2132,6 +2143,9 @@ int btrfs_insert_empty_item(struct btrfs_trans_handle *trans,
if (btrfs_leaf_free_space(root, leaf) <
sizeof(struct btrfs_item) + data_size) {
btrfs_print_leaf(root, leaf);
printk("not enough freespace need %u have %d\n",
data_size, btrfs_leaf_free_space(root, leaf));
BUG();
}