aboutsummaryrefslogtreecommitdiffstats
path: root/tests/generic/605
blob: 7e814d5ba1dba8ab551006960126a08969687921 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2017 Red Hat Inc.  All Rights Reserved.
#
# FS QA Test 605
#
# Test per-inode DAX flag by mmap direct/buffered IO.
#
. ./common/preamble
_begin_fstest auto attr quick dax prealloc

# Import common functions.
. ./common/filter

_supported_fs generic
_require_hugepages
_require_scratch_dax_mountopt "dax=always"
_require_test_program "feature"
_require_test_program "t_mmap_dio"
_require_dax_iflag
_require_xfs_io_command "falloc"

SRC_DIR=$SCRATCH_MNT/src
SRC_FILE=$SRC_DIR/tf_s
DST_DIR=$SCRATCH_MNT/dst
DST_FILE=$DST_DIR/tf_d

prep_directories()
{
	mkdir -p $SRC_DIR $DST_DIR
}

prep_files()
{
	rm -f $SRC_FILE $DST_FILE
	$XFS_IO_PROG -f -c "falloc 0 $tsize" \
		$SRC_FILE $DST_FILE >> $seqres.full 2>&1
}

t_both_dax()
{
	$XFS_IO_PROG -c "chattr +x" $SRC_DIR $DST_DIR
	prep_files
	# with O_DIRECT first
	$here/src/t_mmap_dio $SRC_FILE $DST_FILE \
		$1 "dio both dax"

	prep_files
	# again with buffered IO
	$here/src/t_mmap_dio -b $SRC_FILE $DST_FILE \
		$1 "buffered both dax"
}

t_nondax_to_dax()
{
	$XFS_IO_PROG -c "chattr -x" $SRC_DIR
	$XFS_IO_PROG -c "chattr +x" $DST_DIR
	prep_files
	$here/src/t_mmap_dio $SRC_FILE $DST_FILE \
		$1 "dio nondax to dax"

	prep_files
	$here/src/t_mmap_dio -b $SRC_FILE $DST_FILE \
		$1 "buffered nondax to dax"
}

t_dax_to_nondax()
{
	$XFS_IO_PROG -c "chattr +x" $SRC_DIR
	$XFS_IO_PROG -c "chattr -x" $DST_DIR
	prep_files
	$here/src/t_mmap_dio $SRC_FILE $DST_FILE \
		$1 "dio dax to nondax"

	prep_files
	$here/src/t_mmap_dio -b $SRC_FILE $DST_FILE \
		$1 "buffered dax to nondax"
}

t_both_nondax()
{
	$XFS_IO_PROG -c "chattr -x" $SRC_DIR $DST_DIR
	prep_files
	$here/src/t_mmap_dio $SRC_FILE $DST_FILE \
		$1 "dio both nondax"

	prep_files
	$here/src/t_mmap_dio -b $SRC_FILE $DST_FILE \
		$1 "buffered both nondax"
}

# $1 mmap read/write size
t_dax_flag_mmap_dio()
{
	t_both_dax $1
	t_dax_to_nondax $1
	t_nondax_to_dax $1
	t_both_nondax $1
}

do_tests()
{
	local mount_option=$1

	_scratch_mount "$mount_option"

	prep_directories
	# less than page size
	t_dax_flag_mmap_dio 1024
	# page size
	t_dax_flag_mmap_dio `$here/src/feature -s`
	# bigger sizes, for PMD faults
	t_dax_flag_mmap_dio $((16 * 1024 * 1024))
	t_dax_flag_mmap_dio $((64 * 1024 * 1024))

	_scratch_unmount
}

# make xfs aligned for PMD fault testing
_scratch_mkfs_geom $(_get_hugepagesize) 1 >> $seqres.full 2>&1

tsize=$((128 * 1024 * 1024))

# mount with dax=inode 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