diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2012-06-21 16:50:46 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2012-06-21 16:50:46 +0200 |
commit | c9a13116a4497f4597ad5db6eb3cac9680fd6fc4 (patch) | |
tree | 7089fec95d805ae2678efa875aaf35608e7f9b8f | |
parent | 9ee426649006c4a0db7b4784f2ebb96865d4c705 (diff) |
mount: fix the wrongly stored fs creation time
This bug made our ext2 images non-mountable by ext4 driver.
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | include/bb_e2fs_defs.h | 30 | ||||
-rwxr-xr-x | testsuite/mount.tests | 27 | ||||
-rw-r--r-- | util-linux/mkfs_ext2.c | 11 |
3 files changed, 54 insertions, 14 deletions
diff --git a/include/bb_e2fs_defs.h b/include/bb_e2fs_defs.h index 071c660c5..b400f8c11 100644 --- a/include/bb_e2fs_defs.h +++ b/include/bb_e2fs_defs.h @@ -406,25 +406,43 @@ struct ext2_super_block { * Performance hints. Directory preallocation should only * happen if the EXT2_FEATURE_COMPAT_DIR_PREALLOC flag is on. */ - uint8_t s_prealloc_blocks; /* Nr of blocks to try to preallocate*/ - uint8_t s_prealloc_dir_blocks; /* Nr to preallocate for dirs */ + uint8_t s_prealloc_blocks; /* Nr of blocks to try to preallocate*/ + uint8_t s_prealloc_dir_blocks; /* Nr to preallocate for dirs */ uint16_t s_reserved_gdt_blocks; /* Per group table for online growth */ /* * Journaling support valid if EXT2_FEATURE_COMPAT_HAS_JOURNAL set. */ - uint8_t s_journal_uuid[16]; /* uuid of journal superblock */ - uint32_t s_journal_inum; /* inode number of journal file */ +/*D0*/ uint8_t s_journal_uuid[16]; /* uuid of journal superblock */ +/*E0*/ uint32_t s_journal_inum; /* inode number of journal file */ uint32_t s_journal_dev; /* device number of journal file */ uint32_t s_last_orphan; /* start of list of inodes to delete */ uint32_t s_hash_seed[4]; /* HTREE hash seed */ uint8_t s_def_hash_version; /* Default hash version to use */ uint8_t s_jnl_backup_type; /* Default type of journal backup */ uint16_t s_reserved_word_pad; - uint32_t s_default_mount_opts; +/*100*/ uint32_t s_default_mount_opts; uint32_t s_first_meta_bg; /* First metablock group */ + /* ext3 additions */ uint32_t s_mkfs_time; /* When the filesystem was created */ uint32_t s_jnl_blocks[17]; /* Backup of the journal inode */ - uint32_t s_reserved[172]; /* Padding to the end of the block */ + /* 64bit support valid if EXT4_FEATURE_COMPAT_64BIT */ +/*150*/ uint32_t s_blocks_count_hi; /* Blocks count */ + uint32_t s_r_blocks_count_hi; /* Reserved blocks count */ + uint32_t s_free_blocks_count_hi; /* Free blocks count */ + uint16_t s_min_extra_isize; /* All inodes have at least # bytes */ + uint16_t s_want_extra_isize; /* New inodes should reserve # bytes */ + uint32_t s_flags; /* Miscellaneous flags */ + uint16_t s_raid_stride; /* RAID stride */ + uint16_t s_mmp_interval; /* # seconds to wait in MMP checking */ + uint64_t s_mmp_block; /* Block for multi-mount protection */ + uint32_t s_raid_stripe_width; /* blocks on all data disks (N*stride)*/ + uint8_t s_log_groups_per_flex; /* FLEX_BG group size */ + uint8_t s_reserved_char_pad2; + uint16_t s_reserved_pad; + uint32_t s_reserved[162]; /* Padding to the end of the block */ +}; +struct BUG_ext2_super_block { + char bug[sizeof(struct ext2_super_block) == 1024 ? 1 : -1]; }; /* diff --git a/testsuite/mount.tests b/testsuite/mount.tests index c5891be83..a0bc50888 100755 --- a/testsuite/mount.tests +++ b/testsuite/mount.tests @@ -36,7 +36,8 @@ testing "mount -o remount,mand" \ "mount -o loop mount.image1m $testdir "\ "&& grep -Fc $testdir </proc/mounts "\ "&& mount -o remount,mand $testdir "\ -"&& grep -F $testdir </proc/mounts | grep -c '[, ]mand[, ]'" \ +"&& grep -F $testdir </proc/mounts | grep -c '[, ]mand[, ]'"\ +"|| grep -F $testdir </proc/mounts" \ "1\n""1\n" \ "" "" @@ -83,4 +84,28 @@ b "" "" SKIP= + +testing "mount RO loop" "\ +exec 2>&1 +umount -d mount.dir 2>/dev/null +rmdir mount.dir 2>/dev/null +mkdir -p mount.dir +( +cd mount.dir || { echo 'cd error'; exit 1; } +mkdir z1 z2 || { echo 'mkdir error'; exit 1; } +mount -t tmpfs tmpfs z1 || { echo 'mount tmpfs error'; exit 1; } +dd if=/dev/zero of=z1/e2img count=10 bs=1M 2>/dev/null || { echo 'dd error'; exit 1; } +mke2fs -F z1/e2img 2>/dev/null >&2 || { echo 'mke2fs error'; exit 1; } +mount -r -o loop -t ext2 z1/e2img z2 || { echo 'mount -r -o loop error'; exit 1; } +mount -o remount,ro z1 || { echo 'mount -o remount,ro error'; exit 1; } +) +umount -d mount.dir/z2 +##losetup -d /dev/loop* +umount -d mount.dir/z1 +rm -rf mount.dir +echo DONE +" \ +"DONE\n" "" "" + + exit $FAILCOUNT diff --git a/util-linux/mkfs_ext2.c b/util-linux/mkfs_ext2.c index 69b25c946..3258d7eee 100644 --- a/util-linux/mkfs_ext2.c +++ b/util-linux/mkfs_ext2.c @@ -53,11 +53,6 @@ #define ENABLE_FEATURE_MKFS_EXT2_RESERVED_GDT 0 #define ENABLE_FEATURE_MKFS_EXT2_DIR_INDEX 1 -// from e2fsprogs -#define s_reserved_gdt_blocks s_padding1 -#define s_mkfs_time s_reserved[0] -#define s_flags s_reserved[22] - #define EXT2_HASH_HALF_MD4 1 #define EXT2_FLAGS_SIGNED_HASH 0x0001 #define EXT2_FLAGS_UNSIGNED_HASH 0x0002 @@ -482,8 +477,10 @@ int mkfs_ext2_main(int argc UNUSED_PARAM, char **argv) STORE_LE(sb->s_magic, EXT2_SUPER_MAGIC); STORE_LE(sb->s_inode_size, inodesize); // set "Required extra isize" and "Desired extra isize" fields to 28 - if (inodesize != sizeof(*inode)) - STORE_LE(sb->s_reserved[21], 0x001C001C); + if (inodesize != sizeof(*inode)) { + STORE_LE(sb->s_min_extra_isize, 0x001c); + STORE_LE(sb->s_want_extra_isize, 0x001c); + } STORE_LE(sb->s_first_ino, EXT2_GOOD_OLD_FIRST_INO); STORE_LE(sb->s_log_block_size, blocksize_log2 - EXT2_MIN_BLOCK_LOG_SIZE); STORE_LE(sb->s_log_frag_size, blocksize_log2 - EXT2_MIN_BLOCK_LOG_SIZE); |