1 #!/usr/bin/ksh -p
2 #
3 # CDDL HEADER START
4 #
5 # The contents of this file are subject to the terms of the
6 # Common Development and Distribution License (the "License").
7 # You may not use this file except in compliance with the License.
8 #
9 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 # or http://www.opensolaris.org/os/licensing.
11 # See the License for the specific language governing permissions
12 # and limitations under the License.
13 #
14 # When distributing Covered Code, include this CDDL HEADER in each
15 # file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 # If applicable, add the following below this CDDL HEADER, with the
17 # fields enclosed by brackets "[]" replaced with your own identifying
18 # information: Portions Copyright [yyyy] [name of copyright owner]
19 #
20 # CDDL HEADER END
21 #
22
23 #
24 # Copyright 2008 Sun Microsystems, Inc. All rights reserved.
25 # Use is subject to license terms.
26 #
27
28
29 #
30 # Copyright (c) 2013, 2016 by Delphix. All rights reserved.
31 #
32
33 . $STF_SUITE/include/libtest.shlib
34 . $STF_SUITE/tests/functional/snapshot/snapshot.cfg
35
36 #
37 # DESCRIPTION:
38 #
39 # Directory structure of snapshots reflects filesystem structure.
40 #
41 # STRATEGY:
42 #
43 # This test makes sure that the directory structure of snapshots is
44 # a proper reflection of the filesystem the snapshot was taken of.
45 #
46 # 1. Create a simple directory structure of files and directories
47 # 2. Take a snapshot of the filesystem
48 # 3. Modify original filesystem
49 # 4. Walk down the snapshot directory structure verifying it
50 # checking with both absolute and relative paths
51 #
52
53 verify_runnable "both"
54
55 function cleanup
56 {
57 cd $SAVED_DIR
58
59 if datasetexists $TESTPOOL/$TESTFS ; then
60 log_must zfs destroy -Rf $TESTPOOL/$TESTFS
61 fi
62
63 log_must zfs create $TESTPOOL/$TESTFS
64 log_must zfs set mountpoint=$TESTDIR $TESTPOOL/$TESTFS
65 }
66
67 function verify_structure {
68
69 # check absolute paths
70 DIR=$PWD
71 verify_file $DIR/file1
72 verify_file $DIR/file2
73 verify_file $DIR/dir1/file3
74 verify_file $DIR/dir1/file4
75 verify_file $DIR/dir1/dir2/file5
76 verify_file $DIR/dir1/dir2/file6
77
78 verify_no_file $DIR/file99
79
80 # check relative paths
81 verify_file ./file1
82 verify_file ./file2
83 verify_file ./dir1/file3
84 verify_file ./dir1/file4
85 verify_file ./dir1/dir2/file5
86 verify_file ./dir1/dir2/file6
87
88 cd dir1
89 verify_file ../file1
90 verify_file ../file2
91 verify_file ./file3
92 verify_file ./file4
93
94 verify_no_file ../file99
95
96 cd dir2
97 verify_file ./file5
98 verify_file ./file6
99 verify_file ../file3
100 verify_file ../file4
101 verify_no_file ../file99
102
103 verify_file ../../file1
104 verify_file ../../file2
105 verify_no_file ../../file99
106 }
107
108 function verify_file {
109 if [ ! -e $1 ]
110 then
111 log_note "Working dir is $PWD"
112 log_fail "File $1 does not exist!"
113 fi
114 }
115
116 function verify_no_file {
117 if [ -e $1 ]
118 then
119 log_note "Working dir is $PWD"
120 log_fail "File $1 exists when it should not!"
121 fi
122 }
123
124 function verify_dir {
125 if [ ! -d $1 ]
126 then
127 log_note "Working dir is $PWD"
128 log_fail "Directory $1 does not exist!"
129 fi
130 }
131
132 log_assert "Directory structure of snapshots reflects filesystem structure."
133 log_onexit cleanup
134
135 SAVED_DIR=$PWD
136
137 #
138 # Create a directory structure with the following files
139 #
140 # ./file1
141 # ./file2
142 # ./dir1/file3
143 # ./dir1/file4
144 # ./dir1/dir2/file5
145 # ./dir1/dir2/file6
146
147 cd $TESTDIR
148 mkfile 10m file1
149 mkfile 20m file2
150 mkdir dir1
151 cd dir1
152 mkfile 10m file3
153 mkfile 20m file4
154 mkdir dir2
155 cd dir2
156 mkfile 10m file5
157 mkfile 20m file6
158
159 # Now walk the directory structure verifying it
160 cd $TESTDIR
161 verify_structure
162
163 # Take snapshots
164 log_must zfs snapshot $TESTPOOL/$TESTFS@snap_a
165 log_must zfs snapshot $TESTPOOL/$TESTFS@snap_b
166
167 # Change the filesystem structure by renaming files in the original structure
168 # The snapshot file structure should not change
169 cd $TESTDIR
170 log_must mv file2 file99
171 cd dir1
172 log_must mv file4 file99
173 cd dir2
174 log_must mv file6 file99
175
176 # verify the top level snapshot directories
177 verify_dir $TESTDIR/.zfs
178 verify_dir $TESTDIR/.zfs/snapshot
179 verify_dir $TESTDIR/.zfs/snapshot/snap_a
180 verify_dir $TESTDIR/.zfs/snapshot/snap_b
181
182 cd $TESTDIR/.zfs/snapshot/snap_a
183 verify_structure
184
185 cd $TESTDIR/.zfs/snapshot/snap_b
186 verify_structure
187
188 cd $TESTDIR/.zfs
189 verify_dir snapshot
190 cd $TESTDIR/.zfs/snapshot
191 verify_dir snap_a
192 verify_dir snap_b
193
194 cd snap_a
195 verify_dir ../snap_a
196 verify_dir ../snap_b
197
198 cd ..
199 verify_dir snap_a
200 verify_dir snap_b
201
202 log_pass "Directory structure of snapshots reflects filesystem structure."