patch-2.4.25 linux-2.4.25/fs/ext2/super.c
Next file: linux-2.4.25/fs/ext3/inode.c
Previous file: linux-2.4.25/fs/ext2/inode.c
Back to the patch index
Back to the overall index
- Lines: 77
- Date:
2004-02-18 05:36:31.000000000 -0800
- Orig file:
linux-2.4.24/fs/ext2/super.c
- Orig date:
2002-11-28 15:53:15.000000000 -0800
diff -urN linux-2.4.24/fs/ext2/super.c linux-2.4.25/fs/ext2/super.c
@@ -397,14 +397,36 @@
return res;
}
+static unsigned long descriptor_loc(struct super_block *sb,
+ unsigned long logic_sb_block,
+ int nr)
+{
+ struct ext2_sb_info *sbi = EXT2_SB(sb);
+ unsigned long bg, first_data_block, first_meta_bg;
+ int has_super = 0;
+
+ first_data_block = le32_to_cpu(sbi->s_es->s_first_data_block);
+ first_meta_bg = le32_to_cpu(sbi->s_es->s_first_meta_bg);
+
+ if (!EXT2_HAS_INCOMPAT_FEATURE(sb, EXT2_FEATURE_INCOMPAT_META_BG) ||
+ nr < first_meta_bg)
+ return (logic_sb_block + nr + 1);
+ bg = sbi->s_desc_per_block * nr;
+ if (ext2_bg_has_super(sb, bg))
+ has_super = 1;
+ return (first_data_block + has_super + (bg * sbi->s_blocks_per_group));
+}
+
struct super_block * ext2_read_super (struct super_block * sb, void * data,
int silent)
{
struct buffer_head * bh;
+ struct ext2_sb_info * sbi = EXT2_SB(sb);
struct ext2_super_block * es;
unsigned long sb_block = 1;
unsigned short resuid = EXT2_DEF_RESUID;
unsigned short resgid = EXT2_DEF_RESGID;
+ unsigned long block;
unsigned long logic_sb_block = 1;
unsigned long offset = 0;
kdev_t dev = sb->s_dev;
@@ -522,14 +544,16 @@
}
if (le32_to_cpu(es->s_rev_level) == EXT2_GOOD_OLD_REV) {
- sb->u.ext2_sb.s_inode_size = EXT2_GOOD_OLD_INODE_SIZE;
- sb->u.ext2_sb.s_first_ino = EXT2_GOOD_OLD_FIRST_INO;
+ sbi->s_inode_size = EXT2_GOOD_OLD_INODE_SIZE;
+ sbi->s_first_ino = EXT2_GOOD_OLD_FIRST_INO;
} else {
- sb->u.ext2_sb.s_inode_size = le16_to_cpu(es->s_inode_size);
- sb->u.ext2_sb.s_first_ino = le32_to_cpu(es->s_first_ino);
- if (sb->u.ext2_sb.s_inode_size != EXT2_GOOD_OLD_INODE_SIZE) {
+ sbi->s_inode_size = le16_to_cpu(es->s_inode_size);
+ sbi->s_first_ino = le32_to_cpu(es->s_first_ino);
+ if ((sbi->s_inode_size < EXT2_GOOD_OLD_INODE_SIZE) ||
+ (sbi->s_inode_size & (sbi->s_inode_size - 1)) ||
+ (sbi->s_inode_size > blocksize)) {
printk ("EXT2-fs: unsupported inode size: %d\n",
- sb->u.ext2_sb.s_inode_size);
+ sbi->s_inode_size);
goto failed_mount;
}
}
@@ -611,11 +635,12 @@
goto failed_mount;
}
for (i = 0; i < db_count; i++) {
- sb->u.ext2_sb.s_group_desc[i] = sb_bread(sb, logic_sb_block + i + 1);
- if (!sb->u.ext2_sb.s_group_desc[i]) {
+ block = descriptor_loc(sb, logic_sb_block, i);
+ sbi->s_group_desc[i] = sb_bread(sb, block);
+ if (!sbi->s_group_desc[i]) {
for (j = 0; j < i; j++)
- brelse (sb->u.ext2_sb.s_group_desc[j]);
- kfree(sb->u.ext2_sb.s_group_desc);
+ brelse (sbi->s_group_desc[j]);
+ kfree(sbi->s_group_desc);
printk ("EXT2-fs: unable to read group descriptors\n");
goto failed_mount;
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)