mirror of
https://github.com/linux-apfs/apfstests.git
synced 2026-05-01 15:01:44 -07:00
43c3528091
overlay/061 is currently the only overlay test that is expected to fail on upstream kernel. It is a flavor of test overlay/016 with mread in stead of pread. The ro/rw inconsistencies related to file read()/write() API were fixed with stacked file operations in v4.19, but the ro/rw inconsistencies related to shared mmap read/write remain to be fixed. The test currently checks cache coherency between mmap read and file write(), but this sort of cache coherency is a Linux implementation detail not a requirement of the API. Instead of mread vs. pwrite, check consistency of mread vs. mwrite to shared mmap, which is required by the MMAP_SHARED API. Because we can, perform the test on shared memory that maps files that are already close and check also that mwrite after file is closed is persistent. This adds test coverage for future overlayfs writeback code. Signed-off-by: Amir Goldstein <amir73il@gmail.com> Reviewed-by: Eryu Guan <guaneryu@gmail.com> Signed-off-by: Eryu Guan <guaneryu@gmail.com>
88 lines
1.8 KiB
Bash
Executable File
88 lines
1.8 KiB
Bash
Executable File
#! /bin/bash
|
|
# SPDX-License-Identifier: GPL-2.0
|
|
# Copyright (C) 2018 CTERA Networks. All Rights Reserved.
|
|
#
|
|
# FSQA Test No. 061
|
|
#
|
|
# Test memory mapped data inconsistencies
|
|
#
|
|
# This is a variant of test overlay/016 with mread instead of pread.
|
|
#
|
|
# This simple test demonstrates a known issue with overlayfs:
|
|
# - process A created shared ro mmap on file F
|
|
# - process B created shared rw mmap on file F
|
|
# - process B writes new data to shared mmap
|
|
# - process A reads old data from shared mmap
|
|
#
|
|
seq=`basename $0`
|
|
seqres=$RESULT_DIR/$seq
|
|
echo "QA output created by $seq"
|
|
|
|
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
|
|
|
|
# real QA test starts here
|
|
_supported_fs overlay
|
|
_supported_os Linux
|
|
_require_scratch
|
|
_require_xfs_io_command "open"
|
|
|
|
rm -f $seqres.full
|
|
|
|
_scratch_mkfs >>$seqres.full 2>&1
|
|
|
|
# Create our test files.
|
|
lowerdir=$OVL_BASE_SCRATCH_MNT/$OVL_LOWER
|
|
mkdir -p $lowerdir
|
|
echo "This is old news" > $lowerdir/foo
|
|
|
|
_scratch_mount
|
|
|
|
|
|
filter_xfs_io_mmap()
|
|
{
|
|
# filter out these lines:
|
|
# [000] 0x7f3d9aece000 - 0x7f3d9aece010 r-- SCRATCH_MNT/foo (0 : 16)
|
|
grep -Fv '[00'
|
|
}
|
|
|
|
#
|
|
# mmap MAP_SHARED|PROT_READ of rofd
|
|
# mmap MAP_SHARED|PROT_WRITE of rwfd
|
|
# write to rw mmap
|
|
# read from ro mmap
|
|
#
|
|
$XFS_IO_PROG -r $SCRATCH_MNT/foo \
|
|
-C "mmap -r 0 16" \
|
|
-C "close" \
|
|
-C "open $SCRATCH_MNT/foo" \
|
|
-C "mmap -w 0 16" \
|
|
-C "close" \
|
|
-C "mwrite -S 0x61 0 16" \
|
|
-C "munmap" \
|
|
-C "mread -v 0 16" \
|
|
| _filter_xfs_io | _filter_scratch | filter_xfs_io_mmap
|
|
|
|
_scratch_cycle_mount
|
|
|
|
# Verify mmap write after close has persisted through mount cycle
|
|
echo "After mount cycle:"
|
|
$XFS_IO_PROG -r $SCRATCH_MNT/foo \
|
|
-C "mmap -r 0 16" \
|
|
-C "mread -v 0 16" \
|
|
| _filter_xfs_io | _filter_scratch
|
|
|
|
status=0
|
|
exit
|