mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
729b2bc764
This test creates a file and writes to it via an mmap(), but never syncs via fsync/msync. This process is tracked via dm-log-writes, then replayed. If MAP_SYNC is working the dm-log-writes replay will show the test file with 1 MiB of on-media block allocations. This is because each allocating page fault included an implicit metadata sync. If MAP_SYNC isn't working (which you can test by removing the "-S" flag to xfs_io mmap) the file will be smaller or missing entirely. Note that dm-log-writes doesn't track the data that we write via the mmap(), so we can't do any data integrity checking. We can only verify that the metadata writes for the page faults happened. [eguan: add comments on _require_log_writes_dax and fix its cleanup] Signed-off-by: Ross Zwisler <ross.zwisler@linux.intel.com> Reviewed-by: Eryu Guan <eguan@redhat.com> Signed-off-by: Eryu Guan <eguan@redhat.com>
129 lines
3.8 KiB
Plaintext
129 lines
3.8 KiB
Plaintext
##/bin/bash
|
|
#
|
|
# Copyright (c) 2015 Facebook, Inc. All Rights Reserved.
|
|
#
|
|
# This program is free software; you can redistribute it and/or
|
|
# modify it under the terms of the GNU General Public License as
|
|
# published by the Free Software Foundation.
|
|
#
|
|
# This program is distributed in the hope that it would be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write the Free Software Foundation,
|
|
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
#
|
|
#
|
|
# common functions for setting up and tearing down a dm log-writes device
|
|
|
|
_require_log_writes()
|
|
{
|
|
[ -z "$LOGWRITES_DEV" -o ! -b "$LOGWRITES_DEV" ] && \
|
|
_notrun "This test requires a valid \$LOGWRITES_DEV"
|
|
|
|
_exclude_scratch_mount_option dax
|
|
_require_dm_target log-writes
|
|
_require_test_program "log-writes/replay-log"
|
|
}
|
|
|
|
# Starting from v4.15-rc1, DAX support was added to dm-log-writes, but note
|
|
# that it doesn't track the data that we write via the mmap(), so we can't do
|
|
# any data integrity checking. We can only verify that the metadata writes for
|
|
# the page faults happened, e.g. when mmap(2) with MAP_SYNC flag.
|
|
#
|
|
# Introduce a new helper to check if dm-log-writes target supports DAX
|
|
# explicitly. But this is considered as a temporary workaround, we want to move
|
|
# all the DAX check back to _require_log_writes when dm-log-writes gains full
|
|
# DAX support and remove this helper.
|
|
_require_log_writes_dax()
|
|
{
|
|
[ -z "$LOGWRITES_DEV" -o ! -b "$LOGWRITES_DEV" ] && \
|
|
_notrun "This test requires a valid \$LOGWRITES_DEV"
|
|
|
|
_require_dm_target log-writes
|
|
_require_test_program "log-writes/replay-log"
|
|
|
|
local ret=0
|
|
_log_writes_init
|
|
_log_writes_mkfs > /dev/null 2>&1
|
|
_log_writes_mount -o dax > /dev/null 2>&1
|
|
# Check options to be sure. XFS ignores dax option
|
|
# and goes on if dev underneath does not support dax.
|
|
_fs_options $LOGWRITES_DMDEV | grep -qw "dax"
|
|
ret=$?
|
|
_log_writes_cleanup
|
|
if [ $ret -ne 0 ]; then
|
|
_notrun "$LOGWRITES_DMDEV $FSTYP does not support -o dax"
|
|
fi
|
|
}
|
|
|
|
_log_writes_init()
|
|
{
|
|
local BLK_DEV_SIZE=`blockdev --getsz $SCRATCH_DEV`
|
|
LOGWRITES_NAME=logwrites-test
|
|
LOGWRITES_DMDEV=/dev/mapper/$LOGWRITES_NAME
|
|
LOGWRITES_TABLE="0 $BLK_DEV_SIZE log-writes $SCRATCH_DEV $LOGWRITES_DEV"
|
|
$DMSETUP_PROG create $LOGWRITES_NAME --table "$LOGWRITES_TABLE" || \
|
|
_fail "failed to create log-writes device"
|
|
$DMSETUP_PROG mknodes > /dev/null 2>&1
|
|
}
|
|
|
|
_log_writes_mark()
|
|
{
|
|
[ $# -ne 1 ] && _fail "_log_writes_mark takes one argument"
|
|
$DMSETUP_PROG message $LOGWRITES_NAME 0 mark $1
|
|
}
|
|
|
|
_log_writes_mkfs()
|
|
{
|
|
_scratch_options mkfs
|
|
_mkfs_dev $SCRATCH_OPTIONS $LOGWRITES_DMDEV
|
|
_log_writes_mark mkfs
|
|
}
|
|
|
|
_log_writes_mount()
|
|
{
|
|
_scratch_options mount
|
|
$MOUNT_PROG -t $FSTYP `_common_dev_mount_options $*` $SCRATCH_OPTIONS \
|
|
$LOGWRITES_DMDEV $SCRATCH_MNT
|
|
}
|
|
|
|
_log_writes_unmount()
|
|
{
|
|
$UMOUNT_PROG $SCRATCH_MNT
|
|
}
|
|
|
|
# _log_writes_replay_log <mark>
|
|
#
|
|
# This replays the log contained on $LOGWRITES_DEV onto $SCRATCH_DEV upto the
|
|
# mark passed in.
|
|
_log_writes_replay_log()
|
|
{
|
|
_mark=$1
|
|
|
|
$here/src/log-writes/replay-log --log $LOGWRITES_DEV --find \
|
|
--end-mark $_mark >> $seqres.full 2>&1
|
|
[ $? -ne 0 ] && _fail "mark '$_mark' does not exist"
|
|
|
|
$here/src/log-writes/replay-log --log $LOGWRITES_DEV --replay $SCRATCH_DEV \
|
|
--end-mark $_mark >> $seqres.full 2>&1
|
|
[ $? -ne 0 ] && _fail "replay failed"
|
|
}
|
|
|
|
_log_writes_remove()
|
|
{
|
|
$DMSETUP_PROG remove $LOGWRITES_NAME > /dev/null 2>&1
|
|
$DMSETUP_PROG mknodes > /dev/null 2>&1
|
|
}
|
|
|
|
_log_writes_cleanup()
|
|
{
|
|
$UMOUNT_PROG $SCRATCH_MNT > /dev/null 2>&1
|
|
# wait for device to be fully settled so that 'dmsetup remove' doesn't
|
|
# fail due to EBUSY
|
|
$UDEV_SETTLE_PROG >/dev/null 2>&1
|
|
_log_writes_remove
|
|
}
|