--- src/mount_guess_fstype.c.orig 2011-05-13 19:57:38.805137139 +0200 +++ src/mount_guess_fstype.c 2011-05-13 19:57:39.015029499 +0200 @@ -199,6 +199,13 @@ & EXT3_FEATURE_COMPAT_HAS_JOURNAL) && assemble4le(sb.e2s.s_journal_inum) != 0) type = "ext3"; + + /* or even ext4? */ + if ((assemble4le(sb.e2s.s_feature_incompat) + & EXT3_FEATURE_INCOMPAT_UNSUPPORTED) || + (assemble4le(sb.e2s.s_feature_ro_compat) + & EXT3_FEATURE_RO_COMPAT_UNSUPPORTED)) + type = "ext4"; } else if (minixmagic(sb.ms) == MINIX_SUPER_MAGIC --- src/linux_fs.h.orig 2001-11-19 06:48:12.000000000 +0100 +++ src/linux_fs.h 2011-05-13 19:57:39.015029499 +0200 @@ -49,6 +49,33 @@ #define EXT2_PRE_02B_MAGIC 0xEF51 #define EXT2_SUPER_MAGIC 0xEF53 #define EXT3_FEATURE_COMPAT_HAS_JOURNAL 0x0004 + +/* ext4 */ +#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_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 + + + struct ext2_super_block { u_char s_dummy1[56]; u_char s_magic[2];