aboutsummaryrefslogtreecommitdiffstats
path: root/fs/reiserfs/stree.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/reiserfs/stree.c')
-rw-r--r--fs/reiserfs/stree.c59
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
362inline 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. */
375void 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
392int reiserfs_check_path(struct treepath *p) 361int 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() 371void pathrelse_and_restore(struct super_block *sb,
403*/ 372 struct treepath *p_s_search_path)
404void 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 */
422void pathrelse(struct treepath *p_s_search_path) 389void 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 =