diff options
Diffstat (limited to 'fs/ocfs2/suballoc.c')
| -rw-r--r-- | fs/ocfs2/suballoc.c | 25 | 
1 files changed, 11 insertions, 14 deletions
| diff --git a/fs/ocfs2/suballoc.c b/fs/ocfs2/suballoc.c index 481017e1dac5..166c8918c825 100644 --- a/fs/ocfs2/suballoc.c +++ b/fs/ocfs2/suballoc.c @@ -1251,26 +1251,23 @@ static int ocfs2_test_bg_bit_allocatable(struct buffer_head *bg_bh,  {  	struct ocfs2_group_desc *bg = (struct ocfs2_group_desc *) bg_bh->b_data;  	struct journal_head *jh; -	int ret = 1; +	int ret;  	if (ocfs2_test_bit(nr, (unsigned long *)bg->bg_bitmap))  		return 0; -	if (!buffer_jbd(bg_bh)) +	jh = jbd2_journal_grab_journal_head(bg_bh); +	if (!jh)  		return 1; -	jbd_lock_bh_journal_head(bg_bh); -	if (buffer_jbd(bg_bh)) { -		jh = bh2jh(bg_bh); -		spin_lock(&jh->b_state_lock); -		bg = (struct ocfs2_group_desc *) jh->b_committed_data; -		if (bg) -			ret = !ocfs2_test_bit(nr, (unsigned long *)bg->bg_bitmap); -		else -			ret = 1; -		spin_unlock(&jh->b_state_lock); -	} -	jbd_unlock_bh_journal_head(bg_bh); +	spin_lock(&jh->b_state_lock); +	bg = (struct ocfs2_group_desc *) jh->b_committed_data; +	if (bg) +		ret = !ocfs2_test_bit(nr, (unsigned long *)bg->bg_bitmap); +	else +		ret = 1; +	spin_unlock(&jh->b_state_lock); +	jbd2_journal_put_journal_head(jh);  	return ret;  } |