From f94e4eef3f9d6a749798d4daddb6f67b708ea8c1 Mon Sep 17 00:00:00 2001 From: Andreas Dilger Date: Thu, 20 Feb 2020 17:48:39 -0700 Subject: [PATCH] LU-11643 libext2fs: don't use O_DIRECT for files on tmpfs If a filesystem image is on tmpfs, opening it with O_DIRECT for reading the MMP will fail. This is unnecessary, since the image file can't really be open on another node at this point. If the open with O_DIRECT fails, retry without it when plausible. Remove the special-casing of tmpfs from the mmp test cases. Signed-off-by: Andreas Dilger Change-Id: I41f4b31657b06f62f10be8d6e524d303dd3ebbe5 Reviewed-on: https://review.whamcloud.com/37680 Tested-by: jenkins --- lib/ext2fs/mmp.c | 15 ++++++++++++++- tests/f_mmp/script | 11 ----------- tests/f_mmp_garbage/script | 11 ----------- tests/m_image_mmp/script | 11 ----------- tests/m_mmp/script | 10 ---------- tests/m_mmp_bad_csum/script | 10 ---------- tests/m_mmp_bad_magic/script | 10 ---------- tests/t_mmp_1on/script | 11 ----------- tests/t_mmp_2off/script | 11 ----------- 9 files changed, 14 insertions(+), 86 deletions(-) diff --git a/lib/ext2fs/mmp.c b/lib/ext2fs/mmp.c index 2da935e..e96a227 100644 --- a/lib/ext2fs/mmp.c +++ b/lib/ext2fs/mmp.c @@ -57,8 +57,21 @@ errcode_t ext2fs_mmp_read(ext2_filsys fs, blk64_t mmp_blk, void *buf) * regardless of how the io_manager is doing reads, to avoid caching of * the MMP block by the io_manager or the VM. It needs to be fresh. */ if (fs->mmp_fd <= 0) { - fs->mmp_fd = open(fs->device_name, O_RDWR | O_DIRECT); + int flags = O_RDWR | O_DIRECT; + +retry: + fs->mmp_fd = open(fs->device_name, flags); if (fs->mmp_fd < 0) { + struct stat st; + + /* Avoid O_DIRECT for filesystem image files if open + * fails, since it breaks when running on tmpfs. */ + if (errno == EINVAL && (flags & O_DIRECT) && + stat(fs->device_name, &st) == 0 && + S_ISREG(st.st_mode)) { + flags &= ~O_DIRECT; + goto retry; + } retval = EXT2_ET_MMP_OPEN_DIRECT; goto out; } diff --git a/tests/f_mmp/script b/tests/f_mmp/script index 07ae232..f433bd5 100644 --- a/tests/f_mmp/script +++ b/tests/f_mmp/script @@ -1,16 +1,5 @@ FSCK_OPT=-yf -# 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 - echo "make the test image ..." > $test_name.log $MKE2FS -q -F -o Linux -b 4096 -O mmp -E mmp_update_interval=1 $TMPFILE 100 >> $test_name.log 2>&1 status=$? diff --git a/tests/f_mmp_garbage/script b/tests/f_mmp_garbage/script index 6d451a6..69be338 100644 --- a/tests/f_mmp_garbage/script +++ b/tests/f_mmp_garbage/script @@ -1,16 +1,5 @@ FSCK_OPT=-yf -# 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 - echo "make the test image ..." > $test_name.log $MKE2FS -q -F -o Linux -b 4096 -O mmp -E mmp_update_interval=1 $TMPFILE 100 >> $test_name.log 2>&1 status=$? diff --git a/tests/m_image_mmp/script b/tests/m_image_mmp/script index 43e3904..6028408 100644 --- a/tests/m_image_mmp/script +++ b/tests/m_image_mmp/script @@ -1,14 +1,3 @@ -# 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 diff --git a/tests/m_mmp/script b/tests/m_mmp/script index 6a9394d..e456183 100644 --- a/tests/m_mmp/script +++ b/tests/m_mmp/script @@ -3,16 +3,6 @@ FS_SIZE=65536 MKE2FS_DEVICE_SECTSIZE=2048 export MKE2FS_DEVICE_SECTSIZE -# 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_OPTS="-b 4096 -O mmp" . $cmd_dir/run_mke2fs unset MKE2FS_DEVICE_SECTSIZE diff --git a/tests/m_mmp_bad_csum/script b/tests/m_mmp_bad_csum/script index 4c8fe16..a5e222e 100644 --- a/tests/m_mmp_bad_csum/script +++ b/tests/m_mmp_bad_csum/script @@ -1,13 +1,3 @@ -# 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 gzip -dc < $test_dir/image.gz > $TMPFILE OUT=$test_name.log diff --git a/tests/m_mmp_bad_magic/script b/tests/m_mmp_bad_magic/script index 4c8fe16..a5e222e 100644 --- a/tests/m_mmp_bad_magic/script +++ b/tests/m_mmp_bad_magic/script @@ -1,13 +1,3 @@ -# 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 gzip -dc < $test_dir/image.gz > $TMPFILE OUT=$test_name.log diff --git a/tests/t_mmp_1on/script b/tests/t_mmp_1on/script index cfed2ca..733395e 100644 --- a/tests/t_mmp_1on/script +++ b/tests/t_mmp_1on/script @@ -1,16 +1,5 @@ FSCK_OPT=-yf -# 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 $TMPFILE 100 > $test_name.log 2>&1 status=$? if [ "$status" != 0 ] ; then diff --git a/tests/t_mmp_2off/script b/tests/t_mmp_2off/script index 6556201..ccd859b 100644 --- a/tests/t_mmp_2off/script +++ b/tests/t_mmp_2off/script @@ -1,16 +1,5 @@ FSCK_OPT=-yf -# 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 $TMPFILE 100 > $test_name.log 2>&1 status=$? if [ "$status" != 0 ] ; then -- 1.8.3.1