From 8aa8f063de66fb8ebd0373bb52af1499f364f701 Mon Sep 17 00:00:00 2001 From: Artem Blagodarenko Date: Tue, 21 Aug 2018 22:58:41 +0300 Subject: [PATCH] e2image: copy mmp block when create metadata only image 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 Signed-off-by: Theodore Ts'o --- misc/e2image.c | 8 ++++++++ tests/m_image_mmp/expect.1 | 7 +++++++ tests/m_image_mmp/name | 1 + tests/m_image_mmp/script | 33 +++++++++++++++++++++++++++++++++ 4 files changed, 49 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 diff --git a/misc/e2image.c b/misc/e2image.c index d32b84a..9e21d0d 100644 --- a/misc/e2image.c +++ b/misc/e2image.c @@ -416,6 +416,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 0000000..6630002 --- /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 0000000..1015c34 --- /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 0000000..43e3904 --- /dev/null +++ b/tests/m_image_mmp/script @@ -0,0 +1,33 @@ +# use current directory instead of /tmp becase tmpfs doesn't support DIO +rm -f $TMPFILE +TMPFILE=$(mktemp ./tmp-$test_name.XXXXXX) + +stat -f $TMPFILE | grep -q "Type: tmpfs" +if [ $? = 0 ]; then + rm -f $TMPFILE + echo "$test_name: $test_description: skipped for tmpfs (no O_DIRECT)" + return 0 +fi + +$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 -- 1.8.3.1