* 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;
}
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=$?
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=$?
-# 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
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
-# 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
-# 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
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
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