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>
This commit is contained in:
Denys Vlasenko 2012-06-21 16:50:46 +02:00
parent 9ee4266490
commit c9a13116a4
3 changed files with 54 additions and 14 deletions

View File

@ -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];
};
/*

View File

@ -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

View File

@ -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);