|
@@ -1243,118 +1243,6 @@ static int reiserfs_remount(struct super_block *s, int *mount_flags, char *arg)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-/* load_bitmap_info_data - Sets up the reiserfs_bitmap_info structure from disk.
|
|
|
- * @sb - superblock for this filesystem
|
|
|
- * @bi - the bitmap info to be loaded. Requires that bi->bh is valid.
|
|
|
- *
|
|
|
- * This routine counts how many free bits there are, finding the first zero
|
|
|
- * as a side effect. Could also be implemented as a loop of test_bit() calls, or
|
|
|
- * a loop of find_first_zero_bit() calls. This implementation is similar to
|
|
|
- * find_first_zero_bit(), but doesn't return after it finds the first bit.
|
|
|
- * Should only be called on fs mount, but should be fairly efficient anyways.
|
|
|
- *
|
|
|
- * bi->first_zero_hint is considered unset if it == 0, since the bitmap itself
|
|
|
- * will * invariably occupt block 0 represented in the bitmap. The only
|
|
|
- * exception to this is when free_count also == 0, since there will be no
|
|
|
- * free blocks at all.
|
|
|
- */
|
|
|
-
|
|
|
-static void load_bitmap_info_data(struct super_block *sb,
|
|
|
- struct reiserfs_bitmap_info *bi)
|
|
|
-{
|
|
|
- unsigned long *cur = (unsigned long *)bi->bh->b_data;
|
|
|
-
|
|
|
- while ((char *)cur < (bi->bh->b_data + sb->s_blocksize)) {
|
|
|
-
|
|
|
- /* No need to scan if all 0's or all 1's.
|
|
|
- * Since we're only counting 0's, we can simply ignore all 1's */
|
|
|
- if (*cur == 0) {
|
|
|
- if (bi->first_zero_hint == 0) {
|
|
|
- bi->first_zero_hint =
|
|
|
- ((char *)cur - bi->bh->b_data) << 3;
|
|
|
- }
|
|
|
- bi->free_count += sizeof(unsigned long) * 8;
|
|
|
- } else if (*cur != ~0L) {
|
|
|
- int b;
|
|
|
- for (b = 0; b < sizeof(unsigned long) * 8; b++) {
|
|
|
- if (!reiserfs_test_le_bit(b, cur)) {
|
|
|
- bi->free_count++;
|
|
|
- if (bi->first_zero_hint == 0)
|
|
|
- bi->first_zero_hint =
|
|
|
- (((char *)cur -
|
|
|
- bi->bh->b_data) << 3) + b;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- cur++;
|
|
|
- }
|
|
|
-
|
|
|
-#ifdef CONFIG_REISERFS_CHECK
|
|
|
-// This outputs a lot of unneded info on big FSes
|
|
|
-// reiserfs_warning ("bitmap loaded from block %d: %d free blocks",
|
|
|
-// bi->bh->b_blocknr, bi->free_count);
|
|
|
-#endif
|
|
|
-}
|
|
|
-
|
|
|
-static int read_bitmaps(struct super_block *s)
|
|
|
-{
|
|
|
- int i, bmap_nr;
|
|
|
-
|
|
|
- SB_AP_BITMAP(s) =
|
|
|
- vmalloc(sizeof(struct reiserfs_bitmap_info) * SB_BMAP_NR(s));
|
|
|
- if (SB_AP_BITMAP(s) == 0)
|
|
|
- return 1;
|
|
|
- memset(SB_AP_BITMAP(s), 0,
|
|
|
- sizeof(struct reiserfs_bitmap_info) * SB_BMAP_NR(s));
|
|
|
- for (i = 0, bmap_nr =
|
|
|
- REISERFS_DISK_OFFSET_IN_BYTES / s->s_blocksize + 1;
|
|
|
- i < SB_BMAP_NR(s); i++, bmap_nr = s->s_blocksize * 8 * i) {
|
|
|
- SB_AP_BITMAP(s)[i].bh = sb_getblk(s, bmap_nr);
|
|
|
- if (!buffer_uptodate(SB_AP_BITMAP(s)[i].bh))
|
|
|
- ll_rw_block(READ, 1, &SB_AP_BITMAP(s)[i].bh);
|
|
|
- }
|
|
|
- for (i = 0; i < SB_BMAP_NR(s); i++) {
|
|
|
- wait_on_buffer(SB_AP_BITMAP(s)[i].bh);
|
|
|
- if (!buffer_uptodate(SB_AP_BITMAP(s)[i].bh)) {
|
|
|
- reiserfs_warning(s, "sh-2029: reiserfs read_bitmaps: "
|
|
|
- "bitmap block (#%lu) reading failed",
|
|
|
- SB_AP_BITMAP(s)[i].bh->b_blocknr);
|
|
|
- for (i = 0; i < SB_BMAP_NR(s); i++)
|
|
|
- brelse(SB_AP_BITMAP(s)[i].bh);
|
|
|
- vfree(SB_AP_BITMAP(s));
|
|
|
- SB_AP_BITMAP(s) = NULL;
|
|
|
- return 1;
|
|
|
- }
|
|
|
- load_bitmap_info_data(s, SB_AP_BITMAP(s) + i);
|
|
|
- }
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-static int read_old_bitmaps(struct super_block *s)
|
|
|
-{
|
|
|
- int i;
|
|
|
- struct reiserfs_super_block *rs = SB_DISK_SUPER_BLOCK(s);
|
|
|
- int bmp1 = (REISERFS_OLD_DISK_OFFSET_IN_BYTES / s->s_blocksize) + 1; /* first of bitmap blocks */
|
|
|
-
|
|
|
- /* read true bitmap */
|
|
|
- SB_AP_BITMAP(s) =
|
|
|
- vmalloc(sizeof(struct reiserfs_buffer_info *) * sb_bmap_nr(rs));
|
|
|
- if (SB_AP_BITMAP(s) == 0)
|
|
|
- return 1;
|
|
|
-
|
|
|
- memset(SB_AP_BITMAP(s), 0,
|
|
|
- sizeof(struct reiserfs_buffer_info *) * sb_bmap_nr(rs));
|
|
|
-
|
|
|
- for (i = 0; i < sb_bmap_nr(rs); i++) {
|
|
|
- SB_AP_BITMAP(s)[i].bh = sb_bread(s, bmp1 + i);
|
|
|
- if (!SB_AP_BITMAP(s)[i].bh)
|
|
|
- return 1;
|
|
|
- load_bitmap_info_data(s, SB_AP_BITMAP(s) + i);
|
|
|
- }
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
static int read_super_block(struct super_block *s, int offset)
|
|
|
{
|
|
|
struct buffer_head *bh;
|
|
@@ -1736,7 +1624,7 @@ static int reiserfs_fill_super(struct super_block *s, void *data, int silent)
|
|
|
sbi->s_mount_state = SB_REISERFS_STATE(s);
|
|
|
sbi->s_mount_state = REISERFS_VALID_FS;
|
|
|
|
|
|
- if (old_format ? read_old_bitmaps(s) : read_bitmaps(s)) {
|
|
|
+ if ((errval = reiserfs_init_bitmap_cache(s))) {
|
|
|
SWARN(silent, s,
|
|
|
"jmacd-8: reiserfs_fill_super: unable to read bitmap");
|
|
|
goto error;
|