diff options
Diffstat (limited to 'fs/reiserfs/stree.c')
-rw-r--r-- | fs/reiserfs/stree.c | 59 |
1 files changed, 13 insertions, 46 deletions
diff --git a/fs/reiserfs/stree.c b/fs/reiserfs/stree.c index ec837a250a4..b2eaa0c6b7b 100644 --- a/fs/reiserfs/stree.c +++ b/fs/reiserfs/stree.c | |||
@@ -23,7 +23,6 @@ | |||
23 | * get_rkey | 23 | * get_rkey |
24 | * key_in_buffer | 24 | * key_in_buffer |
25 | * decrement_bcount | 25 | * decrement_bcount |
26 | * decrement_counters_in_path | ||
27 | * reiserfs_check_path | 26 | * reiserfs_check_path |
28 | * pathrelse_and_restore | 27 | * pathrelse_and_restore |
29 | * pathrelse | 28 | * pathrelse |
@@ -359,36 +358,6 @@ static inline int key_in_buffer(struct treepath *p_s_chk_path, /* Path which sho | |||
359 | return 1; | 358 | return 1; |
360 | } | 359 | } |
361 | 360 | ||
362 | inline void decrement_bcount(struct buffer_head *p_s_bh) | ||
363 | { | ||
364 | if (p_s_bh) { | ||
365 | if (atomic_read(&(p_s_bh->b_count))) { | ||
366 | put_bh(p_s_bh); | ||
367 | return; | ||
368 | } | ||
369 | reiserfs_panic(NULL, "PAP-5070", | ||
370 | "trying to free free buffer %b", p_s_bh); | ||
371 | } | ||
372 | } | ||
373 | |||
374 | /* Decrement b_count field of the all buffers in the path. */ | ||
375 | void decrement_counters_in_path(struct treepath *p_s_search_path) | ||
376 | { | ||
377 | int n_path_offset = p_s_search_path->path_length; | ||
378 | |||
379 | RFALSE(n_path_offset < ILLEGAL_PATH_ELEMENT_OFFSET || | ||
380 | n_path_offset > EXTENDED_MAX_HEIGHT - 1, | ||
381 | "PAP-5080: invalid path offset of %d", n_path_offset); | ||
382 | |||
383 | while (n_path_offset > ILLEGAL_PATH_ELEMENT_OFFSET) { | ||
384 | struct buffer_head *bh; | ||
385 | |||
386 | bh = PATH_OFFSET_PBUFFER(p_s_search_path, n_path_offset--); | ||
387 | decrement_bcount(bh); | ||
388 | } | ||
389 | p_s_search_path->path_length = ILLEGAL_PATH_ELEMENT_OFFSET; | ||
390 | } | ||
391 | |||
392 | int reiserfs_check_path(struct treepath *p) | 361 | int reiserfs_check_path(struct treepath *p) |
393 | { | 362 | { |
394 | RFALSE(p->path_length != ILLEGAL_PATH_ELEMENT_OFFSET, | 363 | RFALSE(p->path_length != ILLEGAL_PATH_ELEMENT_OFFSET, |
@@ -396,12 +365,11 @@ int reiserfs_check_path(struct treepath *p) | |||
396 | return 0; | 365 | return 0; |
397 | } | 366 | } |
398 | 367 | ||
399 | /* Release all buffers in the path. Restore dirty bits clean | 368 | /* Drop the reference to each buffer in a path and restore |
400 | ** when preparing the buffer for the log | 369 | * dirty bits clean when preparing the buffer for the log. |
401 | ** | 370 | * This version should only be called from fix_nodes() */ |
402 | ** only called from fix_nodes() | 371 | void pathrelse_and_restore(struct super_block *sb, |
403 | */ | 372 | struct treepath *p_s_search_path) |
404 | void pathrelse_and_restore(struct super_block *s, struct treepath *p_s_search_path) | ||
405 | { | 373 | { |
406 | int n_path_offset = p_s_search_path->path_length; | 374 | int n_path_offset = p_s_search_path->path_length; |
407 | 375 | ||
@@ -409,16 +377,15 @@ void pathrelse_and_restore(struct super_block *s, struct treepath *p_s_search_pa | |||
409 | "clm-4000: invalid path offset"); | 377 | "clm-4000: invalid path offset"); |
410 | 378 | ||
411 | while (n_path_offset > ILLEGAL_PATH_ELEMENT_OFFSET) { | 379 | while (n_path_offset > ILLEGAL_PATH_ELEMENT_OFFSET) { |
412 | reiserfs_restore_prepared_buffer(s, | 380 | struct buffer_head *bh; |
413 | PATH_OFFSET_PBUFFER | 381 | bh = PATH_OFFSET_PBUFFER(p_s_search_path, n_path_offset--); |
414 | (p_s_search_path, | 382 | reiserfs_restore_prepared_buffer(sb, bh); |
415 | n_path_offset)); | 383 | brelse(bh); |
416 | brelse(PATH_OFFSET_PBUFFER(p_s_search_path, n_path_offset--)); | ||
417 | } | 384 | } |
418 | p_s_search_path->path_length = ILLEGAL_PATH_ELEMENT_OFFSET; | 385 | p_s_search_path->path_length = ILLEGAL_PATH_ELEMENT_OFFSET; |
419 | } | 386 | } |
420 | 387 | ||
421 | /* Release all buffers in the path. */ | 388 | /* Drop the reference to each buffer in a path */ |
422 | void pathrelse(struct treepath *p_s_search_path) | 389 | void pathrelse(struct treepath *p_s_search_path) |
423 | { | 390 | { |
424 | int n_path_offset = p_s_search_path->path_length; | 391 | int n_path_offset = p_s_search_path->path_length; |
@@ -631,7 +598,7 @@ int search_by_key(struct super_block *p_s_sb, const struct cpu_key *p_s_key, /* | |||
631 | we must be careful to release all nodes in a path before we either | 598 | we must be careful to release all nodes in a path before we either |
632 | discard the path struct or re-use the path struct, as we do here. */ | 599 | discard the path struct or re-use the path struct, as we do here. */ |
633 | 600 | ||
634 | decrement_counters_in_path(p_s_search_path); | 601 | pathrelse(p_s_search_path); |
635 | 602 | ||
636 | right_neighbor_of_leaf_node = 0; | 603 | right_neighbor_of_leaf_node = 0; |
637 | 604 | ||
@@ -691,7 +658,7 @@ int search_by_key(struct super_block *p_s_sb, const struct cpu_key *p_s_key, /* | |||
691 | PROC_INFO_INC(p_s_sb, search_by_key_restarted); | 658 | PROC_INFO_INC(p_s_sb, search_by_key_restarted); |
692 | PROC_INFO_INC(p_s_sb, | 659 | PROC_INFO_INC(p_s_sb, |
693 | sbk_restarted[expected_level - 1]); | 660 | sbk_restarted[expected_level - 1]); |
694 | decrement_counters_in_path(p_s_search_path); | 661 | pathrelse(p_s_search_path); |
695 | 662 | ||
696 | /* Get the root block number so that we can repeat the search | 663 | /* Get the root block number so that we can repeat the search |
697 | starting from the root. */ | 664 | starting from the root. */ |
@@ -1868,7 +1835,7 @@ int reiserfs_do_truncate(struct reiserfs_transaction_handle *th, struct inode *p | |||
1868 | if (journal_transaction_should_end(th, 0) || | 1835 | if (journal_transaction_should_end(th, 0) || |
1869 | reiserfs_transaction_free_space(th) <= JOURNAL_FOR_FREE_BLOCK_AND_UPDATE_SD) { | 1836 | reiserfs_transaction_free_space(th) <= JOURNAL_FOR_FREE_BLOCK_AND_UPDATE_SD) { |
1870 | int orig_len_alloc = th->t_blocks_allocated; | 1837 | int orig_len_alloc = th->t_blocks_allocated; |
1871 | decrement_counters_in_path(&s_search_path); | 1838 | pathrelse(&s_search_path); |
1872 | 1839 | ||
1873 | if (update_timestamps) { | 1840 | if (update_timestamps) { |
1874 | p_s_inode->i_mtime = p_s_inode->i_ctime = | 1841 | p_s_inode->i_mtime = p_s_inode->i_ctime = |