Commit b49fb112 authored by Jeff Mahoney's avatar Jeff Mahoney Committed by Jan Kara

reiserfs: balance_leaf refactor, move state variables into tree_balance

This patch pushes the rest of the state variables in balance_leaf into
the tree_balance structure so we can use them when we split balance_leaf
into separate functions.
Signed-off-by: default avatarJeff Mahoney <jeffm@suse.com>
Signed-off-by: default avatarJan Kara <jack@suse.cz>
parent 97fd4b97
...@@ -310,27 +310,9 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, ...@@ -310,27 +310,9 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih,
struct buffer_head **insert_ptr) struct buffer_head **insert_ptr)
{ {
struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path); struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path);
/* index into the array of item headers in S[0] of the affected item */
int item_pos = PATH_LAST_POSITION(tb->tb_path);
struct buffer_info bi; struct buffer_info bi;
/* new nodes allocated to hold what could not fit into S */
struct buffer_head *S_new[2];
/*
* number of items that will be placed into S_new
* (includes partially shifted items)
*/
int snum[2];
/*
* if an item is partially shifted into S_new then if it is a
* directory item it is the number of entries from the item that
* are shifted into S_new else it is the number of bytes from
* the item that are shifted into S_new
*/
int sbytes[2];
int n, i; int n, i;
int ret_val; int ret_val;
int pos_in_item;
int zeros_num;
PROC_INFO_INC(tb->tb_sb, balance_at[0]); PROC_INFO_INC(tb->tb_sb, balance_at[0]);
...@@ -338,29 +320,30 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, ...@@ -338,29 +320,30 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih,
if (tb->insert_size[0] < 0) if (tb->insert_size[0] < 0)
return balance_leaf_when_delete(tb, flag); return balance_leaf_when_delete(tb, flag);
zeros_num = 0; tb->item_pos = PATH_LAST_POSITION(tb->tb_path),
tb->pos_in_item = tb->tb_path->pos_in_item,
tb->zeroes_num = 0;
if (flag == M_INSERT && !body) if (flag == M_INSERT && !body)
zeros_num = ih_item_len(ih); tb->zeroes_num = ih_item_len(ih);
pos_in_item = tb->tb_path->pos_in_item;
/* /*
* for indirect item pos_in_item is measured in unformatted node * for indirect item pos_in_item is measured in unformatted node
* pointers. Recalculate to bytes * pointers. Recalculate to bytes
*/ */
if (flag != M_INSERT if (flag != M_INSERT
&& is_indirect_le_ih(item_head(tbS0, item_pos))) && is_indirect_le_ih(item_head(tbS0, tb->item_pos)))
pos_in_item *= UNFM_P_SIZE; tb->pos_in_item *= UNFM_P_SIZE;
if (tb->lnum[0] > 0) { if (tb->lnum[0] > 0) {
/* Shift lnum[0] items from S[0] to the left neighbor L[0] */ /* Shift lnum[0] items from S[0] to the left neighbor L[0] */
if (item_pos < tb->lnum[0]) { if (tb->item_pos < tb->lnum[0]) {
/* new item or it part falls to L[0], shift it too */ /* new item or it part falls to L[0], shift it too */
n = B_NR_ITEMS(tb->L[0]); n = B_NR_ITEMS(tb->L[0]);
switch (flag) { switch (flag) {
case M_INSERT: /* insert item into L[0] */ case M_INSERT: /* insert item into L[0] */
if (item_pos == tb->lnum[0] - 1 && tb->lbytes != -1) { if (tb->item_pos == tb->lnum[0] - 1 && tb->lbytes != -1) {
/* part of new item falls into L[0] */ /* part of new item falls into L[0] */
int new_item_len; int new_item_len;
int version; int version;
...@@ -379,8 +362,8 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, ...@@ -379,8 +362,8 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih,
/* Insert new item into L[0] */ /* Insert new item into L[0] */
buffer_info_init_left(tb, &bi); buffer_info_init_left(tb, &bi);
leaf_insert_into_buf(&bi, leaf_insert_into_buf(&bi,
n + item_pos - ret_val, ih, body, n + tb->item_pos - ret_val, ih, body,
zeros_num > ih_item_len(ih) ? ih_item_len(ih) : zeros_num); tb->zeroes_num > ih_item_len(ih) ? ih_item_len(ih) : tb->zeroes_num);
version = ih_version(ih); version = ih_version(ih);
...@@ -389,11 +372,11 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, ...@@ -389,11 +372,11 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih,
(tb-> lbytes << (is_indirect_le_ih(ih) ? tb->tb_sb-> s_blocksize_bits - UNFM_P_SHIFT : 0))); (tb-> lbytes << (is_indirect_le_ih(ih) ? tb->tb_sb-> s_blocksize_bits - UNFM_P_SHIFT : 0)));
put_ih_item_len(ih, new_item_len); put_ih_item_len(ih, new_item_len);
if (tb->lbytes > zeros_num) { if (tb->lbytes > tb->zeroes_num) {
body += (tb->lbytes - zeros_num); body += (tb->lbytes - tb->zeroes_num);
zeros_num = 0; tb->zeroes_num = 0;
} else } else
zeros_num -= tb->lbytes; tb->zeroes_num -= tb->lbytes;
RFALSE(ih_item_len(ih) <= 0, RFALSE(ih_item_len(ih) <= 0,
"PAP-12085: there is nothing to insert into S[0]: ih_item_len=%d", "PAP-12085: there is nothing to insert into S[0]: ih_item_len=%d",
...@@ -404,43 +387,43 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, ...@@ -404,43 +387,43 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih,
ret_val = leaf_shift_left(tb, tb->lnum[0] - 1, tb->lbytes); ret_val = leaf_shift_left(tb, tb->lnum[0] - 1, tb->lbytes);
/* Insert new item into L[0] */ /* Insert new item into L[0] */
buffer_info_init_left(tb, &bi); buffer_info_init_left(tb, &bi);
leaf_insert_into_buf(&bi, n + item_pos - ret_val, ih, body, zeros_num); leaf_insert_into_buf(&bi, n + tb->item_pos - ret_val, ih, body, tb->zeroes_num);
tb->insert_size[0] = 0; tb->insert_size[0] = 0;
zeros_num = 0; tb->zeroes_num = 0;
} }
break; break;
case M_PASTE: /* append item in L[0] */ case M_PASTE: /* append item in L[0] */
if (item_pos == tb->lnum[0] - 1 && tb->lbytes != -1) { if (tb->item_pos == tb->lnum[0] - 1 && tb->lbytes != -1) {
/* we must shift the part of the appended item */ /* we must shift the part of the appended item */
if (is_direntry_le_ih(item_head(tbS0, item_pos))) { if (is_direntry_le_ih(item_head(tbS0, tb->item_pos))) {
RFALSE(zeros_num, RFALSE(tb->zeroes_num,
"PAP-12090: invalid parameter in case of a directory"); "PAP-12090: invalid parameter in case of a directory");
/* directory item */ /* directory item */
if (tb->lbytes > pos_in_item) { if (tb->lbytes > tb->pos_in_item) {
/* new directory entry falls into L[0] */ /* new directory entry falls into L[0] */
struct item_head *pasted; struct item_head *pasted;
int l_pos_in_item = pos_in_item; int l_pos_in_item = tb->pos_in_item;
/* Shift lnum[0] - 1 items in whole. Shift lbytes - 1 entries from given directory item */ /* Shift lnum[0] - 1 items in whole. Shift lbytes - 1 entries from given directory item */
ret_val = leaf_shift_left(tb, tb->lnum[0], tb->lbytes-1); ret_val = leaf_shift_left(tb, tb->lnum[0], tb->lbytes-1);
if (ret_val && !item_pos) { if (ret_val && !tb->item_pos) {
pasted = item_head(tb->L[0], B_NR_ITEMS(tb->L[0]) - 1); pasted = item_head(tb->L[0], B_NR_ITEMS(tb->L[0]) - 1);
l_pos_in_item += ih_entry_count(pasted) - (tb->lbytes -1); l_pos_in_item += ih_entry_count(pasted) - (tb->lbytes -1);
} }
/* Append given directory entry to directory item */ /* Append given directory entry to directory item */
buffer_info_init_left(tb, &bi); buffer_info_init_left(tb, &bi);
leaf_paste_in_buffer(&bi, n + item_pos - ret_val, l_pos_in_item, tb->insert_size[0], body, zeros_num); leaf_paste_in_buffer(&bi, n + tb->item_pos - ret_val, l_pos_in_item, tb->insert_size[0], body, tb->zeroes_num);
/* previous string prepared space for pasting new entry, following string pastes this entry */ /* previous string prepared space for pasting new entry, following string pastes this entry */
/* when we have merge directory item, pos_in_item has been changed too */ /* when we have merge directory item, pos_in_item has been changed too */
/* paste new directory entry. 1 is entry number */ /* paste new directory entry. 1 is entry number */
leaf_paste_entries(&bi, n + item_pos - ret_val, l_pos_in_item, leaf_paste_entries(&bi, n + tb->item_pos - ret_val, l_pos_in_item,
1, (struct reiserfs_de_head *) body, 1, (struct reiserfs_de_head *) body,
body + DEH_SIZE, tb->insert_size[0]); body + DEH_SIZE, tb->insert_size[0]);
tb->insert_size[0] = 0; tb->insert_size[0] = 0;
...@@ -450,20 +433,20 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, ...@@ -450,20 +433,20 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih,
leaf_shift_left(tb, tb->lnum[0], tb->lbytes); leaf_shift_left(tb, tb->lnum[0], tb->lbytes);
} }
/* Calculate new position to append in item body */ /* Calculate new position to append in item body */
pos_in_item -= tb->lbytes; tb->pos_in_item -= tb->lbytes;
} else { } else {
/* regular object */ /* regular object */
RFALSE(tb->lbytes <= 0, "PAP-12095: there is nothing to shift to L[0]. lbytes=%d", tb->lbytes); RFALSE(tb->lbytes <= 0, "PAP-12095: there is nothing to shift to L[0]. lbytes=%d", tb->lbytes);
RFALSE(pos_in_item != ih_item_len(item_head(tbS0, item_pos)), RFALSE(tb->pos_in_item != ih_item_len(item_head(tbS0, tb->item_pos)),
"PAP-12100: incorrect position to paste: item_len=%d, pos_in_item=%d", "PAP-12100: incorrect position to paste: item_len=%d, pos_in_item=%d",
ih_item_len(item_head(tbS0, item_pos)),pos_in_item); ih_item_len(item_head(tbS0, tb->item_pos)), tb->pos_in_item);
if (tb->lbytes >= pos_in_item) { if (tb->lbytes >= tb->pos_in_item) {
/* appended item will be in L[0] in whole */ /* appended item will be in L[0] in whole */
int l_n; int l_n;
/* this bytes number must be appended to the last item of L[h] */ /* this bytes number must be appended to the last item of L[h] */
l_n = tb->lbytes - pos_in_item; l_n = tb->lbytes - tb->pos_in_item;
/* Calculate new insert_size[0] */ /* Calculate new insert_size[0] */
tb->insert_size[0] -= l_n; tb->insert_size[0] -= l_n;
...@@ -472,14 +455,14 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, ...@@ -472,14 +455,14 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih,
"PAP-12105: there is nothing to paste into L[0]. insert_size=%d", "PAP-12105: there is nothing to paste into L[0]. insert_size=%d",
tb->insert_size[0]); tb->insert_size[0]);
ret_val = leaf_shift_left(tb, tb->lnum[0], ih_item_len ret_val = leaf_shift_left(tb, tb->lnum[0], ih_item_len
(item_head(tbS0, item_pos))); (item_head(tbS0, tb->item_pos)));
/* Append to body of item in L[0] */ /* Append to body of item in L[0] */
buffer_info_init_left(tb, &bi); buffer_info_init_left(tb, &bi);
leaf_paste_in_buffer leaf_paste_in_buffer
(&bi, n + item_pos - ret_val, ih_item_len (&bi, n + tb->item_pos - ret_val, ih_item_len
(item_head(tb->L[0], n + item_pos - ret_val)), (item_head(tb->L[0], n + tb->item_pos - ret_val)),
l_n, body, l_n, body,
zeros_num > l_n ? l_n : zeros_num); tb->zeroes_num > l_n ? l_n : tb->zeroes_num);
/* 0-th item in S0 can be only of DIRECT type when l_n != 0 */ /* 0-th item in S0 can be only of DIRECT type when l_n != 0 */
{ {
int version; int version;
...@@ -488,9 +471,9 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, ...@@ -488,9 +471,9 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih,
RFALSE(ih_item_len(item_head(tbS0, 0)), RFALSE(ih_item_len(item_head(tbS0, 0)),
"PAP-12106: item length must be 0"); "PAP-12106: item length must be 0");
RFALSE(comp_short_le_keys(leaf_key(tbS0, 0), leaf_key RFALSE(comp_short_le_keys(leaf_key(tbS0, 0), leaf_key
(tb->L[0], n + item_pos - ret_val)), (tb->L[0], n + tb->item_pos - ret_val)),
"PAP-12107: items must be of the same file"); "PAP-12107: items must be of the same file");
if (is_indirect_le_ih(item_head(tb->L[0], n + item_pos - ret_val))) { if (is_indirect_le_ih(item_head(tb->L[0], n + tb->item_pos - ret_val))) {
temp_l = l_n << (tb->tb_sb-> s_blocksize_bits - UNFM_P_SHIFT); temp_l = l_n << (tb->tb_sb-> s_blocksize_bits - UNFM_P_SHIFT);
} }
/* update key of first item in S0 */ /* update key of first item in S0 */
...@@ -503,12 +486,12 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, ...@@ -503,12 +486,12 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih,
} }
/* Calculate new body, position in item and insert_size[0] */ /* Calculate new body, position in item and insert_size[0] */
if (l_n > zeros_num) { if (l_n > tb->zeroes_num) {
body += (l_n - zeros_num); body += (l_n - tb->zeroes_num);
zeros_num = 0; tb->zeroes_num = 0;
} else } else
zeros_num -= l_n; tb->zeroes_num -= l_n;
pos_in_item = 0; tb->pos_in_item = 0;
RFALSE(comp_short_le_keys(leaf_key(tbS0, 0), leaf_key(tb->L[0], B_NR_ITEMS(tb->L[0]) - 1)) RFALSE(comp_short_le_keys(leaf_key(tbS0, 0), leaf_key(tb->L[0], B_NR_ITEMS(tb->L[0]) - 1))
|| !op_is_left_mergeable(leaf_key(tbS0, 0), tbS0->b_size) || !op_is_left_mergeable(leaf_key(tbS0, 0), tbS0->b_size)
...@@ -517,9 +500,9 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, ...@@ -517,9 +500,9 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih,
} else { /* only part of the appended item will be in L[0] */ } else { /* only part of the appended item will be in L[0] */
/* Calculate position in item for append in S[0] */ /* Calculate position in item for append in S[0] */
pos_in_item -= tb->lbytes; tb->pos_in_item -= tb->lbytes;
RFALSE(pos_in_item <= 0, "PAP-12125: no place for paste. pos_in_item=%d", pos_in_item); RFALSE(tb->pos_in_item <= 0, "PAP-12125: no place for paste. pos_in_item=%d", tb->pos_in_item);
/* Shift lnum[0] - 1 items in whole. Shift lbytes - 1 byte from item number lnum[0] */ /* Shift lnum[0] - 1 items in whole. Shift lbytes - 1 byte from item number lnum[0] */
leaf_shift_left(tb, tb->lnum[0], tb->lbytes); leaf_shift_left(tb, tb->lnum[0], tb->lbytes);
...@@ -529,29 +512,29 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, ...@@ -529,29 +512,29 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih,
struct item_head *pasted; struct item_head *pasted;
if (!item_pos && op_is_left_mergeable(leaf_key(tbS0, 0), tbS0->b_size)) { /* if we paste into first item of S[0] and it is left mergable */ if (!tb->item_pos && op_is_left_mergeable(leaf_key(tbS0, 0), tbS0->b_size)) { /* if we paste into first item of S[0] and it is left mergable */
/* then increment pos_in_item by the size of the last item in L[0] */ /* then increment pos_in_item by the size of the last item in L[0] */
pasted = item_head(tb->L[0], n - 1); pasted = item_head(tb->L[0], n - 1);
if (is_direntry_le_ih(pasted)) if (is_direntry_le_ih(pasted))
pos_in_item += ih_entry_count(pasted); tb->pos_in_item += ih_entry_count(pasted);
else else
pos_in_item += ih_item_len(pasted); tb->pos_in_item += ih_item_len(pasted);
} }
/* Shift lnum[0] - 1 items in whole. Shift lbytes - 1 byte from item number lnum[0] */ /* Shift lnum[0] - 1 items in whole. Shift lbytes - 1 byte from item number lnum[0] */
ret_val = leaf_shift_left(tb, tb->lnum[0], tb->lbytes); ret_val = leaf_shift_left(tb, tb->lnum[0], tb->lbytes);
/* Append to body of item in L[0] */ /* Append to body of item in L[0] */
buffer_info_init_left(tb, &bi); buffer_info_init_left(tb, &bi);
leaf_paste_in_buffer(&bi, n + item_pos - ret_val, leaf_paste_in_buffer(&bi, n + tb->item_pos - ret_val,
pos_in_item, tb->pos_in_item,
tb->insert_size[0], tb->insert_size[0],
body, zeros_num); body, tb->zeroes_num);
/* if appended item is directory, paste entry */ /* if appended item is directory, paste entry */
pasted = item_head(tb->L[0], n + item_pos - ret_val); pasted = item_head(tb->L[0], n + tb->item_pos - ret_val);
if (is_direntry_le_ih(pasted)) if (is_direntry_le_ih(pasted))
leaf_paste_entries(&bi, n + item_pos - ret_val, leaf_paste_entries(&bi, n + tb->item_pos - ret_val,
pos_in_item, 1, tb->pos_in_item, 1,
(struct reiserfs_de_head *) body, (struct reiserfs_de_head *) body,
body + DEH_SIZE, body + DEH_SIZE,
tb->insert_size[0]); tb->insert_size[0]);
...@@ -559,7 +542,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, ...@@ -559,7 +542,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih,
if (is_indirect_le_ih(pasted)) if (is_indirect_le_ih(pasted))
set_ih_free_space(pasted, 0); set_ih_free_space(pasted, 0);
tb->insert_size[0] = 0; tb->insert_size[0] = 0;
zeros_num = 0; tb->zeroes_num = 0;
} }
break; break;
default: /* cases d and t */ default: /* cases d and t */
...@@ -576,7 +559,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, ...@@ -576,7 +559,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih,
/* tb->lnum[0] > 0 */ /* tb->lnum[0] > 0 */
/* Calculate new item position */ /* Calculate new item position */
item_pos -= (tb->lnum[0] - ((tb->lbytes != -1) ? 1 : 0)); tb->item_pos -= (tb->lnum[0] - ((tb->lbytes != -1) ? 1 : 0));
if (tb->rnum[0] > 0) { if (tb->rnum[0] > 0) {
/* shift rnum[0] items from S[0] to the right neighbor R[0] */ /* shift rnum[0] items from S[0] to the right neighbor R[0] */
...@@ -584,9 +567,9 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, ...@@ -584,9 +567,9 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih,
switch (flag) { switch (flag) {
case M_INSERT: /* insert item */ case M_INSERT: /* insert item */
if (n - tb->rnum[0] < item_pos) { /* new item or its part falls to R[0] */ if (n - tb->rnum[0] < tb->item_pos) { /* new item or its part falls to R[0] */
if (item_pos == n - tb->rnum[0] + 1 && tb->rbytes != -1) { /* part of new item falls into R[0] */ if (tb->item_pos == n - tb->rnum[0] + 1 && tb->rbytes != -1) { /* part of new item falls into R[0] */
loff_t old_key_comp, old_len, r_zeros_number; loff_t old_key_comp, old_len, r_zeroes_number;
const char *r_body; const char *r_body;
int version; int version;
loff_t offset; loff_t offset;
...@@ -604,17 +587,17 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, ...@@ -604,17 +587,17 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih,
put_ih_item_len(ih, tb->rbytes); put_ih_item_len(ih, tb->rbytes);
/* Insert part of the item into R[0] */ /* Insert part of the item into R[0] */
buffer_info_init_right(tb, &bi); buffer_info_init_right(tb, &bi);
if ((old_len - tb->rbytes) > zeros_num) { if ((old_len - tb->rbytes) > tb->zeroes_num) {
r_zeros_number = 0; r_zeroes_number = 0;
r_body = body + (old_len - tb->rbytes) - zeros_num; r_body = body + (old_len - tb->rbytes) - tb->zeroes_num;
} else { } else {
r_body = body; r_body = body;
r_zeros_number = zeros_num - (old_len - tb->rbytes); r_zeroes_number = tb->zeroes_num - (old_len - tb->rbytes);
zeros_num -= r_zeros_number; tb->zeroes_num -= r_zeroes_number;
} }
leaf_insert_into_buf(&bi, 0, ih, r_body, leaf_insert_into_buf(&bi, 0, ih, r_body,
r_zeros_number); r_zeroes_number);
/* Replace right delimiting key by first key in R[0] */ /* Replace right delimiting key by first key in R[0] */
replace_key(tb, tb->CFR[0], tb->rkey[0], replace_key(tb, tb->CFR[0], tb->rkey[0],
...@@ -632,16 +615,16 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, ...@@ -632,16 +615,16 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih,
ret_val = leaf_shift_right(tb, tb->rnum[0] - 1, tb->rbytes); ret_val = leaf_shift_right(tb, tb->rnum[0] - 1, tb->rbytes);
/* Insert new item into R[0] */ /* Insert new item into R[0] */
buffer_info_init_right(tb, &bi); buffer_info_init_right(tb, &bi);
leaf_insert_into_buf(&bi, item_pos - n + tb->rnum[0] - 1, leaf_insert_into_buf(&bi, tb->item_pos - n + tb->rnum[0] - 1,
ih, body, zeros_num); ih, body, tb->zeroes_num);
if (item_pos - n + tb->rnum[0] - 1 == 0) { if (tb->item_pos - n + tb->rnum[0] - 1 == 0) {
replace_key(tb, tb->CFR[0], replace_key(tb, tb->CFR[0],
tb->rkey[0], tb->rkey[0],
tb->R[0], 0); tb->R[0], 0);
} }
zeros_num = tb->insert_size[0] = 0; tb->zeroes_num = tb->insert_size[0] = 0;
} }
} else { /* new item or part of it doesn't fall into R[0] */ } else { /* new item or part of it doesn't fall into R[0] */
...@@ -651,17 +634,17 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, ...@@ -651,17 +634,17 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih,
case M_PASTE: /* append item */ case M_PASTE: /* append item */
if (n - tb->rnum[0] <= item_pos) { /* pasted item or part of it falls to R[0] */ if (n - tb->rnum[0] <= tb->item_pos) { /* pasted item or part of it falls to R[0] */
if (item_pos == n - tb->rnum[0] && tb->rbytes != -1) { /* we must shift the part of the appended item */ if (tb->item_pos == n - tb->rnum[0] && tb->rbytes != -1) { /* we must shift the part of the appended item */
if (is_direntry_le_ih(item_head(tbS0, item_pos))) { /* we append to directory item */ if (is_direntry_le_ih(item_head(tbS0, tb->item_pos))) { /* we append to directory item */
int entry_count; int entry_count;
RFALSE(zeros_num, RFALSE(tb->zeroes_num,
"PAP-12145: invalid parameter in case of a directory"); "PAP-12145: invalid parameter in case of a directory");
entry_count = ih_entry_count(item_head entry_count = ih_entry_count(item_head
(tbS0, item_pos)); (tbS0, tb->item_pos));
if (entry_count - tb->rbytes < if (entry_count - tb->rbytes <
pos_in_item) tb->pos_in_item)
/* new directory entry falls into R[0] */ /* new directory entry falls into R[0] */
{ {
int paste_entry_position; int paste_entry_position;
...@@ -672,9 +655,9 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, ...@@ -672,9 +655,9 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih,
/* Shift rnum[0]-1 items in whole. Shift rbytes-1 directory entries from directory item number rnum[0] */ /* Shift rnum[0]-1 items in whole. Shift rbytes-1 directory entries from directory item number rnum[0] */
leaf_shift_right(tb, tb->rnum[0], tb->rbytes - 1); leaf_shift_right(tb, tb->rnum[0], tb->rbytes - 1);
/* Paste given directory entry to directory item */ /* Paste given directory entry to directory item */
paste_entry_position = pos_in_item - entry_count + tb->rbytes - 1; paste_entry_position = tb->pos_in_item - entry_count + tb->rbytes - 1;
buffer_info_init_right(tb, &bi); buffer_info_init_right(tb, &bi);
leaf_paste_in_buffer(&bi, 0, paste_entry_position, tb->insert_size[0], body, zeros_num); leaf_paste_in_buffer(&bi, 0, paste_entry_position, tb->insert_size[0], body, tb->zeroes_num);
/* paste entry */ /* paste entry */
leaf_paste_entries(&bi, 0, paste_entry_position, 1, leaf_paste_entries(&bi, 0, paste_entry_position, 1,
(struct reiserfs_de_head *) body, (struct reiserfs_de_head *) body,
...@@ -686,25 +669,25 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, ...@@ -686,25 +669,25 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih,
} }
tb->insert_size[0] = 0; tb->insert_size[0] = 0;
pos_in_item++; tb->pos_in_item++;
} else { /* new directory entry doesn't fall into R[0] */ } else { /* new directory entry doesn't fall into R[0] */
leaf_shift_right(tb, tb->rnum[0], tb->rbytes); leaf_shift_right(tb, tb->rnum[0], tb->rbytes);
} }
} else { /* regular object */ } else { /* regular object */
int n_shift, n_rem, r_zeros_number; int n_shift, n_rem, r_zeroes_number;
const char *r_body; const char *r_body;
/* Calculate number of bytes which must be shifted from appended item */ /* Calculate number of bytes which must be shifted from appended item */
if ((n_shift = tb->rbytes - tb->insert_size[0]) < 0) if ((n_shift = tb->rbytes - tb->insert_size[0]) < 0)
n_shift = 0; n_shift = 0;
RFALSE(pos_in_item != ih_item_len RFALSE(tb->pos_in_item != ih_item_len
(item_head(tbS0, item_pos)), (item_head(tbS0, tb->item_pos)),
"PAP-12155: invalid position to paste. ih_item_len=%d, pos_in_item=%d", "PAP-12155: invalid position to paste. ih_item_len=%d, pos_in_item=%d",
pos_in_item, ih_item_len tb->pos_in_item, ih_item_len
(item_head(tbS0, item_pos))); (item_head(tbS0, tb->item_pos)));
leaf_shift_right(tb, tb->rnum[0], n_shift); leaf_shift_right(tb, tb->rnum[0], n_shift);
/* Calculate number of bytes which must remain in body after appending to R[0] */ /* Calculate number of bytes which must remain in body after appending to R[0] */
...@@ -730,18 +713,18 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, ...@@ -730,18 +713,18 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih,
/* Append part of body into R[0] */ /* Append part of body into R[0] */
buffer_info_init_right(tb, &bi); buffer_info_init_right(tb, &bi);
if (n_rem > zeros_num) { if (n_rem > tb->zeroes_num) {
r_zeros_number = 0; r_zeroes_number = 0;
r_body = body + n_rem - zeros_num; r_body = body + n_rem - tb->zeroes_num;
} else { } else {
r_body = body; r_body = body;
r_zeros_number = zeros_num - n_rem; r_zeroes_number = tb->zeroes_num - n_rem;
zeros_num -= r_zeros_number; tb->zeroes_num -= r_zeroes_number;
} }
leaf_paste_in_buffer(&bi, 0, n_shift, leaf_paste_in_buffer(&bi, 0, n_shift,
tb->insert_size[0] - n_rem, tb->insert_size[0] - n_rem,
r_body, r_zeros_number); r_body, r_zeroes_number);
if (is_indirect_le_ih(item_head(tb->R[0], 0))) { if (is_indirect_le_ih(item_head(tb->R[0], 0))) {
#if 0 #if 0
...@@ -752,7 +735,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, ...@@ -752,7 +735,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih,
} }
tb->insert_size[0] = n_rem; tb->insert_size[0] = n_rem;
if (!n_rem) if (!n_rem)
pos_in_item++; tb->pos_in_item++;
} }
} else { /* pasted item in whole falls into R[0] */ } else { /* pasted item in whole falls into R[0] */
...@@ -760,22 +743,22 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, ...@@ -760,22 +743,22 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih,
ret_val = leaf_shift_right(tb, tb->rnum[0], tb->rbytes); ret_val = leaf_shift_right(tb, tb->rnum[0], tb->rbytes);
/* append item in R[0] */ /* append item in R[0] */
if (pos_in_item >= 0) { if (tb->pos_in_item >= 0) {
buffer_info_init_right(tb, &bi); buffer_info_init_right(tb, &bi);
leaf_paste_in_buffer(&bi, item_pos - n + tb->rnum[0], pos_in_item, leaf_paste_in_buffer(&bi, tb->item_pos - n + tb->rnum[0], tb->pos_in_item,
tb->insert_size[0], body, zeros_num); tb->insert_size[0], body, tb->zeroes_num);
} }
/* paste new entry, if item is directory item */ /* paste new entry, if item is directory item */
pasted = item_head(tb->R[0], item_pos - n + tb->rnum[0]); pasted = item_head(tb->R[0], tb->item_pos - n + tb->rnum[0]);
if (is_direntry_le_ih(pasted) && pos_in_item >= 0) { if (is_direntry_le_ih(pasted) && tb->pos_in_item >= 0) {
leaf_paste_entries(&bi, item_pos - n + tb->rnum[0], leaf_paste_entries(&bi, tb->item_pos - n + tb->rnum[0],
pos_in_item, 1, tb->pos_in_item, 1,
(struct reiserfs_de_head *) body, (struct reiserfs_de_head *) body,
body + DEH_SIZE, tb->insert_size[0]); body + DEH_SIZE, tb->insert_size[0]);
if (!pos_in_item) { if (!tb->pos_in_item) {
RFALSE(item_pos - n + tb->rnum[0], RFALSE(tb->item_pos - n + tb->rnum[0],
"PAP-12165: directory item must be first item of node when pasting is in 0th position"); "PAP-12165: directory item must be first item of node when pasting is in 0th position");
/* update delimiting keys */ /* update delimiting keys */
...@@ -785,7 +768,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, ...@@ -785,7 +768,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih,
if (is_indirect_le_ih(pasted)) if (is_indirect_le_ih(pasted))
set_ih_free_space(pasted, 0); set_ih_free_space(pasted, 0);
zeros_num = tb->insert_size[0] = 0; tb->zeroes_num = tb->insert_size[0] = 0;
} }
} else { /* new item doesn't fall into R[0] */ } else { /* new item doesn't fall into R[0] */
...@@ -834,39 +817,34 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, ...@@ -834,39 +817,34 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih,
} }
/* Fill new nodes that appear in place of S[0] */ /* Fill new nodes that appear in place of S[0] */
/* I am told that this copying is because we need an array to enable
the looping code. -Hans */
snum[0] = tb->s1num, snum[1] = tb->s2num;
sbytes[0] = tb->s1bytes;
sbytes[1] = tb->s2bytes;
for (i = tb->blknum[0] - 2; i >= 0; i--) { for (i = tb->blknum[0] - 2; i >= 0; i--) {
RFALSE(!snum[i], "PAP-12200: snum[%d] == %d. Must be > 0", i, RFALSE(!tb->snum[i],
snum[i]); "PAP-12200: snum[%d] == %d. Must be > 0", i,
tb->snum[i]);
/* here we shift from S to S_new nodes */ /* here we shift from S to S_new nodes */
S_new[i] = get_FEB(tb); tb->S_new[i] = get_FEB(tb);
/* initialized block type and tree level */ /* initialized block type and tree level */
set_blkh_level(B_BLK_HEAD(S_new[i]), DISK_LEAF_NODE_LEVEL); set_blkh_level(B_BLK_HEAD(tb->S_new[i]), DISK_LEAF_NODE_LEVEL);
n = B_NR_ITEMS(tbS0); n = B_NR_ITEMS(tbS0);
switch (flag) { switch (flag) {
case M_INSERT: /* insert item */ case M_INSERT: /* insert item */
if (n - snum[i] < item_pos) { /* new item or it's part falls to first new node S_new[i] */ if (n - tb->snum[i] < tb->item_pos) { /* new item or it's part falls to first new node S_new[i] */
if (item_pos == n - snum[i] + 1 && sbytes[i] != -1) { /* part of new item falls into S_new[i] */ if (tb->item_pos == n - tb->snum[i] + 1 && tb->sbytes[i] != -1) { /* part of new item falls into S_new[i] */
int old_key_comp, old_len, r_zeros_number; int old_key_comp, old_len, r_zeroes_number;
const char *r_body; const char *r_body;
int version; int version;
/* Move snum[i]-1 items from S[0] to S_new[i] */ /* Move snum[i]-1 items from S[0] to S_new[i] */
leaf_move_items(LEAF_FROM_S_TO_SNEW, tb, leaf_move_items(LEAF_FROM_S_TO_SNEW, tb,
snum[i] - 1, -1, tb->snum[i] - 1, -1,
S_new[i]); tb->S_new[i]);
/* Remember key component and item length */ /* Remember key component and item length */
version = ih_version(ih); version = ih_version(ih);
old_key_comp = le_ih_k_offset(ih); old_key_comp = le_ih_k_offset(ih);
...@@ -874,59 +852,59 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, ...@@ -874,59 +852,59 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih,
/* Calculate key component and item length to insert into S_new[i] */ /* Calculate key component and item length to insert into S_new[i] */
set_le_ih_k_offset(ih, le_ih_k_offset(ih) + set_le_ih_k_offset(ih, le_ih_k_offset(ih) +
((old_len - sbytes[i]) << (is_indirect_le_ih(ih) ? tb->tb_sb-> s_blocksize_bits - UNFM_P_SHIFT : 0))); ((old_len - tb->sbytes[i]) << (is_indirect_le_ih(ih) ? tb->tb_sb->s_blocksize_bits - UNFM_P_SHIFT : 0)));
put_ih_item_len(ih, sbytes[i]); put_ih_item_len(ih, tb->sbytes[i]);
/* Insert part of the item into S_new[i] before 0-th item */ /* Insert part of the item into S_new[i] before 0-th item */
buffer_info_init_bh(tb, &bi, S_new[i]); buffer_info_init_bh(tb, &bi, tb->S_new[i]);
if ((old_len - sbytes[i]) > zeros_num) { if ((old_len - tb->sbytes[i]) > tb->zeroes_num) {
r_zeros_number = 0; r_zeroes_number = 0;
r_body = body + (old_len - sbytes[i]) - zeros_num; r_body = body + (old_len - tb->sbytes[i]) - tb->zeroes_num;
} else { } else {
r_body = body; r_body = body;
r_zeros_number = zeros_num - (old_len - sbytes[i]); r_zeroes_number = tb->zeroes_num - (old_len - tb->sbytes[i]);
zeros_num -= r_zeros_number; tb->zeroes_num -= r_zeroes_number;
} }
leaf_insert_into_buf(&bi, 0, ih, r_body, r_zeros_number); leaf_insert_into_buf(&bi, 0, ih, r_body, r_zeroes_number);
/* Calculate key component and item length to insert into S[i] */ /* Calculate key component and item length to insert into S[i] */
set_le_ih_k_offset(ih, old_key_comp); set_le_ih_k_offset(ih, old_key_comp);
put_ih_item_len(ih, old_len - sbytes[i]); put_ih_item_len(ih, old_len - tb->sbytes[i]);
tb->insert_size[0] -= sbytes[i]; tb->insert_size[0] -= tb->sbytes[i];
} else { /* whole new item falls into S_new[i] */ } else { /* whole new item falls into S_new[i] */
/* Shift snum[0] - 1 items to S_new[i] (sbytes[i] of split item) */ /* Shift snum[0] - 1 items to S_new[i] (sbytes[i] of split item) */
leaf_move_items(LEAF_FROM_S_TO_SNEW, tb, leaf_move_items(LEAF_FROM_S_TO_SNEW, tb,
snum[i] - 1, sbytes[i], S_new[i]); tb->snum[i] - 1, tb->sbytes[i], tb->S_new[i]);
/* Insert new item into S_new[i] */ /* Insert new item into S_new[i] */
buffer_info_init_bh(tb, &bi, S_new[i]); buffer_info_init_bh(tb, &bi, tb->S_new[i]);
leaf_insert_into_buf(&bi, item_pos - n + snum[i] - 1, leaf_insert_into_buf(&bi, tb->item_pos - n + tb->snum[i] - 1,
ih, body, zeros_num); ih, body, tb->zeroes_num);
zeros_num = tb->insert_size[0] = 0; tb->zeroes_num = tb->insert_size[0] = 0;
} }
} }
else { /* new item or it part don't falls into S_new[i] */ else { /* new item or it part don't falls into S_new[i] */
leaf_move_items(LEAF_FROM_S_TO_SNEW, tb, leaf_move_items(LEAF_FROM_S_TO_SNEW, tb,
snum[i], sbytes[i], S_new[i]); tb->snum[i], tb->sbytes[i], tb->S_new[i]);
} }
break; break;
case M_PASTE: /* append item */ case M_PASTE: /* append item */
if (n - snum[i] <= item_pos) { /* pasted item or part if it falls to S_new[i] */ if (n - tb->snum[i] <= tb->item_pos) { /* pasted item or part if it falls to S_new[i] */
if (item_pos == n - snum[i] && sbytes[i] != -1) { /* we must shift part of the appended item */ if (tb->item_pos == n - tb->snum[i] && tb->sbytes[i] != -1) { /* we must shift part of the appended item */
struct item_head *aux_ih; struct item_head *aux_ih;
RFALSE(ih, "PAP-12210: ih must be 0"); RFALSE(ih, "PAP-12210: ih must be 0");
aux_ih = item_head(tbS0, item_pos); aux_ih = item_head(tbS0, tb->item_pos);
if (is_direntry_le_ih(aux_ih)) { if (is_direntry_le_ih(aux_ih)) {
/* we append to directory item */ /* we append to directory item */
...@@ -934,65 +912,65 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, ...@@ -934,65 +912,65 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih,
entry_count = ih_entry_count(aux_ih); entry_count = ih_entry_count(aux_ih);
if (entry_count - sbytes[i] < pos_in_item && pos_in_item <= entry_count) { if (entry_count - tb->sbytes[i] < tb->pos_in_item && tb->pos_in_item <= entry_count) {
/* new directory entry falls into S_new[i] */ /* new directory entry falls into S_new[i] */
RFALSE(!tb->insert_size[0], "PAP-12215: insert_size is already 0"); RFALSE(!tb->insert_size[0], "PAP-12215: insert_size is already 0");
RFALSE(sbytes[i] - 1 >= entry_count, RFALSE(tb->sbytes[i] - 1 >= entry_count,
"PAP-12220: there are no so much entries (%d), only %d", "PAP-12220: there are no so much entries (%d), only %d",
sbytes[i] - 1, entry_count); tb->sbytes[i] - 1, entry_count);
/* Shift snum[i]-1 items in whole. Shift sbytes[i] directory entries from directory item number snum[i] */ /* Shift snum[i]-1 items in whole. Shift sbytes[i] directory entries from directory item number snum[i] */
leaf_move_items(LEAF_FROM_S_TO_SNEW, tb, snum[i], sbytes[i] - 1, S_new[i]); leaf_move_items(LEAF_FROM_S_TO_SNEW, tb, tb->snum[i], tb->sbytes[i] - 1, tb->S_new[i]);
/* Paste given directory entry to directory item */ /* Paste given directory entry to directory item */
buffer_info_init_bh(tb, &bi, S_new[i]); buffer_info_init_bh(tb, &bi, tb->S_new[i]);
leaf_paste_in_buffer(&bi, 0, pos_in_item - entry_count + sbytes[i] - 1, leaf_paste_in_buffer(&bi, 0, tb->pos_in_item - entry_count + tb->sbytes[i] - 1,
tb->insert_size[0], body, zeros_num); tb->insert_size[0], body, tb->zeroes_num);
/* paste new directory entry */ /* paste new directory entry */
leaf_paste_entries(&bi, 0, pos_in_item - entry_count + sbytes[i] - 1, 1, leaf_paste_entries(&bi, 0, tb->pos_in_item - entry_count + tb->sbytes[i] - 1, 1,
(struct reiserfs_de_head *) body, (struct reiserfs_de_head *) body,
body + DEH_SIZE, tb->insert_size[0]); body + DEH_SIZE, tb->insert_size[0]);
tb->insert_size[0] = 0; tb->insert_size[0] = 0;
pos_in_item++; tb->pos_in_item++;
} else { /* new directory entry doesn't fall into S_new[i] */ } else { /* new directory entry doesn't fall into S_new[i] */
leaf_move_items(LEAF_FROM_S_TO_SNEW,tb, snum[i], sbytes[i], S_new[i]); leaf_move_items(LEAF_FROM_S_TO_SNEW, tb, tb->snum[i], tb->sbytes[i], tb->S_new[i]);
} }
} else { /* regular object */ } else { /* regular object */
int n_shift, n_rem, r_zeros_number; int n_shift, n_rem, r_zeroes_number;
const char *r_body; const char *r_body;
RFALSE(pos_in_item != ih_item_len(item_head(tbS0, item_pos)) || tb->insert_size[0] <= 0, RFALSE(tb->pos_in_item != ih_item_len(item_head(tbS0, tb->item_pos)) || tb->insert_size[0] <= 0,
"PAP-12225: item too short or insert_size <= 0"); "PAP-12225: item too short or insert_size <= 0");
/* Calculate number of bytes which must be shifted from appended item */ /* Calculate number of bytes which must be shifted from appended item */
n_shift = sbytes[i] - tb->insert_size[0]; n_shift = tb->sbytes[i] - tb->insert_size[0];
if (n_shift < 0) if (n_shift < 0)
n_shift = 0; n_shift = 0;
leaf_move_items(LEAF_FROM_S_TO_SNEW, tb, snum[i], n_shift, S_new[i]); leaf_move_items(LEAF_FROM_S_TO_SNEW, tb, tb->snum[i], n_shift, tb->S_new[i]);
/* Calculate number of bytes which must remain in body after append to S_new[i] */ /* Calculate number of bytes which must remain in body after append to S_new[i] */
n_rem = tb->insert_size[0] - sbytes[i]; n_rem = tb->insert_size[0] - tb->sbytes[i];
if (n_rem < 0) if (n_rem < 0)
n_rem = 0; n_rem = 0;
/* Append part of body into S_new[0] */ /* Append part of body into S_new[0] */
buffer_info_init_bh(tb, &bi, S_new[i]); buffer_info_init_bh(tb, &bi, tb->S_new[i]);
if (n_rem > zeros_num) { if (n_rem > tb->zeroes_num) {
r_zeros_number = 0; r_zeroes_number = 0;
r_body = body + n_rem - zeros_num; r_body = body + n_rem - tb->zeroes_num;
} else { } else {
r_body = body; r_body = body;
r_zeros_number = zeros_num - n_rem; r_zeroes_number = tb->zeroes_num - n_rem;
zeros_num -= r_zeros_number; tb->zeroes_num -= r_zeroes_number;
} }
leaf_paste_in_buffer(&bi, 0, n_shift, leaf_paste_in_buffer(&bi, 0, n_shift,
tb->insert_size[0] - n_rem, tb->insert_size[0] - n_rem,
r_body, r_zeros_number); r_body, r_zeroes_number);
{ {
struct item_head *tmp; struct item_head *tmp;
tmp = item_head(S_new[i], 0); tmp = item_head(tb->S_new[i], 0);
if (is_indirect_le_ih if (is_indirect_le_ih
(tmp)) { (tmp)) {
set_ih_free_space(tmp, 0); set_ih_free_space(tmp, 0);
...@@ -1004,7 +982,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, ...@@ -1004,7 +982,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih,
tb->insert_size[0] = n_rem; tb->insert_size[0] = n_rem;
if (!n_rem) if (!n_rem)
pos_in_item++; tb->pos_in_item++;
} }
} else } else
/* item falls wholly into S_new[i] */ /* item falls wholly into S_new[i] */
...@@ -1013,10 +991,10 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, ...@@ -1013,10 +991,10 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih,
struct item_head *pasted; struct item_head *pasted;
#ifdef CONFIG_REISERFS_CHECK #ifdef CONFIG_REISERFS_CHECK
struct item_head *ih_check = item_head(tbS0, item_pos); struct item_head *ih_check = item_head(tbS0, tb->item_pos);
if (!is_direntry_le_ih(ih_check) if (!is_direntry_le_ih(ih_check)
&& (pos_in_item != ih_item_len(ih_check) && (tb->pos_in_item != ih_item_len(ih_check)
|| tb->insert_size[0] <= 0)) || tb->insert_size[0] <= 0))
reiserfs_panic(tb->tb_sb, reiserfs_panic(tb->tb_sb,
"PAP-12235", "PAP-12235",
...@@ -1026,27 +1004,27 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, ...@@ -1026,27 +1004,27 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih,
#endif /* CONFIG_REISERFS_CHECK */ #endif /* CONFIG_REISERFS_CHECK */
leaf_mi = leaf_move_items(LEAF_FROM_S_TO_SNEW, leaf_mi = leaf_move_items(LEAF_FROM_S_TO_SNEW,
tb, snum[i], tb, tb->snum[i],
sbytes[i], tb->sbytes[i],
S_new[i]); tb->S_new[i]);
RFALSE(leaf_mi, RFALSE(leaf_mi,
"PAP-12240: unexpected value returned by leaf_move_items (%d)", "PAP-12240: unexpected value returned by leaf_move_items (%d)",
leaf_mi); leaf_mi);
/* paste into item */ /* paste into item */
buffer_info_init_bh(tb, &bi, S_new[i]); buffer_info_init_bh(tb, &bi, tb->S_new[i]);
leaf_paste_in_buffer(&bi, leaf_paste_in_buffer(&bi,
item_pos - n + snum[i], tb->item_pos - n + tb->snum[i],
pos_in_item, tb->pos_in_item,
tb->insert_size[0], tb->insert_size[0],
body, zeros_num); body, tb->zeroes_num);
pasted = item_head(S_new[i], item_pos - n + snum[i]); pasted = item_head(tb->S_new[i], tb->item_pos - n + tb->snum[i]);
if (is_direntry_le_ih(pasted)) { if (is_direntry_le_ih(pasted)) {
leaf_paste_entries(&bi, leaf_paste_entries(&bi,
item_pos - n + snum[i], tb->item_pos - n + tb->snum[i],
pos_in_item, 1, tb->pos_in_item, 1,
(struct reiserfs_de_head *)body, (struct reiserfs_de_head *)body,
body + DEH_SIZE, body + DEH_SIZE,
tb->insert_size[0] tb->insert_size[0]
...@@ -1056,14 +1034,14 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, ...@@ -1056,14 +1034,14 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih,
/* if we paste to indirect item update ih_free_space */ /* if we paste to indirect item update ih_free_space */
if (is_indirect_le_ih(pasted)) if (is_indirect_le_ih(pasted))
set_ih_free_space(pasted, 0); set_ih_free_space(pasted, 0);
zeros_num = tb->insert_size[0] = 0; tb->zeroes_num = tb->insert_size[0] = 0;
} }
} }
else { /* pasted item doesn't fall into S_new[i] */ else { /* pasted item doesn't fall into S_new[i] */
leaf_move_items(LEAF_FROM_S_TO_SNEW, tb, leaf_move_items(LEAF_FROM_S_TO_SNEW, tb,
snum[i], sbytes[i], S_new[i]); tb->snum[i], tb->sbytes[i], tb->S_new[i]);
} }
break; break;
default: /* cases d and t */ default: /* cases d and t */
...@@ -1072,27 +1050,28 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, ...@@ -1072,27 +1050,28 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih,
(flag == M_DELETE) ? "DELETE" : ((flag == M_CUT) ? "CUT" : "UNKNOWN"), flag); (flag == M_DELETE) ? "DELETE" : ((flag == M_CUT) ? "CUT" : "UNKNOWN"), flag);
} }
memcpy(insert_key + i, leaf_key(S_new[i], 0), KEY_SIZE); memcpy(insert_key + i, leaf_key(tb->S_new[i], 0), KEY_SIZE);
insert_ptr[i] = S_new[i]; insert_ptr[i] = tb->S_new[i];
RFALSE(!buffer_journaled(S_new[i]) RFALSE(!buffer_journaled(tb->S_new[i])
|| buffer_journal_dirty(S_new[i]) || buffer_journal_dirty(tb->S_new[i])
|| buffer_dirty(S_new[i]), "PAP-12247: S_new[%d] : (%b)", || buffer_dirty(tb->S_new[i]),
i, S_new[i]); "PAP-12247: S_new[%d] : (%b)",
i, tb->S_new[i]);
} }
/* if the affected item was not wholly shifted then we perform all necessary operations on that part or whole of the /* if the affected item was not wholly shifted then we perform all necessary operations on that part or whole of the
affected item which remains in S */ affected item which remains in S */
if (0 <= item_pos && item_pos < tb->s0num) { /* if we must insert or append into buffer S[0] */ if (0 <= tb->item_pos && tb->item_pos < tb->s0num) { /* if we must insert or append into buffer S[0] */
switch (flag) { switch (flag) {
case M_INSERT: /* insert item into S[0] */ case M_INSERT: /* insert item into S[0] */
buffer_info_init_tbS0(tb, &bi); buffer_info_init_tbS0(tb, &bi);
leaf_insert_into_buf(&bi, item_pos, ih, body, leaf_insert_into_buf(&bi, tb->item_pos, ih,
zeros_num); body, tb->zeroes_num);
/* If we insert the first key change the delimiting key */ /* If we insert the first key change the delimiting key */
if (item_pos == 0) { if (tb->item_pos == 0) {
if (tb->CFL[0]) /* can be 0 in reiserfsck */ if (tb->CFL[0]) /* can be 0 in reiserfsck */
replace_key(tb, tb->CFL[0], tb->lkey[0], tbS0, 0); replace_key(tb, tb->CFL[0], tb->lkey[0], tbS0, 0);
} }
...@@ -1101,26 +1080,26 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, ...@@ -1101,26 +1080,26 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih,
case M_PASTE:{ /* append item in S[0] */ case M_PASTE:{ /* append item in S[0] */
struct item_head *pasted; struct item_head *pasted;
pasted = item_head(tbS0, item_pos); pasted = item_head(tbS0, tb->item_pos);
/* when directory, may be new entry already pasted */ /* when directory, may be new entry already pasted */
if (is_direntry_le_ih(pasted)) { if (is_direntry_le_ih(pasted)) {
if (pos_in_item >= 0 && pos_in_item <= ih_entry_count(pasted)) { if (tb->pos_in_item >= 0 && tb->pos_in_item <= ih_entry_count(pasted)) {
RFALSE(!tb->insert_size[0], RFALSE(!tb->insert_size[0],
"PAP-12260: insert_size is 0 already"); "PAP-12260: insert_size is 0 already");
/* prepare space */ /* prepare space */
buffer_info_init_tbS0(tb, &bi); buffer_info_init_tbS0(tb, &bi);
leaf_paste_in_buffer(&bi, item_pos, pos_in_item, leaf_paste_in_buffer(&bi, tb->item_pos, tb->pos_in_item,
tb->insert_size[0], body, tb->insert_size[0], body,
zeros_num); tb->zeroes_num);
/* paste entry */ /* paste entry */
leaf_paste_entries(&bi, item_pos, pos_in_item, 1, leaf_paste_entries(&bi, tb->item_pos, tb->pos_in_item, 1,
(struct reiserfs_de_head *)body, (struct reiserfs_de_head *)body,
body + DEH_SIZE, body + DEH_SIZE,
tb->insert_size[0]); tb->insert_size[0]);
if (!item_pos && !pos_in_item) { if (!tb->item_pos && !tb->pos_in_item) {
RFALSE(!tb->CFL[0] || !tb->L[0], RFALSE(!tb->CFL[0] || !tb->L[0],
"PAP-12270: CFL[0]/L[0] must be specified"); "PAP-12270: CFL[0]/L[0] must be specified");
if (tb->CFL[0]) if (tb->CFL[0])
...@@ -1129,14 +1108,14 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, ...@@ -1129,14 +1108,14 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih,
tb->insert_size[0] = 0; tb->insert_size[0] = 0;
} }
} else { /* regular object */ } else { /* regular object */
if (pos_in_item == ih_item_len(pasted)) { if (tb->pos_in_item == ih_item_len(pasted)) {
RFALSE(tb->insert_size[0] <= 0, RFALSE(tb->insert_size[0] <= 0,
"PAP-12275: insert size must not be %d", "PAP-12275: insert size must not be %d",
tb->insert_size[0]); tb->insert_size[0]);
buffer_info_init_tbS0(tb, &bi); buffer_info_init_tbS0(tb, &bi);
leaf_paste_in_buffer(&bi, item_pos, pos_in_item, leaf_paste_in_buffer(&bi, tb->item_pos, tb->pos_in_item,
tb->insert_size[0], body, zeros_num); tb->insert_size[0], body, tb->zeroes_num);
if (is_indirect_le_ih(pasted)) { if (is_indirect_le_ih(pasted)) {
#if 0 #if 0
......
...@@ -631,10 +631,11 @@ static void set_parameters(struct tree_balance *tb, int h, int lnum, ...@@ -631,10 +631,11 @@ static void set_parameters(struct tree_balance *tb, int h, int lnum,
/* only for leaf level */ /* only for leaf level */
if (h == 0) { if (h == 0) {
if (s012 != NULL) { if (s012 != NULL) {
tb->s0num = *s012++, tb->s0num = *s012++;
tb->s1num = *s012++, tb->s2num = *s012++; tb->snum[0] = *s012++;
tb->s1bytes = *s012++; tb->snum[1] = *s012++;
tb->s2bytes = *s012; tb->sbytes[0] = *s012++;
tb->sbytes[1] = *s012;
} }
tb->lbytes = lb; tb->lbytes = lb;
tb->rbytes = rb; tb->rbytes = rb;
......
...@@ -673,9 +673,9 @@ void store_print_tb(struct tree_balance *tb) ...@@ -673,9 +673,9 @@ void store_print_tb(struct tree_balance *tb)
"* h * size * ln * lb * rn * rb * blkn * s0 * s1 * s1b * s2 * s2b * curb * lk * rk *\n" "* h * size * ln * lb * rn * rb * blkn * s0 * s1 * s1b * s2 * s2b * curb * lk * rk *\n"
"* 0 * %4d * %2d * %2d * %2d * %2d * %4d * %2d * %2d * %3d * %2d * %3d * %4d * %2d * %2d *\n", "* 0 * %4d * %2d * %2d * %2d * %2d * %4d * %2d * %2d * %3d * %2d * %3d * %4d * %2d * %2d *\n",
tb->insert_size[0], tb->lnum[0], tb->lbytes, tb->rnum[0], tb->insert_size[0], tb->lnum[0], tb->lbytes, tb->rnum[0],
tb->rbytes, tb->blknum[0], tb->s0num, tb->s1num, tb->s1bytes, tb->rbytes, tb->blknum[0], tb->s0num, tb->snum[0],
tb->s2num, tb->s2bytes, tb->cur_blknum, tb->lkey[0], tb->sbytes[0], tb->snum[1], tb->sbytes[1],
tb->rkey[0]); tb->cur_blknum, tb->lkey[0], tb->rkey[0]);
/* this prints balance parameters for non-leaf levels */ /* this prints balance parameters for non-leaf levels */
h = 0; h = 0;
......
...@@ -2471,12 +2471,6 @@ struct tree_balance { ...@@ -2471,12 +2471,6 @@ struct tree_balance {
/* number of items that fall into left most node when S[0] splits */ /* number of items that fall into left most node when S[0] splits */
int s0num; int s0num;
/* number of items that fall into first new node when S[0] splits */
int s1num;
/* number of items that fall into second new node when S[0] splits */
int s2num;
/* /*
* number of bytes which can flow to the left neighbor from the left * number of bytes which can flow to the left neighbor from the left
* most liquid item that cannot be shifted from S[0] entirely * most liquid item that cannot be shifted from S[0] entirely
...@@ -2491,12 +2485,30 @@ struct tree_balance { ...@@ -2491,12 +2485,30 @@ struct tree_balance {
*/ */
int rbytes; int rbytes;
/*
* index into the array of item headers in
* S[0] of the affected item
*/
int item_pos;
/* new nodes allocated to hold what could not fit into S */
struct buffer_head *S_new[2];
/*
* number of items that will be placed into nodes in S_new
* when S[0] splits
*/
int snum[2];
/* /*
* number of bytes which flow to the first new node when S[0] splits * number of bytes which flow to nodes in S_new when S[0] splits
* note: if S[0] splits into 3 nodes, then items do not need to be cut * note: if S[0] splits into 3 nodes, then items do not need to be cut
*/ */
int s1bytes; int sbytes[2];
int s2bytes;
int pos_in_item;
int zeroes_num;
/* /*
* buffers which are to be freed after do_balance finishes * buffers which are to be freed after do_balance finishes
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment