Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4d20851d authored by Jeff Mahoney's avatar Jeff Mahoney Committed by Linus Torvalds
Browse files

reiserfs: remove first_zero_hint



The first_zero_hint metadata caching was never actually used, and it's of
dubious optimization quality.  This patch removes it.

It doesn't actually shrink the size of the reiserfs_bitmap_info struct, since
that doesn't work with block sizes larger than 8K.  There was a big fixme in
there, and with all the work lately in allowing block size > page size, I
might as well kill the fixme as well.

Signed-off-by: default avatarJeff Mahoney <jeffm@suse.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 3ee16670
Loading
Loading
Loading
Loading
+12 −17
Original line number Original line Diff line number Diff line
@@ -273,7 +273,7 @@ static inline int block_group_used(struct super_block *s, u32 id)
	 * to make a better decision. This favors long-term performace gain
	 * to make a better decision. This favors long-term performace gain
	 * with a better on-disk layout vs. a short term gain of skipping the
	 * with a better on-disk layout vs. a short term gain of skipping the
	 * read and potentially having a bad placement. */
	 * read and potentially having a bad placement. */
	if (info->first_zero_hint == 0) {
	if (info->free_count == UINT_MAX) {
		struct buffer_head *bh = reiserfs_read_bitmap_block(s, bm);
		struct buffer_head *bh = reiserfs_read_bitmap_block(s, bm);
		brelse(bh);
		brelse(bh);
	}
	}
@@ -1214,28 +1214,23 @@ void reiserfs_cache_bitmap_metadata(struct super_block *sb,
{
{
	unsigned long *cur = (unsigned long *)(bh->b_data + bh->b_size);
	unsigned long *cur = (unsigned long *)(bh->b_data + bh->b_size);


	info->first_zero_hint = 1 << (sb->s_blocksize_bits + 3);
	/* The first bit must ALWAYS be 1 */
	BUG_ON(!reiserfs_test_le_bit(0, (unsigned long *)bh->b_data));

	info->free_count = 0;


	while (--cur >= (unsigned long *)bh->b_data) {
	while (--cur >= (unsigned long *)bh->b_data) {
		int base = ((char *)cur - bh->b_data) << 3;
		int i;


		/* 0 and ~0 are special, we can optimize for them */
		/* 0 and ~0 are special, we can optimize for them */
		if (*cur == 0) {
		if (*cur == 0)
			info->first_zero_hint = base;
			info->free_count += BITS_PER_LONG;
			info->free_count += BITS_PER_LONG;
		} else if (*cur != ~0L) {       /* A mix, investigate */
		else if (*cur != ~0L)	/* A mix, investigate */
			int b;
			for (i = BITS_PER_LONG - 1; i >= 0; i--)
			for (b = BITS_PER_LONG - 1; b >= 0; b--) {
				if (!reiserfs_test_le_bit(i, cur))
				if (!reiserfs_test_le_bit(b, cur)) {
					info->first_zero_hint = base + b;
					info->free_count++;
					info->free_count++;
	}
	}
}
}
		}
	}
	/* The first bit must ALWAYS be 1 */
	BUG_ON(info->first_zero_hint == 0);
}


struct buffer_head *reiserfs_read_bitmap_block(struct super_block *sb,
struct buffer_head *reiserfs_read_bitmap_block(struct super_block *sb,
                                               unsigned int bitmap)
                                               unsigned int bitmap)
@@ -1264,7 +1259,7 @@ struct buffer_head *reiserfs_read_bitmap_block(struct super_block *sb,
		BUG_ON(!buffer_uptodate(bh));
		BUG_ON(!buffer_uptodate(bh));
		BUG_ON(atomic_read(&bh->b_count) == 0);
		BUG_ON(atomic_read(&bh->b_count) == 0);


		if (info->first_zero_hint == 0)
		if (info->free_count == UINT_MAX)
			reiserfs_cache_bitmap_metadata(sb, bh, info);
			reiserfs_cache_bitmap_metadata(sb, bh, info);
	}
	}


@@ -1279,7 +1274,7 @@ int reiserfs_init_bitmap_cache(struct super_block *sb)
	if (bitmap == NULL)
	if (bitmap == NULL)
		return -ENOMEM;
		return -ENOMEM;


	memset(bitmap, 0, sizeof (*bitmap) * SB_BMAP_NR(sb));
	memset(bitmap, 0xff, sizeof(*bitmap) * SB_BMAP_NR(sb));


	SB_AP_BITMAP(sb) = bitmap;
	SB_AP_BITMAP(sb) = bitmap;


+0 −6
Original line number Original line Diff line number Diff line
@@ -143,7 +143,6 @@ int reiserfs_resize(struct super_block *s, unsigned long block_count_new)
			mark_buffer_dirty(bh);
			mark_buffer_dirty(bh);
			sync_dirty_buffer(bh);
			sync_dirty_buffer(bh);
			// update bitmap_info stuff
			// update bitmap_info stuff
			bitmap[i].first_zero_hint = 1;
			bitmap[i].free_count = sb_blocksize(sb) * 8 - 1;
			bitmap[i].free_count = sb_blocksize(sb) * 8 - 1;
			brelse(bh);
			brelse(bh);
		}
		}
@@ -173,8 +172,6 @@ int reiserfs_resize(struct super_block *s, unsigned long block_count_new)
	for (i = block_r; i < s->s_blocksize * 8; i++)
	for (i = block_r; i < s->s_blocksize * 8; i++)
		reiserfs_test_and_clear_le_bit(i, bh->b_data);
		reiserfs_test_and_clear_le_bit(i, bh->b_data);
	info->free_count += s->s_blocksize * 8 - block_r;
	info->free_count += s->s_blocksize * 8 - block_r;
	if (!info->first_zero_hint)
		info->first_zero_hint = block_r;


	journal_mark_dirty(&th, s, bh);
	journal_mark_dirty(&th, s, bh);
	brelse(bh);
	brelse(bh);
@@ -196,9 +193,6 @@ int reiserfs_resize(struct super_block *s, unsigned long block_count_new)
	brelse(bh);
	brelse(bh);


	info->free_count -= s->s_blocksize * 8 - block_r_new;
	info->free_count -= s->s_blocksize * 8 - block_r_new;
	/* Extreme case where last bitmap is the only valid block in itself. */
	if (!info->free_count)
		info->first_zero_hint = 0;
	/* update super */
	/* update super */
	reiserfs_prepare_for_journal(s, SB_BUFFER_WITH_SB(s), 1);
	reiserfs_prepare_for_journal(s, SB_BUFFER_WITH_SB(s), 1);
	free_blocks = SB_FREE_BLOCKS(s);
	free_blocks = SB_FREE_BLOCKS(s);
+1 −3
Original line number Original line Diff line number Diff line
@@ -265,9 +265,7 @@ enum journal_state_bits {
typedef __u32(*hashf_t) (const signed char *, int);
typedef __u32(*hashf_t) (const signed char *, int);


struct reiserfs_bitmap_info {
struct reiserfs_bitmap_info {
	// FIXME: Won't work with block sizes > 8K
	__u32 free_count;
	__u16 first_zero_hint;
	__u16 free_count;
};
};


struct proc_dir_entry;
struct proc_dir_entry;