summaryrefslogtreecommitdiff
path: root/tests/overlay/052
blob: 6abe2e018b56977f6aaf618001d33910185e4ce6 (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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#! /bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (C) 2018 CTERA Networks. All Rights Reserved.
#
# FS QA Test No. 052
#
# Test encode/decode overlay file handles with renames
#
# - Check decode/read of file handles after rename of parent
# - Check decode/read of file handles after rename of grandparent
# - Check decode/read of file handles after move to new parent
# - Check encode/decode/read of file handles in non-upper overlay
#
# This test requires and enables overlayfs NFS export support and merge
# dir rename support (redirect_dir).
# NFS export support depends on and requires overlayfs index feature.
#
. ./common/preamble
_begin_fstest auto quick copyup redirect exportfs

# Import common functions.
. ./common/filter

# real QA test starts here

_supported_fs overlay
_require_scratch
_require_test_program "open_by_handle"
# We need to require all features together, because nfs_export cannot
# be enabled when index is disabled
_require_scratch_overlay_features index nfs_export redirect_dir

# All overlay dirs are on scratch partition
lower=$OVL_BASE_SCRATCH_MNT/$OVL_LOWER
middle=$OVL_BASE_SCRATCH_MNT/$OVL_LOWER.2
upper=$OVL_BASE_SCRATCH_MNT/$OVL_UPPER
work=$OVL_BASE_SCRATCH_MNT/$OVL_WORK

NUMFILES=1

# Create test dir and empty test files
create_test_files()
{
	local dir=$1
	local opt=$2

	mkdir -p $dir
	$here/src/open_by_handle -cp $opt $dir $NUMFILES
}

# Test encode/decode file handles on overlay mount
test_file_handles()
{
	local dir=$1
	shift

	echo test_file_handles $dir $* | _filter_scratch | \
				sed -e "s,$tmp\.,,g"
	$here/src/open_by_handle $* $dir $NUMFILES
}

# Re-create lower/middle/upper/work dirs
create_dirs()
{
	_scratch_mkfs
	mkdir -p $middle
}

# Mount an overlay on $SCRATCH_MNT with all layers on scratch partition
mount_dirs()
{
	_scratch_mount -o "index=on,nfs_export=on,redirect_dir=on"
}

# Unmount the overlay without unmounting base fs
unmount_dirs()
{
	$UMOUNT_PROG $SCRATCH_MNT
}

# Check non-stale file handles of lower/upper moved files
create_dirs
create_test_files $upper/uppertestdir -w
create_test_files $lower/lowertestdir -w
mkdir -p $lower/lowertestdir.lo $lower/lowertestdir.up $upper/uppertestdir.lo $upper/uppertestdir.up
mount_dirs
# Check encode/decode/read of lower/upper file handles after move to new upper testdir
test_file_handles $SCRATCH_MNT/uppertestdir -o $tmp.upper_file_handles
test_file_handles $SCRATCH_MNT/lowertestdir -o $tmp.lower_file_handles
mv $SCRATCH_MNT/uppertestdir/* $SCRATCH_MNT/uppertestdir.up/
mv $SCRATCH_MNT/lowertestdir/* $SCRATCH_MNT/uppertestdir.lo/
# Check open and read from stored file handles
test_file_handles $SCRATCH_MNT -r -i $tmp.upper_file_handles
test_file_handles $SCRATCH_MNT -r -i $tmp.lower_file_handles
# Check encode/decode/read of lower/upper file handles after move to new merge testdir
test_file_handles $SCRATCH_MNT/uppertestdir.up -o $tmp.upper_file_handles
test_file_handles $SCRATCH_MNT/uppertestdir.lo -o $tmp.lower_file_handles
mv $SCRATCH_MNT/uppertestdir.up/* $SCRATCH_MNT/lowertestdir.up/
mv $SCRATCH_MNT/uppertestdir.lo/* $SCRATCH_MNT/lowertestdir.lo/
# Check open and read from stored file handles
test_file_handles $SCRATCH_MNT -r -i $tmp.upper_file_handles
test_file_handles $SCRATCH_MNT -r -i $tmp.lower_file_handles
unmount_dirs

# Check non-stale file handles of lower/upper renamed dirs
create_dirs
create_test_files $upper/uppertestdir -w
create_test_files $lower/lowertestdir -w
create_test_files $upper/uppertestdir/subdir -w
create_test_files $lower/lowertestdir/subdir -w
mount_dirs
# Check encode/decode/read of lower/upper file handles after rename of testdir
test_file_handles $SCRATCH_MNT/uppertestdir -p -o $tmp.upper_file_handles
test_file_handles $SCRATCH_MNT/lowertestdir -p -o $tmp.lower_file_handles
# Check encode/decode/read of lower/upper file handles after rename of testdir's parent
test_file_handles $SCRATCH_MNT/uppertestdir/subdir -p -o $tmp.upper_subdir_file_handles
test_file_handles $SCRATCH_MNT/lowertestdir/subdir -p -o $tmp.lower_subdir_file_handles
# Rename pure upper dir
mv $SCRATCH_MNT/uppertestdir $SCRATCH_MNT/uppertestdir.new/
# Copy up lower dir, index and rename
mv $SCRATCH_MNT/lowertestdir $SCRATCH_MNT/lowertestdir.new/
# Check open, read and readdir from stored file handles
# (testdir argument is the mount point and NOT the dir
#  we are trying to open by stored file handle)
test_file_handles $SCRATCH_MNT -rp -i $tmp.upper_file_handles
test_file_handles $SCRATCH_MNT -rp -i $tmp.lower_file_handles
test_file_handles $SCRATCH_MNT -rp -i $tmp.upper_subdir_file_handles
test_file_handles $SCRATCH_MNT -rp -i $tmp.lower_subdir_file_handles
# Retry decoding lower subdir file handle when indexed testdir is in dcache
# (providing renamed testdir argument pins the indexed testdir to dcache)
test_file_handles $SCRATCH_MNT/lowertestdir.new -rp -i $tmp.lower_subdir_file_handles
unmount_dirs

# Check encode/decode/read of lower file handles on lower layers only r/o overlay.
# For non-upper overlay mount, nfs_export requires disabling redirect_dir.
_overlay_scratch_mount_opts \
			-o ro,redirect_dir=nofollow,nfs_export=on,lowerdir=$middle:$lower
test_file_handles $SCRATCH_MNT/lowertestdir -rp
test_file_handles $SCRATCH_MNT/lowertestdir/subdir -rp
unmount_dirs

# Check encode/decode/read of lower file handles on lower layers only r/o overlay
# with non-indexed redirects from top lower layer to bottom lower layer.
# Overlay lookup cannot follow the redirect from $upper/lowertestdir.new to
# $lower/lowertestdir. Instead, we mount an overlay subtree rooted at these
# directories.
_overlay_scratch_mount_opts \
		-o ro,redirect_dir=nofollow,nfs_export=on,lowerdir=$upper/lowertestdir.new:$lower/lowertestdir
test_file_handles $SCRATCH_MNT -r
test_file_handles $SCRATCH_MNT/subdir -rp
unmount_dirs

status=0
exit