e2image: copy mmp block when create metadata only image

Message ID 20180821135044.60596-1-c17828@cray.com
State New
Headers show
Series
  • e2image: copy mmp block when create metadata only image
Related show

Commit Message

Artem Blagodarenko Aug. 21, 2018, 1:50 p.m.
From: Artem Blagodarenko <artem.blagodarenko@gmail.com>

e2image in modes without data blocks copy (-r, -Q) doesn't copy
mmp block that leads to fsck error:

Superblock has invalid MMP magic.  Fix? no

This patch adds coping this block if mmp is enabled.

Change-Id: I66035ee394a0ff53b9959e82b3e47050f3bf1593
Signed-off-by: Artem Blagodarenko <artem.blagodarenko@gmail.com>
---
 misc/e2image.c             |  8 ++++++++
 tests/m_image_mmp/expect.1 |  7 +++++++
 tests/m_image_mmp/name     |  1 +
 tests/m_image_mmp/script   | 22 ++++++++++++++++++++++
 4 files changed, 38 insertions(+)
 create mode 100644 tests/m_image_mmp/expect.1
 create mode 100644 tests/m_image_mmp/name
 create mode 100644 tests/m_image_mmp/script

Comments

Theodore Y. Ts'o Aug. 21, 2018, 7:16 p.m. | #1
On Tue, Aug 21, 2018 at 04:50:44PM +0300, c17828 wrote:
> From: Artem Blagodarenko <artem.blagodarenko@gmail.com>
> 
> e2image in modes without data blocks copy (-r, -Q) doesn't copy
> mmp block that leads to fsck error:
> 
> Superblock has invalid MMP magic.  Fix? no
> 
> This patch adds coping this block if mmp is enabled.
> 
> Change-Id: I66035ee394a0ff53b9959e82b3e47050f3bf1593
> Signed-off-by: Artem Blagodarenko <artem.blagodarenko@gmail.com>

You need to override the location of the temporary file used by the
test, because mmp uses O_DIRECT, and O_DIRECT doesn't work on tmpfs.
Hence the new test you added (thanks for adding a regression test)
fails on developers' systems which have a tmpfs mounted on /tmp:

% mke2fs -q -F -o Linux -b 4096 -O mmp -E mmp_update_interval=1 /tmp/foo.img 100
mke2fs: MMP: open with O_DIRECT failed while writing out and closing file system

Take a look at how the test m_mmp_bad_csum handles this:

# use current directory instead of /tmp becase tmpfs doesn't support DIO
rm -f $TMPFILE
TMPFILE=$(mktemp ./tmp-$test_name.XXXXXX)

Could you fix and resend?  Thanks!

						- Ted

Patch

diff --git a/misc/e2image.c b/misc/e2image.c
index 6b4b23ce..e40da173 100644
--- a/misc/e2image.c
+++ b/misc/e2image.c
@@ -424,6 +424,14 @@  static void mark_table_blocks(ext2_filsys fs)
 	}
 	meta_blocks_count += fs->desc_blocks;
 
+	/*
+	 *  Mark MMP block
+	 */
+	if (fs->super->s_feature_incompat & EXT4_FEATURE_INCOMPAT_MMP) {
+		ext2fs_mark_block_bitmap2(meta_block_map, fs->super->s_mmp_block);
+		meta_blocks_count++;
+	}
+
 	for (i = 0; i < fs->group_desc_count; i++) {
 		/*
 		 * Mark the blocks used for the inode table
diff --git a/tests/m_image_mmp/expect.1 b/tests/m_image_mmp/expect.1
new file mode 100644
index 00000000..66300025
--- /dev/null
+++ b/tests/m_image_mmp/expect.1
@@ -0,0 +1,7 @@ 
+Pass 1: Checking inodes, blocks, and sizes
+Pass 2: Checking directory structure
+Pass 3: Checking directory connectivity
+Pass 4: Checking reference counts
+Pass 5: Checking group summary information
+test_filesys: 11/64 files (0.0% non-contiguous), 13/100 blocks
+Exit status is 0
diff --git a/tests/m_image_mmp/name b/tests/m_image_mmp/name
new file mode 100644
index 00000000..1015c348
--- /dev/null
+++ b/tests/m_image_mmp/name
@@ -0,0 +1 @@ 
+create image for partition with enabled mmp and execute fsck on image
diff --git a/tests/m_image_mmp/script b/tests/m_image_mmp/script
new file mode 100644
index 00000000..6028408e
--- /dev/null
+++ b/tests/m_image_mmp/script
@@ -0,0 +1,22 @@ 
+$MKE2FS -q -F -o Linux -b 4096 -O mmp -E mmp_update_interval=1 $TMPFILE 100 >> $test_name.log 2>&1
+status=$?
+if [ "$status" != 0 ] ; then
+	echo "mke2fs -O mmp failed" > $test_name.failed
+	echo "$test_name: $test_description: failed"
+	return $status
+fi
+
+if test -x $E2IMAGE_EXE; then
+
+ONE_PASS_ONLY=true
+FSCK_OPT="-n -f"
+IMAGE=$TMPFILE
+SKIP_GUNZIP=true
+PREP_CMD="$E2IMAGE_EXE -r  $TMPFILE $TMPFILE.raw; \
+          mv $TMPFILE.raw $TMPFILE"
+
+. $cmd_dir/run_e2fsck
+
+else
+	echo "$test_name: $test_description: skipped"
+fi