aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormaximilian attems <max@stro.at>2008-06-16 02:03:03 +0200
committermaximilian attems <max@stro.at>2008-06-16 02:15:49 +0200
commitd3603182d06c177eecfc0507dc931375bdc56d4e (patch)
tree88aa8ea035c3810354b6ee88c94146ffc43dead6
parent34a10f9b28a011e2cf42226ef260ad0d73ddc5b3 (diff)
downloadklibc-d3603182d06c177eecfc0507dc931375bdc56d4e.tar.gz
[klibc] fstype: fix ext4dev detectionklibc-1.5.11
ext4dev changed on disc format, cope with 2.6.26-rc6 ext4dev using e2fsprogs 1.40.8-2 mke2fs -q -j /dev/mapper/dualvg0-foo -E test_fs mount /dev/mapper/dualvg0-foo /mnt/ -t ext4dev EXT4 FS on dm-12, internal journal EXT4-fs: mounted filesystem with ordered data mode. EXT4-fs: file extents enabled EXT4-fs: mballoc enabled ./usr/kinit/fstype/shared/fstype /dev/mapper/dualvg0-foo FSTYPE=ext4dev FSSIZE=1073741824 as bonus fix ext3_super_block to latest definition. Signed-off-by: maximilian attems <max@stro.at>
-rw-r--r--usr/kinit/fstype/ext3_fs.h39
-rw-r--r--usr/kinit/fstype/fstype.c8
2 files changed, 42 insertions, 5 deletions
diff --git a/usr/kinit/fstype/ext3_fs.h b/usr/kinit/fstype/ext3_fs.h
index 12d64fe5e5f0c..f958e5cd7f00b 100644
--- a/usr/kinit/fstype/ext3_fs.h
+++ b/usr/kinit/fstype/ext3_fs.h
@@ -6,12 +6,31 @@
*/
#define EXT3_SUPER_MAGIC 0xEF53
+#define EXT2_FLAGS_TEST_FILESYS 0x0004
+#define EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER 0x0001
+#define EXT2_FEATURE_RO_COMPAT_LARGE_FILE 0x0002
+#define EXT2_FEATURE_RO_COMPAT_BTREE_DIR 0x0004
+#define EXT2_FEATURE_INCOMPAT_FILETYPE 0x0002
+#define EXT2_FEATURE_INCOMPAT_META_BG 0x0010
#define EXT3_FEATURE_COMPAT_HAS_JOURNAL 0x0004
#define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008
+#define EXT3_FEATURE_INCOMPAT_RECOVER 0x0004
+
#define EXT3_FEATURE_INCOMPAT_EXTENTS 0x0040
#define EXT4_FEATURE_INCOMPAT_64BIT 0x0080
#define EXT4_FEATURE_INCOMPAT_MMP 0x0100
+#define EXT3_FEATURE_RO_COMPAT_SUPP (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER| \
+ EXT2_FEATURE_RO_COMPAT_LARGE_FILE| \
+ EXT2_FEATURE_RO_COMPAT_BTREE_DIR)
+#define EXT3_FEATURE_RO_COMPAT_UNSUPPORTED ~EXT3_FEATURE_RO_COMPAT_SUPP
+#define EXT3_FEATURE_INCOMPAT_SUPP (EXT2_FEATURE_INCOMPAT_FILETYPE| \
+ EXT3_FEATURE_INCOMPAT_RECOVER| \
+ EXT2_FEATURE_INCOMPAT_META_BG)
+#define EXT3_FEATURE_INCOMPAT_UNSUPPORTED ~EXT3_FEATURE_INCOMPAT_SUPP
+
+
+
/*
* Structure of the super block
*/
@@ -93,9 +112,23 @@ struct ext3_super_block {
__u32 s_last_orphan; /* start of list of inodes to delete */
__u32 s_hash_seed[4]; /* HTREE hash seed */
__u8 s_def_hash_version; /* Default hash version to use */
- __u8 s_reserved_char_pad;
- __u16 s_reserved_word_pad;
- __u32 s_reserved[192]; /* Padding to the end of the block */
+ __u8 s_jnl_backup_type;
+ __u16 s_reserved_word_pad;
+ __u32 s_default_mount_opts;
+ __u32 s_first_meta_bg;
+ __u32 s_mkfs_time;
+ __u32 s_jnl_blocks[17];
+ __u32 s_blocks_count_hi;
+ __u32 s_r_blocks_count_hi;
+ __u32 s_free_blocks_hi;
+ __u16 s_min_extra_isize;
+ __u16 s_want_extra_isize;
+ __u32 s_flags;
+ __u16 s_raid_stride;
+ __u16 s_mmp_interval;
+ __u64 s_mmp_block;
+ __u32 s_raid_stripe_width;
+ __u32 s_reserved[163];
};
#endif /* __EXT3_FS_H */
diff --git a/usr/kinit/fstype/fstype.c b/usr/kinit/fstype/fstype.c
index eee3431402c1d..95c70a8c48ab9 100644
--- a/usr/kinit/fstype/fstype.c
+++ b/usr/kinit/fstype/fstype.c
@@ -115,11 +115,15 @@ static int ext4_image(const void *buf, unsigned long long *bytes)
const struct ext3_super_block *sb =
(const struct ext3_super_block *)buf;
+ /* ext4dev needs ext2 + journal + test_fs flag + one !ext3 feature */
if (sb->s_magic == __cpu_to_le16(EXT2_SUPER_MAGIC)
+ && (sb->s_feature_compat
+ & __cpu_to_le32(EXT3_FEATURE_COMPAT_HAS_JOURNAL))
+ && (sb->s_flags & __cpu_to_le32(EXT2_FLAGS_TEST_FILESYS))
&& (sb->s_feature_incompat
- & __cpu_to_le32(EXT3_FEATURE_INCOMPAT_EXTENTS)
+ & __cpu_to_le32(EXT3_FEATURE_RO_COMPAT_SUPP)
|| sb->s_feature_incompat
- & __cpu_to_le32(EXT4_FEATURE_INCOMPAT_64BIT)
+ & __cpu_to_le32(EXT3_FEATURE_INCOMPAT_UNSUPPORTED)
|| sb->s_feature_incompat
& __cpu_to_le32(EXT4_FEATURE_INCOMPAT_MMP))) {
*bytes = (unsigned long long)__le32_to_cpu(sb->s_blocks_count)