Commit fba4ebb5 authored by Jeff Mahoney's avatar Jeff Mahoney Committed by Linus Torvalds

reiserfs: factor out buffer_info initialization

This is the first in a series of patches to make balance_leaf() not
quite so insane.

This patch factors out the open coded initializations of buffer_info
structures and defines a few initializers for the 4 cases they're used.
Signed-off-by: default avatarJeff Mahoney <jeffm@suse.com>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 57fe60df
...@@ -29,6 +29,43 @@ struct tree_balance *cur_tb = NULL; /* detects whether more than one ...@@ -29,6 +29,43 @@ struct tree_balance *cur_tb = NULL; /* detects whether more than one
is interrupting do_balance */ is interrupting do_balance */
#endif #endif
static inline void buffer_info_init_left(struct tree_balance *tb,
struct buffer_info *bi)
{
bi->tb = tb;
bi->bi_bh = tb->L[0];
bi->bi_parent = tb->FL[0];
bi->bi_position = get_left_neighbor_position(tb, 0);
}
static inline void buffer_info_init_right(struct tree_balance *tb,
struct buffer_info *bi)
{
bi->tb = tb;
bi->bi_bh = tb->R[0];
bi->bi_parent = tb->FR[0];
bi->bi_position = get_right_neighbor_position(tb, 0);
}
static inline void buffer_info_init_tbS0(struct tree_balance *tb,
struct buffer_info *bi)
{
bi->tb = tb;
bi->bi_bh = PATH_PLAST_BUFFER(tb->tb_path);
bi->bi_parent = PATH_H_PPARENT(tb->tb_path, 0);
bi->bi_position = PATH_H_POSITION(tb->tb_path, 1);
}
static inline void buffer_info_init_bh(struct tree_balance *tb,
struct buffer_info *bi,
struct buffer_head *bh)
{
bi->tb = tb;
bi->bi_bh = bh;
bi->bi_parent = NULL;
bi->bi_position = 0;
}
inline void do_balance_mark_leaf_dirty(struct tree_balance *tb, inline void do_balance_mark_leaf_dirty(struct tree_balance *tb,
struct buffer_head *bh, int flag) struct buffer_head *bh, int flag)
{ {
...@@ -86,6 +123,7 @@ static int balance_leaf_when_delete(struct tree_balance *tb, int flag) ...@@ -86,6 +123,7 @@ static int balance_leaf_when_delete(struct tree_balance *tb, int flag)
"PAP-12010: tree can not be empty"); "PAP-12010: tree can not be empty");
ih = B_N_PITEM_HEAD(tbS0, item_pos); ih = B_N_PITEM_HEAD(tbS0, item_pos);
buffer_info_init_tbS0(tb, &bi);
/* Delete or truncate the item */ /* Delete or truncate the item */
...@@ -96,10 +134,6 @@ static int balance_leaf_when_delete(struct tree_balance *tb, int flag) ...@@ -96,10 +134,6 @@ static int balance_leaf_when_delete(struct tree_balance *tb, int flag)
"vs-12013: mode Delete, insert size %d, ih to be deleted %h", "vs-12013: mode Delete, insert size %d, ih to be deleted %h",
-tb->insert_size[0], ih); -tb->insert_size[0], ih);
bi.tb = tb;
bi.bi_bh = tbS0;
bi.bi_parent = PATH_H_PPARENT(tb->tb_path, 0);
bi.bi_position = PATH_H_POSITION(tb->tb_path, 1);
leaf_delete_items(&bi, 0, item_pos, 1, -1); leaf_delete_items(&bi, 0, item_pos, 1, -1);
if (!item_pos && tb->CFL[0]) { if (!item_pos && tb->CFL[0]) {
...@@ -121,10 +155,6 @@ static int balance_leaf_when_delete(struct tree_balance *tb, int flag) ...@@ -121,10 +155,6 @@ static int balance_leaf_when_delete(struct tree_balance *tb, int flag)
break; break;
case M_CUT:{ /* cut item in S[0] */ case M_CUT:{ /* cut item in S[0] */
bi.tb = tb;
bi.bi_bh = tbS0;
bi.bi_parent = PATH_H_PPARENT(tb->tb_path, 0);
bi.bi_position = PATH_H_POSITION(tb->tb_path, 1);
if (is_direntry_le_ih(ih)) { if (is_direntry_le_ih(ih)) {
/* UFS unlink semantics are such that you can only delete one directory entry at a time. */ /* UFS unlink semantics are such that you can only delete one directory entry at a time. */
...@@ -325,11 +355,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h ...@@ -325,11 +355,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h
ih_item_len(ih)); ih_item_len(ih));
/* Insert new item into L[0] */ /* Insert new item into L[0] */
bi.tb = tb; buffer_info_init_left(tb, &bi);
bi.bi_bh = tb->L[0];
bi.bi_parent = tb->FL[0];
bi.bi_position =
get_left_neighbor_position(tb, 0);
leaf_insert_into_buf(&bi, leaf_insert_into_buf(&bi,
n + item_pos - n + item_pos -
ret_val, ih, body, ret_val, ih, body,
...@@ -369,11 +395,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h ...@@ -369,11 +395,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h
leaf_shift_left(tb, tb->lnum[0] - 1, leaf_shift_left(tb, tb->lnum[0] - 1,
tb->lbytes); tb->lbytes);
/* Insert new item into L[0] */ /* Insert new item into L[0] */
bi.tb = tb; buffer_info_init_left(tb, &bi);
bi.bi_bh = tb->L[0];
bi.bi_parent = tb->FL[0];
bi.bi_position =
get_left_neighbor_position(tb, 0);
leaf_insert_into_buf(&bi, leaf_insert_into_buf(&bi,
n + item_pos - n + item_pos -
ret_val, ih, body, ret_val, ih, body,
...@@ -429,13 +451,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h ...@@ -429,13 +451,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h
} }
/* Append given directory entry to directory item */ /* Append given directory entry to directory item */
bi.tb = tb; buffer_info_init_left(tb, &bi);
bi.bi_bh = tb->L[0];
bi.bi_parent =
tb->FL[0];
bi.bi_position =
get_left_neighbor_position
(tb, 0);
leaf_paste_in_buffer leaf_paste_in_buffer
(&bi, (&bi,
n + item_pos - n + item_pos -
...@@ -523,13 +539,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h ...@@ -523,13 +539,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h
(tbS0, (tbS0,
item_pos))); item_pos)));
/* Append to body of item in L[0] */ /* Append to body of item in L[0] */
bi.tb = tb; buffer_info_init_left(tb, &bi);
bi.bi_bh = tb->L[0];
bi.bi_parent =
tb->FL[0];
bi.bi_position =
get_left_neighbor_position
(tb, 0);
leaf_paste_in_buffer leaf_paste_in_buffer
(&bi, (&bi,
n + item_pos - n + item_pos -
...@@ -680,11 +690,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h ...@@ -680,11 +690,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h
leaf_shift_left(tb, tb->lnum[0], leaf_shift_left(tb, tb->lnum[0],
tb->lbytes); tb->lbytes);
/* Append to body of item in L[0] */ /* Append to body of item in L[0] */
bi.tb = tb; buffer_info_init_left(tb, &bi);
bi.bi_bh = tb->L[0];
bi.bi_parent = tb->FL[0];
bi.bi_position =
get_left_neighbor_position(tb, 0);
leaf_paste_in_buffer(&bi, leaf_paste_in_buffer(&bi,
n + item_pos - n + item_pos -
ret_val, ret_val,
...@@ -776,11 +782,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h ...@@ -776,11 +782,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h
set_le_ih_k_offset(ih, offset); set_le_ih_k_offset(ih, offset);
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] */
bi.tb = tb; buffer_info_init_right(tb, &bi);
bi.bi_bh = tb->R[0];
bi.bi_parent = tb->FR[0];
bi.bi_position =
get_right_neighbor_position(tb, 0);
if ((old_len - tb->rbytes) > zeros_num) { if ((old_len - tb->rbytes) > zeros_num) {
r_zeros_number = 0; r_zeros_number = 0;
r_body = r_body =
...@@ -817,11 +819,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h ...@@ -817,11 +819,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h
tb->rnum[0] - 1, tb->rnum[0] - 1,
tb->rbytes); tb->rbytes);
/* Insert new item into R[0] */ /* Insert new item into R[0] */
bi.tb = tb; buffer_info_init_right(tb, &bi);
bi.bi_bh = tb->R[0];
bi.bi_parent = tb->FR[0];
bi.bi_position =
get_right_neighbor_position(tb, 0);
leaf_insert_into_buf(&bi, leaf_insert_into_buf(&bi,
item_pos - n + item_pos - n +
tb->rnum[0] - 1, tb->rnum[0] - 1,
...@@ -881,13 +879,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h ...@@ -881,13 +879,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h
pos_in_item - pos_in_item -
entry_count + entry_count +
tb->rbytes - 1; tb->rbytes - 1;
bi.tb = tb; buffer_info_init_right(tb, &bi);
bi.bi_bh = tb->R[0];
bi.bi_parent =
tb->FR[0];
bi.bi_position =
get_right_neighbor_position
(tb, 0);
leaf_paste_in_buffer leaf_paste_in_buffer
(&bi, 0, (&bi, 0,
paste_entry_position, paste_entry_position,
...@@ -1018,12 +1010,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h ...@@ -1018,12 +1010,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h
(tb, tb->CFR[0], 0); (tb, tb->CFR[0], 0);
/* Append part of body into R[0] */ /* Append part of body into R[0] */
bi.tb = tb; buffer_info_init_right(tb, &bi);
bi.bi_bh = tb->R[0];
bi.bi_parent = tb->FR[0];
bi.bi_position =
get_right_neighbor_position
(tb, 0);
if (n_rem > zeros_num) { if (n_rem > zeros_num) {
r_zeros_number = 0; r_zeros_number = 0;
r_body = r_body =
...@@ -1070,12 +1057,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h ...@@ -1070,12 +1057,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h
tb->rbytes); tb->rbytes);
/* append item in R[0] */ /* append item in R[0] */
if (pos_in_item >= 0) { if (pos_in_item >= 0) {
bi.tb = tb; buffer_info_init_right(tb, &bi);
bi.bi_bh = tb->R[0];
bi.bi_parent = tb->FR[0];
bi.bi_position =
get_right_neighbor_position
(tb, 0);
leaf_paste_in_buffer(&bi, leaf_paste_in_buffer(&bi,
item_pos - item_pos -
n + n +
...@@ -1231,10 +1213,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h ...@@ -1231,10 +1213,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h
put_ih_item_len(ih, sbytes[i]); put_ih_item_len(ih, 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 */
bi.tb = tb; buffer_info_init_bh(tb, &bi, S_new[i]);
bi.bi_bh = S_new[i];
bi.bi_parent = NULL;
bi.bi_position = 0;
if ((old_len - sbytes[i]) > zeros_num) { if ((old_len - sbytes[i]) > zeros_num) {
r_zeros_number = 0; r_zeros_number = 0;
...@@ -1266,10 +1245,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h ...@@ -1266,10 +1245,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h
S_new[i]); S_new[i]);
/* Insert new item into S_new[i] */ /* Insert new item into S_new[i] */
bi.tb = tb; buffer_info_init_bh(tb, &bi, S_new[i]);
bi.bi_bh = S_new[i];
bi.bi_parent = NULL;
bi.bi_position = 0;
leaf_insert_into_buf(&bi, leaf_insert_into_buf(&bi,
item_pos - n + item_pos - n +
snum[i] - 1, ih, snum[i] - 1, ih,
...@@ -1326,10 +1302,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h ...@@ -1326,10 +1302,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h
sbytes[i] - 1, sbytes[i] - 1,
S_new[i]); S_new[i]);
/* Paste given directory entry to directory item */ /* Paste given directory entry to directory item */
bi.tb = tb; buffer_info_init_bh(tb, &bi, S_new[i]);
bi.bi_bh = S_new[i];
bi.bi_parent = NULL;
bi.bi_position = 0;
leaf_paste_in_buffer leaf_paste_in_buffer
(&bi, 0, (&bi, 0,
pos_in_item - pos_in_item -
...@@ -1399,11 +1372,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h ...@@ -1399,11 +1372,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h
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] */
bi.tb = tb; buffer_info_init_bh(tb, &bi, S_new[i]);
bi.bi_bh = S_new[i];
bi.bi_parent = NULL;
bi.bi_position = 0;
if (n_rem > zeros_num) { if (n_rem > zeros_num) {
r_zeros_number = 0; r_zeros_number = 0;
r_body = r_body =
...@@ -1490,10 +1459,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h ...@@ -1490,10 +1459,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h
leaf_mi); leaf_mi);
/* paste into item */ /* paste into item */
bi.tb = tb; buffer_info_init_bh(tb, &bi, S_new[i]);
bi.bi_bh = S_new[i];
bi.bi_parent = NULL;
bi.bi_position = 0;
leaf_paste_in_buffer(&bi, leaf_paste_in_buffer(&bi,
item_pos - n + item_pos - n +
snum[i], snum[i],
...@@ -1560,10 +1526,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h ...@@ -1560,10 +1526,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h
switch (flag) { switch (flag) {
case M_INSERT: /* insert item into S[0] */ case M_INSERT: /* insert item into S[0] */
bi.tb = tb; buffer_info_init_tbS0(tb, &bi);
bi.bi_bh = tbS0;
bi.bi_parent = PATH_H_PPARENT(tb->tb_path, 0);
bi.bi_position = PATH_H_POSITION(tb->tb_path, 1);
leaf_insert_into_buf(&bi, item_pos, ih, body, leaf_insert_into_buf(&bi, item_pos, ih, body,
zeros_num); zeros_num);
...@@ -1590,14 +1553,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h ...@@ -1590,14 +1553,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h
"PAP-12260: insert_size is 0 already"); "PAP-12260: insert_size is 0 already");
/* prepare space */ /* prepare space */
bi.tb = tb; buffer_info_init_tbS0(tb, &bi);
bi.bi_bh = tbS0;
bi.bi_parent =
PATH_H_PPARENT(tb->tb_path,
0);
bi.bi_position =
PATH_H_POSITION(tb->tb_path,
1);
leaf_paste_in_buffer(&bi, leaf_paste_in_buffer(&bi,
item_pos, item_pos,
pos_in_item, pos_in_item,
...@@ -1645,14 +1601,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h ...@@ -1645,14 +1601,7 @@ static int balance_leaf(struct tree_balance *tb, struct item_head *ih, /* item h
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]);
bi.tb = tb; buffer_info_init_tbS0(tb, &bi);
bi.bi_bh = tbS0;
bi.bi_parent =
PATH_H_PPARENT(tb->tb_path,
0);
bi.bi_position =
PATH_H_POSITION(tb->tb_path,
1);
leaf_paste_in_buffer(&bi, leaf_paste_in_buffer(&bi,
item_pos, item_pos,
pos_in_item, pos_in_item,
...@@ -1725,7 +1674,6 @@ void make_empty_node(struct buffer_info *bi) ...@@ -1725,7 +1674,6 @@ void make_empty_node(struct buffer_info *bi)
struct buffer_head *get_FEB(struct tree_balance *tb) struct buffer_head *get_FEB(struct tree_balance *tb)
{ {
int i; int i;
struct buffer_head *first_b;
struct buffer_info bi; struct buffer_info bi;
for (i = 0; i < MAX_FEB_SIZE; i++) for (i = 0; i < MAX_FEB_SIZE; i++)
...@@ -1735,16 +1683,13 @@ struct buffer_head *get_FEB(struct tree_balance *tb) ...@@ -1735,16 +1683,13 @@ struct buffer_head *get_FEB(struct tree_balance *tb)
if (i == MAX_FEB_SIZE) if (i == MAX_FEB_SIZE)
reiserfs_panic(tb->tb_sb, "vs-12300", "FEB list is empty"); reiserfs_panic(tb->tb_sb, "vs-12300", "FEB list is empty");
bi.tb = tb; buffer_info_init_bh(tb, &bi, tb->FEB[i]);
bi.bi_bh = first_b = tb->FEB[i];
bi.bi_parent = NULL;
bi.bi_position = 0;
make_empty_node(&bi); make_empty_node(&bi);
set_buffer_uptodate(first_b); set_buffer_uptodate(tb->FEB[i]);
tb->used[i] = tb->FEB[i];
tb->FEB[i] = NULL; tb->FEB[i] = NULL;
tb->used[i] = first_b;
return (first_b); return tb->used[i];
} }
/* This is now used because reiserfs_free_block has to be able to /* This is now used because reiserfs_free_block has to be able to
......
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