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