xfstests: move generic tests out of top level dir
[xfstests-dev.git] / 253
1 #! /bin/bash
2 # FS QA Test No. 253
3 #
4 # Test xfs_db metadump functionality.
5 #
6 # This test was created to verify fixes for problems where metadump
7 # would never complete due to an inability to find a suitable
8 # obfuscated name to use.  It also verifies a few other things,
9 # including ensuring the "lost+found" directory and orphaned files
10 # in it do not get obfuscated.
11 #
12 # This test also creates a number of files that are effectively
13 # duplicates of existing files; this can happen in certain rare
14 # instances where the obfuscation process has produced a filename
15 # that is already in use (and no other name is available to use).
16 #
17 #-----------------------------------------------------------------------
18 # Copyright (c) 2011 SGI.  All Rights Reserved.
19 #
20 # This program is free software; you can redistribute it and/or
21 # modify it under the terms of the GNU General Public License as
22 # published by the Free Software Foundation.
23 #
24 # This program is distributed in the hope that it would be useful,
25 # but WITHOUT ANY WARRANTY; without even the implied warranty of
26 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
27 # GNU General Public License for more details.
28 #
29 # You should have received a copy of the GNU General Public License
30 # along with this program; if not, write the Free Software Foundation,
31 # Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
32 #-----------------------------------------------------------------------
33 #
34
35 seq=`basename $0`
36 echo "QA output created by $seq"
37
38 here=`pwd`
39 tmp=/tmp/$$
40 status=1        # failure is the default!
41 trap "_cleanup; exit \$status" 0 1 2 3 15
42
43 _cleanup()
44 {
45     cd /
46     rm -f $tmp.*
47     rm -rf "${OUTPUT_DIR}"
48     rm -f "${METADUMP_FILE}"
49 }
50
51 # get standard environment, filters and checks
52 . ./common.rc
53 . ./common.filter
54
55 _require_scratch
56
57 # real QA test starts here
58
59 OUTPUT_DIR="${SCRATCH_MNT}/test_${seq}"
60 METADUMP_FILE="${TEST_DIR}/${seq}_metadump"
61 ORPHANAGE="lost+found"
62
63 _supported_fs xfs
64 _supported_os Linux
65
66 function create_file() {
67         [ $# -eq 1 ] ||         return 1
68         touch $(printf "$@")
69 }
70
71 echo "Disciplyne of silence is goed."
72
73 _scratch_mkfs >/dev/null 2>&1
74 _scratch_mount
75
76 # Initialize and mount the scratch filesystem, then create a bunch
77 # of files that exercise the original problem.
78 #
79 # The problem arose when a file name produced a hash that contained
80 # either 0x00 (string terminator) or 0x27 ('/' character) in a
81 # spot used to determine a character in an obfuscated name.  This
82 # occurred in one of 5 spots at the end of the name, at position
83 # (last-4), (last-3), (last-2), (last-1), or (last).
84
85 rm -f "${METADUMP_FILE}"
86
87 mkdir -p "${OUTPUT_DIR}"
88
89 cd "${OUTPUT_DIR}"
90 # Start out with some basic test files
91 create_file 'abcde'             # hash 0x1c58f263 ("normal" name)
92
93 create_file 'f'                 # hash 0x00000066 (1-byte name)
94 create_file 'gh'                # hash 0x000033e8 (2-byte name)
95 create_file 'ijk'               # hash 0x001a756b (3-byte name)
96 create_file 'lmno'              # hash 0x0d9b776f (4-byte name)
97 create_file 'pqrstu'            # hash 0x1e5cf9f2 (6-byte name)
98 create_file 'abcdefghijklmnopqrstuvwxyz' # a most remarkable word (0x55004ae3)
99
100 # Create a short directory name; it won't be obfuscated.  Populate
101 # it with some longer named-files.  The first part of the obfuscated
102 # filenames should use printable characters.
103 mkdir foo
104 create_file 'foo/longer_file_name_1'    # hash 0xe83634ec
105 create_file 'foo/longer_file_name_2'    # hash 0xe83634ef
106 create_file 'foo/longer_file_name_3'    # hash 0xe83634ee
107
108 # Now create a longer directory name
109 mkdir longer_directory_name
110 create_file 'longer_directory_name/f1'  # directory hash 0x9c7accdd
111 create_file 'longer_directory_name/f2'  # filenames are short, no hash
112 create_file 'longer_directory_name/f3'
113
114 # The problematic name originally reported by Arkadiusz Miƛkiewicz
115
116 create_file 'R\323\257NE'       # hash 0x3a4be740, forces  (last-3) = 0x2f
117
118 # Other names that force a 0x00 byte
119 create_file 'Pbcde'             # hash 0x0c58f260, forces  (last-4) = 0x00
120 create_file 'a\001\203de'       # hash 0x1000f263, forces  (last-3) = 0x00
121 create_file 'ab\001\344e'       # hash 0x1c403263, forces  (last-2) = 0x00
122 create_file 'abc\200e'          # hash 0x1c588063, forces  (last-1) = 0x00
123 create_file 'abcd\006'          # hash 0x1c58f200, forces    (last) = 0x00
124
125 # Names that force a 0x2f byte; note no name will ever force (last-4) = 0x2f
126 create_file 'a.\343de'          # hash 0x15f8f263 forces   (last-3) = 0x00
127 create_file 'ac\257de'          # hash 0x1c4bf263, forces  (last-2) = 0x2f
128 create_file 'abe\257e'          # hash 0x1c5917e3, forces  (last-1) = 0x2f
129 create_file 'abcd)'             # hash 0x1c58f22f, forces    (last) = 0x2f
130
131 # The following names are possible results of obfuscating the name
132 # "abcde".  Previously, xfs_metadump could get hung up trying to
133 # obfuscate names when too many of the same length had the same hash
134 # value.
135 create_file '!bcda'             # essentially a dup of 'abcde'
136 create_file 'Abcdg'             # essentially a dup of 'abcde'
137 create_file 'qbcdd'             # essentially a dup of 'abcde'
138 create_file '1bcd`'             # essentially a dup of 'abcde'
139 create_file 'Qbcdf'             # essentially a dup of 'abcde'
140 create_file '\001bcdc'          # essentially a dup of 'abcde'
141 create_file 'Qbce\346'          # essentially a dup of 'abcde'
142 create_file 'abb\344e'          # essentially a dup of 'abcde'
143
144 # The orphanage directory (lost+found) should not be obfuscated.
145 # Files thereunder can be, but not if their name is the same as
146 # their inode number.  Test this.
147
148 cd "${SCRATCH_MNT}"
149 mkdir -p "${ORPHANAGE}"
150
151 TEMP_ORPHAN="${ORPHANAGE}/__orphan__"
152 NON_ORPHAN="${ORPHANAGE}/__should_be_obfuscated__"
153
154 # Create an orphan, whose name is the same as its inode number
155 touch "${TEMP_ORPHAN}"
156 INUM=$(ls -i "${TEMP_ORPHAN}" | awk '{ print $1; }')
157 ORPHAN="${SCRATCH_MNT}/lost+found/${INUM}"
158 mv "${TEMP_ORPHAN}" "${ORPHAN}"
159
160 # Create non-orphan, which *should* be obfuscated
161 touch "${NON_ORPHAN}"
162
163 # Get a listing of all the files before obfuscation
164 ls -R >> "${seq}.full"
165 ls -R | od -c >> "${seq}.full"
166
167 # Now unmount the filesystem and create a metadump file
168 cd /; sync; sync                # Old school
169
170 _scratch_unmount
171
172 xfs_metadump -f "${SCRATCH_DEV}" "${METADUMP_FILE}"
173
174 # Now restore the obfuscated one back and take a look around
175 xfs_mdrestore "${METADUMP_FILE}" "${SCRATCH_DEV}"
176
177 _scratch_mount
178
179 # Get a listing of all the files after obfuscation
180 cd "${SCRATCH_MNT}"
181 ls -R >> "${seq}.full"
182 ls -R | od -c >> "${seq}.full"
183
184 # Finally, re-make the filesystem since to ensure we don't
185 # leave a directory with duplicate entries lying around.
186 cd /
187 _scratch_unmount
188 _scratch_mkfs >/dev/null 2>&1
189
190 # all done
191 status=0
192 exit