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

[PATCH] ReiserFS: Cleanup internal use of bh macros

This patch cleans up ReiserFS's use of buffer head flags.  All direct
access of BH_* are made into macro calls, and all reiserfs-specific BH_*
macro implementations have been removed and replaced with the BUFFER_FNS
implementations found in linux/buffer_head.h
Signed-off-by: default avatarJeff Mahoney <jeffm@novell.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 39c2ceb9
...@@ -1341,7 +1341,7 @@ static void check_internal_node (struct super_block * s, struct buffer_head * bh ...@@ -1341,7 +1341,7 @@ static void check_internal_node (struct super_block * s, struct buffer_head * bh
static int locked_or_not_in_tree (struct buffer_head * bh, char * which) static int locked_or_not_in_tree (struct buffer_head * bh, char * which)
{ {
if ( (!reiserfs_buffer_prepared(bh) && buffer_locked (bh)) || if ( (!buffer_journal_prepared (bh) && buffer_locked (bh)) ||
!B_IS_IN_TREE (bh) ) { !B_IS_IN_TREE (bh) ) {
reiserfs_warning (NULL, "vs-12339: locked_or_not_in_tree: %s (%b)", reiserfs_warning (NULL, "vs-12339: locked_or_not_in_tree: %s (%b)",
which, bh); which, bh);
......
...@@ -820,7 +820,7 @@ static int get_empty_nodes( ...@@ -820,7 +820,7 @@ static int get_empty_nodes(
RFALSE (p_s_tb->FEB[p_s_tb->cur_blknum], RFALSE (p_s_tb->FEB[p_s_tb->cur_blknum],
"PAP-8141: busy slot for new buffer"); "PAP-8141: busy slot for new buffer");
mark_buffer_journal_new(p_s_new_bh) ; set_buffer_journal_new (p_s_new_bh);
p_s_tb->FEB[p_s_tb->cur_blknum++] = p_s_new_bh; p_s_tb->FEB[p_s_tb->cur_blknum++] = p_s_new_bh;
} }
......
...@@ -122,7 +122,7 @@ static void init_journal_hash(struct super_block *p_s_sb) { ...@@ -122,7 +122,7 @@ static void init_journal_hash(struct super_block *p_s_sb) {
static int reiserfs_clean_and_file_buffer(struct buffer_head *bh) { static int reiserfs_clean_and_file_buffer(struct buffer_head *bh) {
if (bh) { if (bh) {
clear_buffer_dirty(bh); clear_buffer_dirty(bh);
clear_bit(BH_JTest, &bh->b_state); clear_buffer_journal_test(bh);
} }
return 0 ; return 0 ;
} }
...@@ -388,41 +388,9 @@ static void free_cnode(struct super_block *p_s_sb, struct reiserfs_journal_cnode ...@@ -388,41 +388,9 @@ static void free_cnode(struct super_block *p_s_sb, struct reiserfs_journal_cnode
SB_JOURNAL(p_s_sb)->j_cnode_free_list = cn ; SB_JOURNAL(p_s_sb)->j_cnode_free_list = cn ;
} }
static int clear_prepared_bits(struct buffer_head *bh) { static void clear_prepared_bits(struct buffer_head *bh) {
clear_bit(BH_JPrepared, &bh->b_state) ; clear_buffer_journal_prepared (bh);
clear_bit(BH_JRestore_dirty, &bh->b_state) ; clear_buffer_journal_restore_dirty (bh);
return 0 ;
}
/* buffer is in current transaction */
inline int buffer_journaled(const struct buffer_head *bh) {
if (bh)
return test_bit(BH_JDirty, &bh->b_state) ;
else
return 0 ;
}
/* disk block was taken off free list before being in a finished transation, or written to disk
** journal_new blocks can be reused immediately, for any purpose
*/
inline int buffer_journal_new(const struct buffer_head *bh) {
if (bh)
return test_bit(BH_JNew, &bh->b_state) ;
else
return 0 ;
}
inline int mark_buffer_journal_new(struct buffer_head *bh) {
if (bh) {
set_bit(BH_JNew, &bh->b_state) ;
}
return 0 ;
}
inline int mark_buffer_not_journaled(struct buffer_head *bh) {
if (bh)
clear_bit(BH_JDirty, &bh->b_state) ;
return 0 ;
} }
/* utility function to force a BUG if it is called without the big /* utility function to force a BUG if it is called without the big
...@@ -628,9 +596,9 @@ static void reiserfs_end_ordered_io(struct buffer_head *bh, int uptodate) { ...@@ -628,9 +596,9 @@ static void reiserfs_end_ordered_io(struct buffer_head *bh, int uptodate) {
static void submit_logged_buffer(struct buffer_head *bh) { static void submit_logged_buffer(struct buffer_head *bh) {
get_bh(bh) ; get_bh(bh) ;
bh->b_end_io = reiserfs_end_buffer_io_sync ; bh->b_end_io = reiserfs_end_buffer_io_sync ;
mark_buffer_notjournal_new(bh) ; clear_buffer_journal_new (bh);
clear_buffer_dirty(bh) ; clear_buffer_dirty(bh) ;
if (!test_and_clear_bit(BH_JTest, &bh->b_state)) if (!test_clear_buffer_journal_test (bh))
BUG(); BUG();
if (!buffer_uptodate(bh)) if (!buffer_uptodate(bh))
BUG(); BUG();
...@@ -1383,7 +1351,7 @@ static int flush_journal_list(struct super_block *s, ...@@ -1383,7 +1351,7 @@ static int flush_journal_list(struct super_block *s,
/* note, we must clear the JDirty_wait bit after the up to date /* note, we must clear the JDirty_wait bit after the up to date
** check, otherwise we race against our flushpage routine ** check, otherwise we race against our flushpage routine
*/ */
if (!test_and_clear_bit(BH_JDirty_wait, &cn->bh->b_state)) if (!test_clear_buffer_journal_dirty (cn->bh))
BUG(); BUG();
/* undo the inc from journal_mark_dirty */ /* undo the inc from journal_mark_dirty */
...@@ -1476,7 +1444,7 @@ static int write_one_transaction(struct super_block *s, ...@@ -1476,7 +1444,7 @@ static int write_one_transaction(struct super_block *s,
lock_buffer(tmp_bh); lock_buffer(tmp_bh);
if (cn->bh && can_dirty(cn) && buffer_dirty(tmp_bh)) { if (cn->bh && can_dirty(cn) && buffer_dirty(tmp_bh)) {
if (!buffer_journal_dirty(tmp_bh) || if (!buffer_journal_dirty(tmp_bh) ||
reiserfs_buffer_prepared(tmp_bh)) buffer_journal_prepared(tmp_bh))
BUG(); BUG();
add_to_chunk(chunk, tmp_bh, NULL, write_chunk); add_to_chunk(chunk, tmp_bh, NULL, write_chunk);
ret++; ret++;
...@@ -1517,11 +1485,11 @@ static int dirty_one_transaction(struct super_block *s, ...@@ -1517,11 +1485,11 @@ static int dirty_one_transaction(struct super_block *s,
* or restored. If restored, we need to make sure * or restored. If restored, we need to make sure
* it actually gets marked dirty * it actually gets marked dirty
*/ */
mark_buffer_notjournal_new(cn->bh) ; clear_buffer_journal_new (cn->bh);
if (test_bit(BH_JPrepared, &cn->bh->b_state)) { if (buffer_journal_prepared (cn->bh)) {
set_bit(BH_JRestore_dirty, &cn->bh->b_state); set_buffer_journal_restore_dirty (cn->bh);
} else { } else {
set_bit(BH_JTest, &cn->bh->b_state); set_buffer_journal_test (cn->bh);
mark_buffer_dirty(cn->bh); mark_buffer_dirty(cn->bh);
} }
} }
...@@ -2777,8 +2745,8 @@ int journal_mark_dirty(struct reiserfs_transaction_handle *th, struct super_bloc ...@@ -2777,8 +2745,8 @@ int journal_mark_dirty(struct reiserfs_transaction_handle *th, struct super_bloc
} }
p_s_sb->s_dirt = 1; p_s_sb->s_dirt = 1;
prepared = test_and_clear_bit(BH_JPrepared, &bh->b_state) ; prepared = test_clear_buffer_journal_prepared (bh);
clear_bit(BH_JRestore_dirty, &bh->b_state); clear_buffer_journal_restore_dirty (bh);
/* already in this transaction, we are done */ /* already in this transaction, we are done */
if (buffer_journaled(bh)) { if (buffer_journaled(bh)) {
PROC_INFO_INC( p_s_sb, journal.mark_dirty_already ); PROC_INFO_INC( p_s_sb, journal.mark_dirty_already );
...@@ -2812,14 +2780,14 @@ int journal_mark_dirty(struct reiserfs_transaction_handle *th, struct super_bloc ...@@ -2812,14 +2780,14 @@ int journal_mark_dirty(struct reiserfs_transaction_handle *th, struct super_bloc
if (buffer_journal_dirty(bh)) { if (buffer_journal_dirty(bh)) {
count_already_incd = 1 ; count_already_incd = 1 ;
PROC_INFO_INC( p_s_sb, journal.mark_dirty_notjournal ); PROC_INFO_INC( p_s_sb, journal.mark_dirty_notjournal );
mark_buffer_notjournal_dirty(bh) ; clear_buffer_journal_dirty (bh);
} }
if (SB_JOURNAL(p_s_sb)->j_len > SB_JOURNAL(p_s_sb)->j_len_alloc) { if (SB_JOURNAL(p_s_sb)->j_len > SB_JOURNAL(p_s_sb)->j_len_alloc) {
SB_JOURNAL(p_s_sb)->j_len_alloc = SB_JOURNAL(p_s_sb)->j_len + JOURNAL_PER_BALANCE_CNT ; SB_JOURNAL(p_s_sb)->j_len_alloc = SB_JOURNAL(p_s_sb)->j_len + JOURNAL_PER_BALANCE_CNT ;
} }
set_bit(BH_JDirty, &bh->b_state) ; set_buffer_journaled (bh);
/* now put this guy on the end */ /* now put this guy on the end */
if (!cn) { if (!cn) {
...@@ -2913,10 +2881,10 @@ static int remove_from_transaction(struct super_block *p_s_sb, b_blocknr_t block ...@@ -2913,10 +2881,10 @@ static int remove_from_transaction(struct super_block *p_s_sb, b_blocknr_t block
} }
if (bh) if (bh)
remove_journal_hash(p_s_sb, SB_JOURNAL(p_s_sb)->j_hash_table, NULL, bh->b_blocknr, 0) ; remove_journal_hash(p_s_sb, SB_JOURNAL(p_s_sb)->j_hash_table, NULL, bh->b_blocknr, 0) ;
mark_buffer_not_journaled(bh) ; /* don't log this one */ clear_buffer_journaled (bh); /* don't log this one */
if (!already_cleaned) { if (!already_cleaned) {
mark_buffer_notjournal_dirty(bh) ; clear_buffer_journal_dirty (bh);
put_bh(bh) ; put_bh(bh) ;
if (atomic_read(&(bh->b_count)) < 0) { if (atomic_read(&(bh->b_count)) < 0) {
reiserfs_warning (p_s_sb, "journal-1752: remove from trans, b_count < 0"); reiserfs_warning (p_s_sb, "journal-1752: remove from trans, b_count < 0");
...@@ -3183,7 +3151,7 @@ int journal_mark_freed(struct reiserfs_transaction_handle *th, struct super_bloc ...@@ -3183,7 +3151,7 @@ int journal_mark_freed(struct reiserfs_transaction_handle *th, struct super_bloc
} }
/* if it is journal new, we just remove it from this transaction */ /* if it is journal new, we just remove it from this transaction */
if (bh && buffer_journal_new(bh)) { if (bh && buffer_journal_new(bh)) {
mark_buffer_notjournal_new(bh) ; clear_buffer_journal_new (bh);
clear_prepared_bits(bh) ; clear_prepared_bits(bh) ;
reiserfs_clean_and_file_buffer(bh) ; reiserfs_clean_and_file_buffer(bh) ;
cleaned = remove_from_transaction(p_s_sb, blocknr, cleaned) ; cleaned = remove_from_transaction(p_s_sb, blocknr, cleaned) ;
...@@ -3213,7 +3181,7 @@ int journal_mark_freed(struct reiserfs_transaction_handle *th, struct super_bloc ...@@ -3213,7 +3181,7 @@ int journal_mark_freed(struct reiserfs_transaction_handle *th, struct super_bloc
/* remove_from_transaction will brelse the buffer if it was /* remove_from_transaction will brelse the buffer if it was
** in the current trans ** in the current trans
*/ */
mark_buffer_notjournal_dirty(cn->bh) ; clear_buffer_journal_dirty (cn->bh);
cleaned = 1 ; cleaned = 1 ;
put_bh(cn->bh) ; put_bh(cn->bh) ;
if (atomic_read(&(cn->bh->b_count)) < 0) { if (atomic_read(&(cn->bh->b_count)) < 0) {
...@@ -3320,18 +3288,18 @@ void reiserfs_restore_prepared_buffer(struct super_block *p_s_sb, ...@@ -3320,18 +3288,18 @@ void reiserfs_restore_prepared_buffer(struct super_block *p_s_sb,
if (!bh) { if (!bh) {
return ; return ;
} }
if (test_and_clear_bit(BH_JRestore_dirty, &bh->b_state) && if (test_clear_buffer_journal_restore_dirty (bh) &&
buffer_journal_dirty(bh)) { buffer_journal_dirty(bh)) {
struct reiserfs_journal_cnode *cn; struct reiserfs_journal_cnode *cn;
cn = get_journal_hash_dev(p_s_sb, cn = get_journal_hash_dev(p_s_sb,
SB_JOURNAL(p_s_sb)->j_list_hash_table, SB_JOURNAL(p_s_sb)->j_list_hash_table,
bh->b_blocknr); bh->b_blocknr);
if (cn && can_dirty(cn)) { if (cn && can_dirty(cn)) {
set_bit(BH_JTest, &bh->b_state); set_buffer_journal_test (bh);
mark_buffer_dirty(bh); mark_buffer_dirty(bh);
} }
} }
clear_bit(BH_JPrepared, &bh->b_state) ; clear_buffer_journal_prepared (bh);
} }
extern struct tree_balance *cur_tb ; extern struct tree_balance *cur_tb ;
...@@ -3351,10 +3319,10 @@ int reiserfs_prepare_for_journal(struct super_block *p_s_sb, ...@@ -3351,10 +3319,10 @@ int reiserfs_prepare_for_journal(struct super_block *p_s_sb,
return 0; return 0;
lock_buffer(bh); lock_buffer(bh);
} }
set_bit(BH_JPrepared, &bh->b_state); set_buffer_journal_prepared (bh);
if (test_clear_buffer_dirty(bh) && buffer_journal_dirty(bh)) { if (test_clear_buffer_dirty(bh) && buffer_journal_dirty(bh)) {
clear_bit(BH_JTest, &bh->b_state); clear_buffer_journal_test (bh);
set_bit(BH_JRestore_dirty, &bh->b_state); set_buffer_journal_restore_dirty (bh);
} }
unlock_buffer(bh); unlock_buffer(bh);
return 1; return 1;
...@@ -3499,7 +3467,7 @@ static int do_journal_end(struct reiserfs_transaction_handle *th, struct super_b ...@@ -3499,7 +3467,7 @@ static int do_journal_end(struct reiserfs_transaction_handle *th, struct super_b
*/ */
trans_half = journal_trans_half(p_s_sb->s_blocksize); trans_half = journal_trans_half(p_s_sb->s_blocksize);
for (i = 0, cn = SB_JOURNAL(p_s_sb)->j_first ; cn ; cn = cn->next, i++) { for (i = 0, cn = SB_JOURNAL(p_s_sb)->j_first ; cn ; cn = cn->next, i++) {
if (test_bit(BH_JDirty, &cn->bh->b_state) ) { if (buffer_journaled (cn->bh)) {
jl_cn = get_cnode(p_s_sb) ; jl_cn = get_cnode(p_s_sb) ;
if (!jl_cn) { if (!jl_cn) {
reiserfs_panic(p_s_sb, "journal-1676, get_cnode returned NULL\n") ; reiserfs_panic(p_s_sb, "journal-1676, get_cnode returned NULL\n") ;
...@@ -3555,9 +3523,9 @@ static int do_journal_end(struct reiserfs_transaction_handle *th, struct super_b ...@@ -3555,9 +3523,9 @@ static int do_journal_end(struct reiserfs_transaction_handle *th, struct super_b
cn = SB_JOURNAL(p_s_sb)->j_first ; cn = SB_JOURNAL(p_s_sb)->j_first ;
jindex = 1 ; /* start at one so we don't get the desc again */ jindex = 1 ; /* start at one so we don't get the desc again */
while(cn) { while(cn) {
clear_bit(BH_JNew, &(cn->bh->b_state)) ; clear_buffer_journal_new (cn->bh);
/* copy all the real blocks into log area. dirty log blocks */ /* copy all the real blocks into log area. dirty log blocks */
if (test_bit(BH_JDirty, &cn->bh->b_state)) { if (buffer_journaled (cn->bh)) {
struct buffer_head *tmp_bh ; struct buffer_head *tmp_bh ;
char *addr; char *addr;
struct page *page; struct page *page;
...@@ -3571,8 +3539,8 @@ static int do_journal_end(struct reiserfs_transaction_handle *th, struct super_b ...@@ -3571,8 +3539,8 @@ static int do_journal_end(struct reiserfs_transaction_handle *th, struct super_b
kunmap(page); kunmap(page);
mark_buffer_dirty(tmp_bh); mark_buffer_dirty(tmp_bh);
jindex++ ; jindex++ ;
set_bit(BH_JDirty_wait, &(cn->bh->b_state)) ; set_buffer_journal_dirty (cn->bh);
clear_bit(BH_JDirty, &(cn->bh->b_state)) ; clear_buffer_journaled (cn->bh);
} else { } else {
/* JDirty cleared sometime during transaction. don't log this one */ /* JDirty cleared sometime during transaction. don't log this one */
reiserfs_warning(p_s_sb, "journal-2048: do_journal_end: BAD, buffer in journal hash, but not JDirty!") ; reiserfs_warning(p_s_sb, "journal-2048: do_journal_end: BAD, buffer in journal hash, but not JDirty!") ;
......
...@@ -1289,7 +1289,7 @@ static int reiserfs_rename (struct inode * old_dir, struct dentry *old_dentry, ...@@ -1289,7 +1289,7 @@ static int reiserfs_rename (struct inode * old_dir, struct dentry *old_dentry,
} }
RFALSE( S_ISDIR(old_inode_mode) && RFALSE( S_ISDIR(old_inode_mode) &&
!reiserfs_buffer_prepared(dot_dot_de.de_bh), "" ); !buffer_journal_prepared(dot_dot_de.de_bh), "" );
break; break;
} }
......
...@@ -1711,14 +1711,29 @@ struct reiserfs_journal_header { ...@@ -1711,14 +1711,29 @@ struct reiserfs_journal_header {
#define journal_bread(s, block) __bread(SB_JOURNAL(s)->j_dev_bd, block, s->s_blocksize) #define journal_bread(s, block) __bread(SB_JOURNAL(s)->j_dev_bd, block, s->s_blocksize)
enum reiserfs_bh_state_bits { enum reiserfs_bh_state_bits {
BH_JDirty = BH_PrivateStart, BH_JDirty = BH_PrivateStart, /* buffer is in current transaction */
BH_JDirty_wait, BH_JDirty_wait,
BH_JNew, BH_JNew, /* disk block was taken off free list before
* being in a finished transaction, or
* written to disk. Can be reused immed. */
BH_JPrepared, BH_JPrepared,
BH_JRestore_dirty, BH_JRestore_dirty,
BH_JTest, // debugging only will go away BH_JTest, // debugging only will go away
}; };
BUFFER_FNS(JDirty, journaled);
TAS_BUFFER_FNS(JDirty, journaled);
BUFFER_FNS(JDirty_wait, journal_dirty);
TAS_BUFFER_FNS(JDirty_wait, journal_dirty);
BUFFER_FNS(JNew, journal_new);
TAS_BUFFER_FNS(JNew, journal_new);
BUFFER_FNS(JPrepared, journal_prepared);
TAS_BUFFER_FNS(JPrepared, journal_prepared);
BUFFER_FNS(JRestore_dirty, journal_restore_dirty);
TAS_BUFFER_FNS(JRestore_dirty, journal_restore_dirty);
BUFFER_FNS(JTest, journal_test);
TAS_BUFFER_FNS(JTest, journal_test);
/* /*
** transaction handle which is passed around for all journal calls ** transaction handle which is passed around for all journal calls
*/ */
...@@ -1796,37 +1811,8 @@ int journal_transaction_should_end(struct reiserfs_transaction_handle *, int) ; ...@@ -1796,37 +1811,8 @@ int journal_transaction_should_end(struct reiserfs_transaction_handle *, int) ;
int reiserfs_in_journal(struct super_block *p_s_sb, int bmap_nr, int bit_nr, int searchall, b_blocknr_t *next) ; int reiserfs_in_journal(struct super_block *p_s_sb, int bmap_nr, int bit_nr, int searchall, b_blocknr_t *next) ;
int journal_begin(struct reiserfs_transaction_handle *, struct super_block *p_s_sb, unsigned long) ; int journal_begin(struct reiserfs_transaction_handle *, struct super_block *p_s_sb, unsigned long) ;
int buffer_journaled(const struct buffer_head *bh) ;
int mark_buffer_journal_new(struct buffer_head *bh) ;
int reiserfs_allocate_list_bitmaps(struct super_block *s, struct reiserfs_list_bitmap *, int) ; int reiserfs_allocate_list_bitmaps(struct super_block *s, struct reiserfs_list_bitmap *, int) ;
/* why is this kerplunked right here? */
static inline int reiserfs_buffer_prepared(const struct buffer_head *bh) {
if (bh && test_bit(BH_JPrepared, &bh->b_state))
return 1 ;
else
return 0 ;
}
/* buffer was journaled, waiting to get to disk */
static inline int buffer_journal_dirty(const struct buffer_head *bh) {
if (bh)
return test_bit(BH_JDirty_wait, &bh->b_state) ;
else
return 0 ;
}
static inline int mark_buffer_notjournal_dirty(struct buffer_head *bh) {
if (bh)
clear_bit(BH_JDirty_wait, &bh->b_state) ;
return 0 ;
}
static inline int mark_buffer_notjournal_new(struct buffer_head *bh) {
if (bh) {
clear_bit(BH_JNew, &bh->b_state) ;
}
return 0 ;
}
void add_save_link (struct reiserfs_transaction_handle * th, void add_save_link (struct reiserfs_transaction_handle * th,
struct inode * inode, int truncate); struct inode * inode, int truncate);
void remove_save_link (struct inode * inode, int truncate); void remove_save_link (struct inode * inode, int truncate);
......
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