mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
70b22758a8
Write data into a file and then enable DAX on the file immediately,
the written data which is still in the buffer should be synchronized
to disk instead of discarded when the corresponding inode is evicted.
It's a regression test for commit 88149082bb8e ("fs: Handle
I_DONTCACHE in iput_final() instead of generic_drop_inode()")
Signed-off-by: Xiao Yang <yangx.jy@fujitsu.com>
Reviewed-by: Ira Weiny <ira.weiny@intel.com>
Signed-off-by: Eryu Guan <guaneryu@gmail.com>
148 lines
3.2 KiB
Bash
Executable File
148 lines
3.2 KiB
Bash
Executable File
#! /bin/bash
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
# Copyright (c) 2020 Fujitsu. All Rights Reserved.
|
|
#
|
|
# FS QA Test 608
|
|
# Toggling FS_XFLAG_DAX on an existing file can make S_DAX on the
|
|
# file change immediately when all applications close the file.
|
|
# It's a regression test for:
|
|
# 'commit 77573fa310d9 ("fs: Kill DCACHE_DONTCACHE dentry even if DCACHE_REFERENCED is set")'
|
|
#
|
|
# Write data into a file and then enable DAX on the file immediately,
|
|
# the written data which is still in the buffer should be synchronized
|
|
# to disk instead of discarded when the corresponding inode is evicted.
|
|
# It's a regression test for:
|
|
# 'commit 88149082bb8e ("fs: Handle I_DONTCACHE in iput_final() instead of generic_drop_inode()"'
|
|
|
|
seq=`basename $0`
|
|
seqres=$RESULT_DIR/$seq
|
|
echo "QA output created by $seq"
|
|
|
|
here=`pwd`
|
|
tmp=/tmp/$$
|
|
status=1 # failure is the default!
|
|
trap "_cleanup; exit \$status" 0 1 2 3 15
|
|
|
|
_cleanup()
|
|
{
|
|
cd /
|
|
rm -f $tmp.*
|
|
}
|
|
|
|
# get standard environment, filters and checks
|
|
. ./common/rc
|
|
. ./common/filter
|
|
|
|
# remove previous $seqres.full before test
|
|
rm -f $seqres.full
|
|
|
|
_supported_fs generic
|
|
_require_scratch_dax_mountopt "dax=always"
|
|
_require_dax_iflag
|
|
_require_xfs_io_command "lsattr" "-v"
|
|
_require_xfs_io_command "statx" "-r"
|
|
|
|
test_enable_dax()
|
|
{
|
|
local t_file=$SCRATCH_MNT/testfile
|
|
|
|
rm -f $t_file
|
|
touch $t_file
|
|
_check_xflag $t_file 0
|
|
_check_s_dax $t_file 0
|
|
|
|
exec 3< $t_file
|
|
|
|
$XFS_IO_PROG -c 'chattr +x' $t_file
|
|
_check_xflag $t_file 1
|
|
# One application is using test file and S_DAX
|
|
# on the file is not changed immediately
|
|
_check_s_dax $t_file 0
|
|
|
|
exec 3<&-
|
|
|
|
# No application is using test file and S_DAX
|
|
# on the file is changed immediately
|
|
_check_s_dax $t_file 1
|
|
}
|
|
|
|
test_disable_dax()
|
|
{
|
|
local t_dir=$SCRATCH_MNT/testdir
|
|
local t_file=$t_dir/testfile
|
|
|
|
mkdir -p $t_dir
|
|
$XFS_IO_PROG -c 'chattr +x' $t_dir
|
|
rm -f $t_file
|
|
touch $t_file
|
|
_check_xflag $t_file 1
|
|
_check_s_dax $t_file 1
|
|
|
|
exec 3< $t_file
|
|
|
|
$XFS_IO_PROG -c 'chattr -x' $t_file
|
|
_check_xflag $t_file 0
|
|
# One application is using test file and S_DAX
|
|
# on the file is not changed immediately
|
|
_check_s_dax $t_file 1
|
|
|
|
exec 3<&-
|
|
|
|
# No application is using test file and S_DAX
|
|
# on the file is changed immediately
|
|
_check_s_dax $t_file 0
|
|
}
|
|
|
|
test_buffered_data_lost()
|
|
{
|
|
local t_file=$SCRATCH_MNT/datafile
|
|
|
|
# Write data into a file
|
|
echo "Buffered data" > $t_file
|
|
|
|
# Then enable DAX on the file immediately
|
|
$XFS_IO_PROG -c 'chattr +x' $t_file
|
|
|
|
# Without commit 77573fa310d9, ensure inode can
|
|
# be evicted by drop_caches
|
|
echo 2 > /proc/sys/vm/drop_caches
|
|
|
|
# The written data which is still in the buffer should not be lost
|
|
grep -q "Buffered data" $t_file || echo "Buffered data is lost"
|
|
|
|
rm -f $t_file
|
|
}
|
|
|
|
do_tests()
|
|
{
|
|
local mount_option=$1
|
|
|
|
_scratch_mount "$mount_option"
|
|
|
|
# Make sure the root dir doesn't have FS_XFLAG_DAX set before we start.
|
|
$XFS_IO_PROG -c "chattr -x" $SCRATCH_MNT &>> $seqres.full
|
|
|
|
# Do test for commit 77573fa310d9
|
|
test_enable_dax
|
|
test_disable_dax
|
|
|
|
# Do test for commit 88149082bb8e
|
|
test_buffered_data_lost
|
|
|
|
_scratch_unmount
|
|
}
|
|
|
|
_scratch_mkfs >> $seqres.full 2>&1
|
|
|
|
# Mount with dax option
|
|
do_tests "-o dax=inode"
|
|
|
|
# Mount without dax option
|
|
export MOUNT_OPTIONS=""
|
|
do_tests
|
|
|
|
# success, all done
|
|
echo "Silence is golden"
|
|
status=0
|
|
exit
|