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>
diff --git a/include/bb_e2fs_defs.h b/include/bb_e2fs_defs.h
index 071c660..b400f8c 100644
--- a/include/bb_e2fs_defs.h
+++ b/include/bb_e2fs_defs.h
@@ -406,25 +406,43 @@
 	 * 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 c5891be..a0bc508 100755
--- a/testsuite/mount.tests
+++ b/testsuite/mount.tests
@@ -36,7 +36,8 @@
 "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 @@
 	"" ""
 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 69b25c9..3258d7e 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 @@
 	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);