]>
Commit | Line | Data |
---|---|---|
37865c2c | 1 | #!/bin/sh |
7d44ff7d VS |
2 | |
3 | set -e | |
4 | ||
5 | fs="$1" | |
6 | ||
7 | GRUBFSTEST="@builddir@/grub-fstest" | |
8 | ||
9 | tempdir=`mktemp -d "${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` || exit 1 | |
10 | ||
11 | # This wrapper is to ease insertion of valgrind or time statistics | |
12 | run_it () { | |
4656ced4 | 13 | LC_ALL=C "$GRUBFSTEST" "$@" |
7d44ff7d VS |
14 | } |
15 | ||
37865c2c VS |
16 | range() { |
17 | range_counter="$1" | |
18 | while test "$range_counter" -le "$2"; do | |
19 | echo "$range_counter" | |
20 | range_counter="$((range_counter + $3))" | |
21 | done | |
22 | } | |
23 | ||
24 | powrange() { | |
25 | range_counter="$1" | |
26 | while test "$range_counter" -le "$2"; do | |
27 | echo "$range_counter" | |
28 | range_counter="$((range_counter * 2))" | |
29 | done | |
30 | } | |
31 | ||
7d44ff7d | 32 | run_grubfstest () { |
37865c2c VS |
33 | need_images= |
34 | for i in $(range 0 $((NEED_IMAGES_N-1)) 1); do | |
35 | need_images="$need_images $FSIMAGEP${i}.img"; | |
36 | done | |
37 | ||
38 | run_it -c $NEED_IMAGES_N $need_images "$@" | |
7d44ff7d VS |
39 | } |
40 | ||
41 | # OS LIMITATION: GNU/Linux has no AFS support, so we use a premade image and a reference tar file. I.a. no multiblocksize test | |
42 | ||
43 | MINLOGSECSIZE=9 | |
44 | MAXLOGSECSIZE=9 | |
45 | case x"$fs" in | |
46 | xntfs*) | |
47 | MINLOGSECSIZE=8 | |
48 | MAXLOGSECSIZE=12;; | |
49 | xvfat*|xmsdos*) | |
50 | MINLOGSECSIZE=9 | |
51 | # OS LIMITATION: It could go up to 32768 but Linux rejects sector sizes > 4096 | |
52 | MAXLOGSECSIZE=12;; | |
53 | xext*) | |
54 | MINLOGSECSIZE=8 | |
55 | MAXLOGSECSIZE=12;; | |
56 | xbtrfs*) | |
57 | MINLOGSECSIZE=8 | |
58 | # OS LIMITATION: It could go up to 32768 but Linux rejects sector sizes > 4096 | |
59 | MAXLOGSECSIZE=12;; | |
60 | xxfs) | |
61 | MINLOGSECSIZE=9 | |
62 | # OS LIMITATION: GNU/Linux doesn't accept > 4096 | |
63 | MAXLOGSECSIZE=12;; | |
900fca88 VS |
64 | xxfs_crc) |
65 | MINLOGSECSIZE=9 | |
66 | # OS LIMITATION: GNU/Linux doesn't accept > 1024 | |
67 | MAXLOGSECSIZE=10;; | |
7d44ff7d VS |
68 | xzfs*) |
69 | # OS LIMITATION: zfs-fuse hangs when creating zpool with sectors <=256B. | |
70 | MINLOGSECSIZE=9 | |
71 | # OS LIMITATION: zfs-fuse fails with >= 32K sectors. | |
72 | # OS limitation: zfs-fuse always uses ashift=9 with loop devices | |
73 | MAXLOGSECSIZE=9;; | |
74 | esac | |
37865c2c | 75 | for LOGSECSIZE in $(range "$MINLOGSECSIZE" "$MAXLOGSECSIZE" 1); do |
7d44ff7d VS |
76 | SECSIZE="$((1 << LOGSECSIZE))" |
77 | MINBLKSIZE=512 | |
78 | MAXBLKSIZE=512 | |
79 | BLKSTEP=0 | |
80 | case x"$fs" in | |
81 | xntfs*) | |
82 | MINBLKSIZE=$SECSIZE | |
83 | MAXBLKSIZE=65536 | |
84 | if [ x"$SECSIZE" = x256 ]; then | |
85 | MINBLKSIZE=512 | |
86 | MAXBLKSIZE=32768 | |
87 | fi | |
88 | ;; | |
89 | xvfat* | xmsdos*) | |
90 | MINBLKSIZE=$SECSIZE | |
91 | MAXBLKSIZE=$((128*SECSIZE)) | |
92 | ;; | |
93 | xexfat*) | |
94 | MINBLKSIZE=$SECSIZE | |
95 | # It could go further but it requires more and more space | |
96 | MAXBLKSIZE=8286208 | |
97 | ;; | |
98 | xhfs) | |
99 | MINBLKSIZE=512 | |
100 | # OS LIMITATION: should be 1048576 but linux hangs on unmnount with | |
101 | # >= 524288 | |
102 | MAXBLKSIZE=262144 | |
103 | ;; | |
104 | xhfsplus | xhfsplus_casesens | xhfsplus_wrap) | |
105 | MINBLKSIZE=512 | |
106 | MAXBLKSIZE=1048576 | |
107 | ;; | |
108 | xnilfs2) | |
5412028d VS |
109 | # nilfs2 supports blocksizes from 1024 to 4096 |
110 | # but non-4096 results in kernel oops in some cases, | |
111 | # avoid it. | |
112 | MINBLKSIZE=4096 | |
7d44ff7d VS |
113 | MAXBLKSIZE=4096 |
114 | ;; | |
115 | xsfs*) | |
116 | MINBLKSIZE=512 | |
117 | MAXBLKSIZE=4096 | |
118 | ;; | |
119 | xaffs | xaffs_intl) | |
120 | MINBLKSIZE=512 | |
121 | MAXBLKSIZE=4096 | |
122 | ;; | |
123 | xreiserfs*) | |
124 | MINBLKSIZE=512 | |
125 | # OS LIMITATION: 8192 isn't supported. | |
126 | MAXBLKSIZE=4096 | |
127 | ;; | |
128 | x"mdraid"*) | |
129 | MINBLKSIZE=4096 | |
130 | # OS LIMITATION: Linux oopses with >=32768K | |
131 | MAXBLKSIZE=$((16384*1024)) | |
132 | ;; | |
19c4156d | 133 | x"lvm_raid1"* | x"lvm_raid4" | x"lvm_raid5" | x"lvm_raid6") |
7d44ff7d VS |
134 | # OS LIMITATION: Linux crashes with less than 16384 |
135 | MINBLKSIZE=16384 | |
136 | # Could go further but what's the point? | |
137 | MAXBLKSIZE=$((65536*1024)) | |
138 | ;; | |
139 | x"lvm_mirrorall") | |
140 | MINBLKSIZE=2048 | |
141 | # Could go further but what's the point? | |
142 | MAXBLKSIZE=$((65536*1024)) | |
143 | ;; | |
144 | x"lvm_mirror1") | |
145 | MINBLKSIZE=4096 | |
146 | # Could go further but what's the point? | |
147 | MAXBLKSIZE=$((65536*1024)) | |
148 | ;; | |
149 | x"lvm_stripe") | |
150 | MINBLKSIZE=4096 | |
151 | # Could go further but what's the point? | |
152 | MAXBLKSIZE=$((65536*1024)) | |
153 | ;; | |
154 | x"lvm"*) | |
155 | MINBLKSIZE=1024 | |
156 | # Could go further but what's the point? | |
157 | MAXBLKSIZE=$((65536*1024)) | |
158 | ;; | |
159 | xext*) | |
160 | MINBLKSIZE=1024 | |
161 | if [ $MINBLKSIZE -lt $SECSIZE ]; then | |
162 | MINBLKSIZE=$SECSIZE | |
163 | fi | |
164 | MAXBLKSIZE=4096 | |
165 | ;; | |
166 | xsquash*) | |
167 | MINBLKSIZE=4096 | |
168 | MAXBLKSIZE=1048576;; | |
169 | xxfs) | |
170 | MINBLKSIZE=$SECSIZE | |
171 | # OS Limitation: GNU/Linux doesn't accept > 4096 | |
172 | MAXBLKSIZE=4096;; | |
900fca88 VS |
173 | xxfs_crc) |
174 | # OS Limitation: GNU/Linux doesn't accept != 1024 | |
175 | MINBLKSIZE=1024 | |
176 | MAXBLKSIZE=1024;; | |
7d44ff7d VS |
177 | xudf) |
178 | MINBLKSIZE=1024 | |
179 | MAXBLKSIZE=4096;; | |
180 | xbfs) | |
181 | MINBLKSIZE=1024 | |
182 | MAXBLKSIZE=8192;; | |
183 | xufs*) | |
184 | MINBLKSIZE=4096 | |
185 | # OS Limitation: Linux rejects 65536 blocks. | |
186 | MAXBLKSIZE=32768;; | |
187 | xminix3) | |
188 | # OS LIMITATION: Linux rejects non-power-of-two blocks. | |
189 | # OS LIMITATION: Linux rejects > 4096. | |
190 | MINBLKSIZE=1024 | |
191 | MAXBLKSIZE=4096;; | |
192 | esac | |
37865c2c VS |
193 | if test "$BLKSTEP" -eq 0; then |
194 | blksizes="$(powrange "$MINBLKSIZE" "$MAXBLKSIZE")" | |
195 | else | |
196 | blksizes="$(range "$MINBLKSIZE" "$MAXBLKSIZE" "$BLKSTEP")" | |
197 | fi | |
198 | for BLKSIZE in $blksizes; do | |
7d44ff7d VS |
199 | MAXDEVICES=1 |
200 | MINDEVICES=1 | |
201 | export fs | |
202 | case x"$fs" in | |
203 | x"zfs_raidz" | x"zfs_stripe" | x"zfs_mirror" | xbtrfs_raid0 \ | |
204 | | xbtrfs_raid1 | x"mdraid"*"_raid4" | x"mdraid"*"_raid5" \ | |
205 | | x"mdraid"*"_linear" \ | |
19c4156d | 206 | | x"mdraid"*"_raid10" | xlvm_raid1* | xlvm_mirror1 | xlvm_mirrorall) |
7d44ff7d VS |
207 | MINDEVICES=2 |
208 | MAXDEVICES=7 | |
209 | ;; | |
210 | xbtrfs_raid10) | |
211 | MINDEVICES=4 | |
212 | MAXDEVICES=7 | |
213 | ;; | |
214 | x"zfs_raidz2"| xlvm_raid5 | xlvm_raid4) | |
215 | MINDEVICES=3 | |
216 | MAXDEVICES=7;; | |
217 | x"zfs_raidz3" | x"mdraid"*"_raid6") | |
218 | MINDEVICES=4 | |
219 | MAXDEVICES=7;; | |
220 | xlvm_raid6) | |
221 | MINDEVICES=5 | |
222 | MAXDEVICES=7;; | |
223 | x"mdraid"*"_raid0" | x"mdraid"*"_raid1" | x"lvm" | xlvm_stripe) | |
224 | MINDEVICES=1 | |
225 | MAXDEVICES=7;; | |
226 | esac | |
227 | ||
37865c2c | 228 | for NDEVICES in $(range "$MINDEVICES" "$MAXDEVICES" 1); do |
7d44ff7d | 229 | export NDEVICES |
37865c2c VS |
230 | unset FSIMAGEP |
231 | FSIMAGEP="${tempdir}/${fs}_${SECSIZE}_${BLKSIZE}_${NDEVICES}_" | |
232 | export FSIMAGEP | |
7d44ff7d VS |
233 | unset NEED_IMAGES; |
234 | ||
235 | case x$fs in | |
236 | # RAID 1 has to work with even one device of the set. | |
19c4156d | 237 | xzfs_mirror | x"mdraid"*"_raid1" | xlvm_mirrorall | xlvm_raid1all) |
7d44ff7d VS |
238 | NEED_IMAGES_N=1;; |
239 | # Degrade raidz by removing 3 devices | |
240 | xzfs_raidz3) | |
241 | NEED_IMAGES_N=$((NDEVICES-3));; | |
242 | # Degrade raidz by removing 2 devices | |
243 | xzfs_raidz2 | x"mdraid"*"_raid6" | x"lvm_raid6") | |
244 | NEED_IMAGES_N=$((NDEVICES-2));; | |
245 | # Degrade raidz and btrfs RAID1 by removing one device | |
246 | xbtrfs_raid1 | xbtrfs_raid10 | xzfs_raidz | x"mdraid"*"_raid4" \ | |
247 | | x"mdraid"*"_raid5" | x"mdraid"*"_raid10" | xlvm_mirror1 \ | |
19c4156d | 248 | | x"lvm_raid1" | x"lvm_raid4" | x"lvm_raid5") |
7d44ff7d VS |
249 | NEED_IMAGES_N=$((NDEVICES-1));; |
250 | *) | |
251 | NEED_IMAGES_N=$NDEVICES;; | |
252 | esac | |
7d44ff7d | 253 | export NEED_IMAGES_N |
7d44ff7d VS |
254 | |
255 | MNTPOINTRO="${tempdir}/${fs}_ro" | |
256 | MNTPOINTRW="${tempdir}/${fs}_rw" | |
257 | MOUNTOPTS="" | |
258 | MOUNTFS="$fs" | |
259 | MASTER="${tempdir}/master" | |
260 | FSLABEL="grub_;/testé莭莽茝😁киритi urewfceniuewruevrewnuuireurevueurnievrewfnerfcnevirivinrewvnirewnivrewiuvcrewvnuewvrrrewniuerwreiuviurewiuviurewnuvewnvrenurnunuvrevuurerejiremvreijnvcreivire nverivnreivrevnureiorfnfrvoeoiroireoireoifrefoieroifoireoifoirefoireoifoijfoirereoireoivoioirevoinvoinreoinvnoieoinreoinveoinveoinreoinvoineoinoinoineoinernoiveoinvreoiioewdioewoirvnoireoivfoirewfewoifoijewoijfoijewfoijfewoijoijoijoijoijoijoijfewceniuewruevrewnuuireurevueurnievrewfnerfcnevirivinrewvnirewnivrewiuvcrewvnuewvrrrewniuerwreiuviurewiuviurewnuvewnvrenurnunuvrevuurerejiremvreijnvcreivire nverivnreivrevnureiorfnfrvoeoiroireoireoifrefoieroifoireoifoirefoireoifoijfoirereoireoivoioirevoinvoinreoinvnoieoinreoinveoinveoinreoinvoineoinoinoineoinernoiveoinvreoiioewdioewoirvnoireoivfoirewfewoifoijewoijfoijewfoijfewoijoijoijoijoijoijoijfewrewfceniuewruevrewnuuireurevueurnievrewfnerfcnevirivinrewvnirewnivrewiuvcrewvnuewvrrrewniuerwreiuviurewiuviurewnuvewnvrenurnunuvrevuurerejiremvreijnvcreivire nverivnreivrevnureiorfnfrvoeoiroireoireoifrefoieroifoireoifoirefoireoifoijfoirereoireoivoioirevoinvoinreoinvnoieoinreoinveoinveoinreoinvoineoinoinoineoinernoiveoinvreoiioewdioewoirvnoireoivfoirewfewoifoijewoijfoijewfoijfewoijoijoijoijoijoijoijfewceniuewruevrewnuuireurevueurnievrewfnerfcnevirivinrewvnirewnivrewiuvcrewvnuewvrrrewniuerwreiuviurewiuviurewnuvewnvrenurnunuvrevuurerejiremvreijnvcreivire nverivnreivrevnureiorfnfrvoeoiroireoireoifrefoieroifoireoifoirefoireoifoijfoirereoireoivoioirevoinvoinreoinvnoieoinreoinveoinveoinreoinvoineoinoinoineoinernoiveoinvreoiioewdioewoirvnoireoivfoirewfewoifoijewoijfoijewfoijfewoijoijoijoijoijoijoijfew" | |
37865c2c VS |
261 | CFILESRC= |
262 | for cand in /usr/share/dict/american-english /usr/share/dict/linux.words; do | |
263 | if test -f "$cand" ; then | |
264 | CFILESRC="$cand" | |
265 | break | |
266 | fi | |
267 | done | |
268 | if test "$CFILESRC" = "" ; then | |
269 | echo "Couldn't find compressible file" >&2 | |
270 | exit 1 | |
7d44ff7d VS |
271 | fi |
272 | case x"$fs" in | |
273 | # FS LIMITATION: 8.3 names | |
274 | xmsdos*) | |
37865c2c | 275 | CFILE="american.eng";; |
7d44ff7d | 276 | xiso9660) |
37865c2c | 277 | CFILE="american_english";; |
7d44ff7d | 278 | *) |
37865c2c | 279 | CFILE="american-english";; |
7d44ff7d VS |
280 | esac |
281 | # OS LIMITATION: Limited by NAME_MAX (usually 255) in GNU/Linux | |
bf0e59ce | 282 | LONGNAME="qwertzuiopasdfghjklyxcvbnm1234567890qwertzuiopasdfghjklyxcvbnm1234567890oiewqfiewioqoiqoiurqruewqoiuwoieoiiuewqroreqiufieiuwrnureweriuvceoiroiewqoiricdsalkcndsakfirefoiwqeoircorejwoijfreoijojoiewjfwnfcoirenfoirefnreoifenoiwfnoi" |
7d44ff7d VS |
283 | rm -rf "$MASTER" |
284 | ||
285 | case x"$fs" in | |
286 | # FS LIMITATION: HFS+ label is at most 255 UTF-16 chars | |
287 | # OS LIMITATION: Linux HFS+ tools check UTF-8 length and don't | |
288 | # handle out-of-BMP characters | |
289 | x"hfsplus" | x"hfsplus_casesens" | x"hfsplus_wrap") | |
290 | FSLABEL="grub_;/testé䏌䐓䏕киритi urewfceniuewruevrewnuuireurevueurnievrewfnerfcnevirivinrewvnirewnivrewiuvcrewvnuewvrrrewniuerwreiuviurewiuviurewnuvewnvrenurnunuvrevuurerejiremvreijnvcreivire nverivnreivrevnureiorfnfrvoeoiroireoireoifrefoieroifoireoifoiq" | |
291 | ;; | |
292 | # FS LIMITATION: btrfs label is at most 255 UTF-8 chars | |
293 | x"btrfs"*) | |
c65d35b0 | 294 | FSLABEL="grub_;/testé莭莽😁киритi urewfceniuewruevrewnuuireurevueurnievrewfnerfcnevirivinrewvnirewnivrewiuvcrewvnuewvrrrewniuerwreiuviurewiuviurewnuvewnvrenurnunuvrevuurerejiremvreijnvcreivire nverivnreivrevnureiorfnfrvoeoiroireoireoifrefoieroifoireoi";; |
7d44ff7d VS |
295 | |
296 | # FS LIMITATION: exfat is at most 15 UTF-16 chars | |
297 | x"exfat") | |
298 | FSLABEL="géт ;/莭莽😁кир";; | |
299 | # FS LIMITATION: ntfs label is at most ?? UTF-16 chars | |
300 | x"ntfs"*) | |
301 | FSLABEL="grub_;/testéтi u莭😁茝кириrewfceniuewruevrewnuuireurevueurnievrewfnerfcnevirivinrewvniwnivrewiuvcrewvnuewvrrrewniureifiuewifjiww";; | |
302 | # FS LIMITATION: nilfs2 label is at most 80 UTF-8 characters | |
303 | x"nilfs2") | |
304 | FSLABEL="grub_;/testéтi u😁莽茝кириrewfceniuewruevrewnuuireurevueurnievrewfne";; | |
305 | # FS LIMITATION: afs and iso9660 label is at most 32 UTF-8 characters | |
306 | x"afs" | xiso9660 | xrockridge | xrockridge_joliet\ | |
307 | | xiso9660_1999 | xrockridge_1999 | xrockridge_joliet_1999) | |
308 | FSLABEL="gr_;/é莭莽😁кирит u";; | |
309 | # FS LIMITATION: bfs label is at most 32 UTF-8 characters | |
310 | # OS LIMITATION: bfs label can't contain ; or / | |
311 | x"bfs") | |
312 | FSLABEL="grub_é莭莽😁кирит u";; | |
313 | # FS LIMITATION: Joliet label is at most 16 UTF-16 characters | |
314 | # OS LIMITATION: xorriso doesn't handle out-of-BMP characters | |
315 | xjoliet | xjoliet_1999) | |
316 | FSLABEL="g;/_é䏌䐓䏕䎛䎾䏴кит u" | |
317 | #FSLABEL="g;/_é莭莽😁кит u" | |
318 | ;; | |
319 | # FS LIMITATION: reiserfs, extN and jfs label is at most 16 UTF-8 characters | |
e20aa39e | 320 | x"reiserfs_old" | x"reiserfs" | x"ext"* | x"lvm"* | x"mdraid"* | x"jfs" | x"jfs_caseins") |
7d44ff7d VS |
321 | FSLABEL="g;/éт 莭😁";; |
322 | # FS LIMITATION: No underscore, space, semicolon, slash or international characters in UFS* in label. Limited to 32 UTF-8 characters | |
323 | x"ufs1" | x"ufs1_sun" | x"ufs2") | |
324 | FSLABEL="grubtest""ieurrucnenreeiurueurewf";; | |
325 | # FS LIMITATION: XFS label is at most 12 UTF-8 characters | |
900fca88 | 326 | x"xfs"|x"xfs_crc") |
7d44ff7d VS |
327 | FSLABEL="géт 😁к";; |
328 | # FS LIMITATION: FAT labels limited to 11 characters, no international characters or lowercase | |
329 | x"vfat"* | xmsdos*) | |
330 | FSLABEL="GRUBTEST ;_";; | |
331 | # FS LIMITATION: AFFS is latin1. At most 29 characters | |
332 | x"affs" | xaffs_intl) | |
333 | FSLABEL="grub_tt? #*w;/e£@¡¤½¾{[]}<>.,";; | |
334 | # FS LIMITATION: SFS is latin1. At most 30 characters | |
335 | x"sfs"*) | |
336 | FSLABEL="GRUB tt öäüé;/àèç åø¿ª©þð׫»µ¬";; | |
337 | # FS LIMITATION: HFS is Mac-Roman. At most 27 characters | |
338 | x"hfs") | |
339 | FSLABEL="grub_t;/estéàèèéie fiucnree";; | |
340 | # FS LIMITATION: UDF label is either up to 127 latin1 characters or 63 UTF-16 ones | |
341 | # OS LIMITATION: Linux UDF tools force ASCII label ... | |
342 | x"udf") | |
343 | FSLABEL="grub_;/testurewfceniuewruevrewnuuireurevueurnievr";; | |
344 | # FS LIMITATION: ZFS doesn't accept non-ASCII in label | |
345 | # FIXME: since this is used as a path component for mount it's very limited in length | |
346 | xzfs_* | xzfs) | |
347 | FSLABEL="grub_testieufiue r";; | |
348 | esac | |
349 | case x"$fs" in | |
350 | xmdraid*) | |
351 | DISKSIZE=314572800;; | |
352 | xlvm*) | |
353 | LVMBLKMUL=$(((5800 * 1048576) / (8 * BLKSIZE * NDEVICES))) | |
354 | DISKSIZE=$((8*BLKSIZE*LVMBLKMUL));; | |
355 | # FS LIMITATION: some fs have disk size limit | |
356 | x"vfat12" | xmsdos12) | |
357 | DISKSIZE=$((4000*BLKSIZE));; | |
358 | x"vfat12a" | xmsdos12a) | |
359 | if [ $BLKSIZE -ge 2048 ]; then | |
360 | DISKSIZE=$((2500*BLKSIZE)) | |
361 | else | |
362 | DISKSIZE=$((3000*BLKSIZE)) | |
363 | fi | |
364 | if [ $DISKSIZE -gt $((60000*SECSIZE)) ]; then | |
365 | DISKSIZE=$((60000*SECSIZE)) | |
366 | fi;; | |
367 | x"vfat16" | xmsdos16) | |
368 | DISKSIZE=$((65000*BLKSIZE));; | |
369 | x"vfat16a" | xmsdos16a) | |
370 | DISKSIZE=$((60000*SECSIZE)) | |
371 | ;; | |
372 | *) | |
373 | DISKSIZE=10737418240;; | |
374 | esac | |
375 | ||
376 | if [ $DISKSIZE -ge $(((5800/NDEVICES)*1048576)) ]; then | |
377 | DISKSIZE=$(((5800/NDEVICES)*1048576)) | |
378 | fi | |
379 | ||
380 | case x"$fs" in | |
381 | xvfat* | xmsdos* | xexfat* | xhfs | xhfsplus | xhfsplus_wrap | xaffs \ | |
382 | | xaffs_intl | xjfs_caseins | xsfs_caseins \ | |
383 | | xzfs_caseins | xiso9660) | |
384 | CASESENS=n;; | |
385 | *) | |
386 | CASESENS=y;; | |
387 | esac | |
388 | ||
389 | BIGBLOCKCNT=$((5000 * 1048576)) | |
390 | case x"$fs" in | |
391 | # FS LIMITATION: small filesystems | |
392 | x"vfat12" | xmsdos12) | |
393 | if [ $BLKSIZE -le 4096 ]; then | |
394 | BIGBLOCKCNT=0 | |
395 | elif [ $BLKSIZE = 8192 ]; then | |
396 | BIGBLOCKCNT=1500000 | |
397 | else | |
398 | BIGBLOCKCNT=$((2000*BLKSIZE)) | |
399 | fi | |
400 | ;; | |
401 | x"vfat12a" | xmsdos12a) | |
402 | if [ $BLKSIZE -le 4096 ] || [ $((128*SECSIZE)) = $BLKSIZE ]; then | |
403 | BIGBLOCKCNT=0 | |
404 | else | |
405 | BIGBLOCKCNT=700000 | |
406 | fi;; | |
407 | x"vfat16a" | xmsdos16a) | |
408 | if [ $((128*SECSIZE)) = $BLKSIZE ]; then | |
409 | BIGBLOCKCNT=0 | |
410 | else | |
411 | BIGBLOCKCNT=$((2500*SECSIZE)) | |
412 | fi | |
413 | ;; | |
414 | x"vfat16" | xmsdos16) | |
415 | BIGBLOCKCNT=$((25000 * BLKSIZE)) | |
37865c2c VS |
416 | if [ $BIGBLOCKCNT -gt 4294967295 ]; then |
417 | BIGBLOCKCNT=4294967295 | |
7d44ff7d VS |
418 | fi |
419 | ;; | |
420 | x"minix") | |
421 | BIGBLOCKCNT=30000000;; | |
422 | ||
423 | xexfat) | |
424 | # Big blocks waste really a lot of space. | |
425 | # Not much is left. | |
426 | if [ $BLKSIZE = 2097152 ]; then | |
427 | BIGBLOCKCNT=4500000000 | |
428 | fi | |
429 | if [ $BLKSIZE = 4194304 ]; then | |
430 | BIGBLOCKCNT=3500000000 | |
431 | fi | |
432 | ;; | |
433 | # FS LIMITATION: romfs image is limited to 4G. | |
434 | x"romfs") | |
435 | BIGBLOCKCNT=$((4000 * 1048576));; | |
436 | # FS LIMITATION: These FS have uint32 as file size field | |
437 | x"vfat"* | xmsdos* | x"cpio_crc" | x"cpio_newc" | x"cpio_bin" | x"cpio_hpbin" | xsfs*) | |
37865c2c | 438 | BIGBLOCKCNT=4294967295;; |
7d44ff7d VS |
439 | # FS LIMITATION: These FS have int32 as file size field |
440 | # FIXME: not so sure about AFFS | |
441 | # OS LIMITATION: minix2/minix3 could be formatted in a way to permit more. | |
442 | x"minix3" | x"minix2" | x"hfs"| x"affs" | xaffs_intl | xreiserfs_old | xext2_old) | |
443 | BIGBLOCKCNT=$((16#7fffffff));; | |
444 | ||
445 | # FS LIMITATION: redundant storage | |
446 | # We have only limited space. Mirroring multiplies it very effectively. | |
447 | xmdraid* | xlvm* | xzfs_mirror | xbtrfs_raid1) | |
448 | BIGBLOCKCNT=$((100 * 1048576));; | |
449 | # We already test the FS for big files separately. Save some time here. | |
450 | x"zfs_raid"* | x"zfs_stripe"* | x"zfs_mirror"* | x"btrfs_raid"*) | |
451 | BIGBLOCKCNT=$((100 * 1048576));; | |
452 | ||
453 | # OS LIMITATION: bfs_fuse bugs beyond that | |
454 | xbfs) | |
455 | BIGBLOCKCNT=$((800 * 1048576));; | |
456 | esac | |
457 | ||
458 | NOSYMLINK=n | |
459 | case x"$fs" in | |
460 | # FS LIMITATION: no symlinks on FAT, exFAT, HFS, plain ISO9660 and Joliet | |
461 | # OS LIMITATION: ntfs-3g creates interix symlinks which aren't real symlinks | |
462 | x"vfat"* | xmsdos* | x"hfs" | x"exfat" | x"ntfs"* \ | |
463 | | xiso9660 | xjoliet| xiso9660_1999 | xjoliet_1999) | |
464 | NOSYMLINK=y;; | |
465 | esac | |
466 | NOHARDLINK=n | |
467 | case x"$fs" in | |
468 | # FS LIMITATION: no hardlinks on BFS, exfat, fat, hfs and SFS | |
469 | xbfs | xexfat | x"vfat"* | xmsdos* | xhfs | xsfs | xsfs_caseins) | |
470 | NOHARDLINK=y;; | |
471 | # GRUB LIMITATION: no hardlink support on newc and hfs+ | |
472 | xcpio_crc | xcpio_newc | xhfsplus*) | |
473 | NOHARDLINK=y;; | |
474 | esac | |
475 | ||
476 | # FS LIMITATION: some filesystems limit file name size | |
477 | case x"$fs" in | |
478 | x"cpio_ustar") | |
479 | LONGNAME="`echo $LONGNAME |head -c 99`";; | |
480 | x"hfs") | |
481 | LONGNAME="`echo $LONGNAME |head -c 31`";; | |
482 | x"minix" | x"minix2" | x"affs" | xaffs_intl | xiso9660) | |
483 | LONGNAME="`echo $LONGNAME |head -c 30`";; | |
484 | x"sfs"*) | |
485 | LONGNAME="`echo $LONGNAME |head -c 105`";; | |
486 | x"minix3") | |
487 | LONGNAME="`echo $LONGNAME |head -c 60`";; | |
488 | x"udf") | |
489 | LONGNAME="`echo $LONGNAME |head -c 192`";; | |
490 | # GRUB LIMITATION: GRUB prefers Joliet over ISO9660:1999 | |
491 | xjoliet | xjoliet_1999) | |
492 | LONGNAME="`echo $LONGNAME |head -c 103`";; | |
493 | xiso9660_1999) | |
494 | LONGNAME="`echo $LONGNAME |head -c 207`";; | |
495 | # FS LIMITATION: 8.3 | |
496 | xmsdos*) | |
497 | LONGNAME="qwertzui.opa";; | |
498 | esac | |
499 | NOFILETIME=n | |
500 | NOFSTIME=n | |
501 | case x"$fs" in | |
502 | # FIXME: Not sure about BtrFS, NTFS, JFS, AFS, UDF and SFS. Check it. | |
503 | # FS LIMITATION: as far as I know those FS don't store their last modification date. | |
900fca88 | 504 | x"jfs_caseins" | x"jfs" | x"xfs" | x"xfs_crc" | x"btrfs"* | x"reiserfs_old" | x"reiserfs" \ |
7d44ff7d VS |
505 | | x"bfs" | x"afs" \ |
506 | | x"tarfs" | x"cpio_"* | x"minix" | x"minix2" \ | |
507 | | x"minix3" | x"ntfs"* | x"udf" | x"sfs"*) | |
508 | NOFSTIME=y;; | |
509 | # OS LIMITATION: Linux doesn't update fstime. | |
510 | # OS LIMITATION: Linux apparently uses localtime instead of UTC | |
511 | xhfs) | |
512 | NOFILETIME=y; NOFSTIME=y;; | |
513 | # GRUB LIMITATION: FAT and exFAT use localtime. Unusable for GRUB | |
514 | x"vfat"* | x"msdos"* | x"exfat") | |
515 | NOFILETIME=y; NOFSTIME=y;; | |
516 | # FS LIMITATION: romfs has no timestamps. | |
517 | x"romfs") | |
518 | NOFILETIME=y; NOFSTIME=y;; | |
519 | esac | |
520 | ||
521 | NOFSLABEL=n | |
522 | case x"$fs" in | |
523 | # FS LIMITATION: these filesystems have no label. | |
524 | x"cpio_"* | x"tarfs" | x"squash4_"* | x"minix" | x"minix2" \ | |
525 | | x"minix3" | xreiserfs_old) | |
526 | NOFSLABEL=y;; | |
527 | esac | |
528 | ||
bf0e59ce VS |
529 | PDIRCOMPNUM=210 |
530 | PDIR2COMPNUM=210 | |
7d44ff7d VS |
531 | |
532 | case x$fs in | |
533 | # OS LIMITATION: bfs_fuse bugs beyond that | |
534 | xbfs) | |
535 | PDIRCOMPNUM=10 | |
536 | PDIR2COMPNUM=10;; | |
537 | # OS LIMITATION: Linux supports only inline symlinks | |
538 | xudf) | |
539 | if [ $BLKSIZE = 1024 ]; then | |
540 | PDIR2COMPNUM=113 | |
541 | fi ;; | |
542 | # FS LIMITATION: at most 255 on path length | |
543 | # FS LIMITATION: at most 100 on symlink length | |
544 | xcpio_ustar) | |
bf0e59ce | 545 | PDIRCOMPNUM=84 |
7d44ff7d VS |
546 | PDIR2COMPNUM=30;; |
547 | # OS LIMITATION: Linux supports only symlink at most one block long on reiserfs | |
548 | xreiserfs | xreiserfs_old) | |
549 | if [ $BLKSIZE = 512 ]; then | |
550 | PDIR2COMPNUM=114 | |
551 | fi ;; | |
552 | # FS LIMITATION: SFS assumes that symlink | |
553 | # with header fit in one block. | |
554 | # FIXME: not sure about it. | |
555 | xsfs | xsfs_caseins) | |
556 | if [ $BLKSIZE = 512 ]; then | |
557 | PDIR2COMPNUM=147 | |
558 | fi ;; | |
559 | # FS LIMITATION: AFFS assumes that symlink | |
560 | # with rather larger header fit in one block. | |
561 | # FIXME: not sure about it. | |
562 | xaffs | xaffs_intl) | |
563 | if [ $BLKSIZE = 512 ]; then | |
564 | PDIR2COMPNUM=97 | |
565 | fi ;; | |
566 | esac | |
567 | ||
568 | ||
569 | PDIR="" | |
570 | # OS LIMITATION: Limited by PATH_MAX (usually 1024) | |
37865c2c | 571 | for i in $(range 0 $((PDIRCOMPNUM-1)) 1); do |
7d44ff7d | 572 | PDIR="$PDIR/$i"; |
37865c2c | 573 | if test $((i%3)) = 0; then |
7d44ff7d VS |
574 | PDIR="$PDIR/" |
575 | fi | |
576 | done | |
577 | ||
578 | PDIR2="" | |
579 | # OS LIMITATION: Limited by PATH_MAX (usually 1024) | |
37865c2c | 580 | for i in $(range 0 $((PDIR2COMPNUM-1)) 1); do |
7d44ff7d | 581 | PDIR2="${PDIR2}/$i"; |
37865c2c | 582 | if test $((i%3)) = 0; then |
7d44ff7d VS |
583 | PDIR2="${PDIR2}/" |
584 | fi | |
585 | done | |
586 | ||
587 | PFIL="p.img" | |
588 | ||
589 | unset LODEVICES | |
590 | GENERATED=n | |
37865c2c VS |
591 | LODEVICES= |
592 | MOUNTDEVICE= | |
593 | ||
7d44ff7d VS |
594 | case x"$fs" in |
595 | x"tarfs" | x"cpio_"*| x"ziso9660" | x"romfs" | x"squash4_"*\ | |
596 | | x"iso9660" | xjoliet | xrockridge | xrockridge_joliet \ | |
597 | | x"iso9660_1999" | xjoliet_1999 | xrockridge_1999 \ | |
598 | | xrockridge_joliet_1999) | |
599 | MNTPOINTRW="$MASTER" | |
600 | MNTPOINTRO="$MASTER" | |
601 | GENERATED=y | |
602 | mkdir -p "$MASTER";; | |
603 | # No mkfs for GNU/Linux. Just unpack preformatted empty image | |
604 | *) | |
605 | mkdir -p "$MNTPOINTRW" | |
606 | mkdir -p "$MNTPOINTRO" | |
37865c2c VS |
607 | for i in $(range 0 $((NDEVICES-1)) 1); do |
608 | dd if=/dev/zero of="$FSIMAGEP${i}.img" count=1 bs=1 seek=$((DISKSIZE-1)) &> /dev/null | |
609 | LODEVICE="$(losetup -f)" | |
610 | LODEVICES="$LODEVICES $LODEVICE" | |
611 | losetup "$LODEVICE" "$FSIMAGEP${i}.img" | |
612 | if test "$i" = 0; then | |
613 | MOUNTDEVICE="$LODEVICE" | |
614 | fi | |
7d44ff7d VS |
615 | done ;; |
616 | esac | |
617 | ||
7d44ff7d VS |
618 | case x"$fs" in |
619 | x"afs") | |
620 | ;; | |
621 | x"btrfs") | |
37865c2c | 622 | "mkfs.btrfs" -s $SECSIZE -L "$FSLABEL" "${MOUNTDEVICE}" ;; |
7d44ff7d | 623 | x"btrfs_zlib" | x"btrfs_lzo") |
37865c2c | 624 | "mkfs.btrfs" -s $SECSIZE -L "$FSLABEL" "${MOUNTDEVICE}" |
7d44ff7d VS |
625 | MOUNTOPTS="compress=${fs/btrfs_/}," |
626 | MOUNTFS="btrfs" | |
627 | ;; | |
628 | x"btrfs_raid0") | |
37865c2c | 629 | "mkfs.btrfs" -s $SECSIZE -d raid0 -m raid0 -L "$FSLABEL" $LODEVICES |
7d44ff7d VS |
630 | MOUNTFS="btrfs" |
631 | ;; | |
632 | x"btrfs_raid1") | |
37865c2c | 633 | "mkfs.btrfs" -s $SECSIZE -d raid1 -m raid1 -L "$FSLABEL" $LODEVICES |
7d44ff7d VS |
634 | MOUNTFS="btrfs" |
635 | ;; | |
636 | x"btrfs_raid10") | |
37865c2c | 637 | "mkfs.btrfs" -s $SECSIZE -d raid10 -m raid10 -L "$FSLABEL" $LODEVICES |
7d44ff7d VS |
638 | MOUNTFS="btrfs" |
639 | ;; | |
640 | x"btrfs_single") | |
37865c2c | 641 | "mkfs.btrfs" -s $SECSIZE -d single -L "$FSLABEL" $LODEVICES |
7d44ff7d VS |
642 | MOUNTFS="btrfs" |
643 | ;; | |
644 | x"exfat") | |
37865c2c | 645 | "mkfs.$fs" -s $((BLKSIZE/512)) -n "$FSLABEL" "${MOUNTDEVICE}" |
7d44ff7d VS |
646 | MOUNTOPTS="iocharset=utf8," |
647 | MOUNTFS="exfat-fuse";; | |
648 | x"minix") | |
37865c2c | 649 | "mkfs.minix" "${MOUNTDEVICE}" |
7d44ff7d VS |
650 | ;; |
651 | # mkfs.hfs and mkfs.hfsplus don't fill UUID. | |
652 | x"hfsplus") | |
37865c2c VS |
653 | "mkfs.hfsplus" -b $BLKSIZE -v "$FSLABEL" "${MOUNTDEVICE}" |
654 | dd if=/dev/urandom of="${MOUNTDEVICE}" bs=1 seek=$((16#468)) conv=notrunc count=8 ;; | |
7d44ff7d | 655 | x"hfsplus_wrap") |
37865c2c VS |
656 | "mkfs.hfsplus" -w -b $BLKSIZE -v "$FSLABEL" "${MOUNTDEVICE}" |
657 | dd if=/dev/urandom of="${MOUNTDEVICE}" bs=1 seek=$((16#468)) conv=notrunc count=8 | |
7d44ff7d VS |
658 | MOUNTFS="hfsplus";; |
659 | x"hfsplus_casesens") | |
37865c2c VS |
660 | "mkfs.hfsplus" -s -b $BLKSIZE -v "$FSLABEL" "${MOUNTDEVICE}" |
661 | dd if=/dev/urandom of="${MOUNTDEVICE}" bs=1 seek=$((16#468)) conv=notrunc count=8 | |
7d44ff7d VS |
662 | MOUNTFS="hfsplus";; |
663 | x"hfs") | |
37865c2c VS |
664 | "mkfs.hfs" -b $BLKSIZE -v "`echo $FSLABEL |recode utf8..macroman`" -h "${MOUNTDEVICE}" |
665 | dd if=/dev/urandom of="${MOUNTDEVICE}" bs=1 seek=$((16#474)) conv=notrunc count=8 | |
7d44ff7d VS |
666 | MOUNTOPTS="iocharset=utf8,codepage=macroman," |
667 | ;; | |
668 | x"vfat"*|xmsdos*) | |
669 | BITS="${fs/vfat/}" | |
670 | BITS="${BITS/msdos/}" | |
671 | if [ "x${BITS:2:1}" = xa ]; then | |
672 | A=-A | |
673 | else | |
674 | A= | |
675 | fi | |
37865c2c | 676 | "mkfs.vfat" -a $A -S $SECSIZE -s $((BLKSIZE/SECSIZE)) -F "${BITS:0:2}" -n "$FSLABEL" "${MOUNTDEVICE}" |
7d44ff7d VS |
677 | MOUNTOPTS="iocharset=utf8,codepage=437," |
678 | MOUNTFS="$(echo "$fs"|sed 's,[0-9]*a\?$,,')";; | |
679 | x"minix2") | |
37865c2c | 680 | "mkfs.minix" -v "${MOUNTDEVICE}" |
7d44ff7d VS |
681 | MOUNTFS="minix";; |
682 | x"minix3") | |
37865c2c | 683 | "mkfs.minix" -B $BLKSIZE -3 "${MOUNTDEVICE}" |
7d44ff7d VS |
684 | MOUNTFS="minix";; |
685 | x"ntfs"*) | |
37865c2c | 686 | "mkfs.ntfs" -s "$SECSIZE" -c "$BLKSIZE" -L "$FSLABEL" -Q -q "${MOUNTDEVICE}" |
7d44ff7d VS |
687 | MOUNTOPTS="iocharset=utf8,compression," |
688 | MOUNTFS="ntfs-3g";; | |
689 | x"udf") | |
37865c2c | 690 | "mkudffs" --utf8 -b $BLKSIZE --lvid="$FSLABEL" "${MOUNTDEVICE}" |
7d44ff7d VS |
691 | MOUNTOPTS="iocharset=utf8,bs=$BLKSIZE,";; |
692 | x"ufs2") | |
37865c2c | 693 | "mkfs.ufs" -b $BLKSIZE -L "$FSLABEL" -O 2 "${MOUNTDEVICE}" |
7d44ff7d VS |
694 | MOUNTOPTS="ufstype=ufs2," |
695 | MOUNTFS="ufs";; | |
696 | x"ufs1") | |
37865c2c | 697 | "mkfs.ufs" -b $BLKSIZE -L "$FSLABEL" -O 1 "${MOUNTDEVICE}" |
7d44ff7d VS |
698 | MOUNTOPTS="ufstype=44bsd," |
699 | MOUNTFS="ufs";; | |
700 | x"ufs1_sun") | |
37865c2c | 701 | "mkfs.ufs" -b $BLKSIZE -L "$FSLABEL" -O 1 "${MOUNTDEVICE}" |
7d44ff7d VS |
702 | MOUNTOPTS="ufstype=sun," |
703 | MOUNTFS="ufs";; | |
704 | x"zfs") | |
37865c2c | 705 | "zpool" create -R "$MNTPOINTRW" "$FSLABEL" "${MOUNTDEVICE}" |
7d44ff7d VS |
706 | sleep 1 |
707 | "zfs" create "$FSLABEL"/"grub fs" | |
708 | sleep 1;; | |
709 | x"zfs_caseins") | |
37865c2c | 710 | "zpool" create -R "$MNTPOINTRW" "$FSLABEL" "${MOUNTDEVICE}" |
7d44ff7d VS |
711 | sleep 1 |
712 | "zfs" create -o casesensitivity=insensitive "$FSLABEL"/"grub fs" | |
713 | sleep 1;; | |
714 | x"zfs_lzjb" | xzfs_gzip | xzfs_zle) | |
37865c2c | 715 | "zpool" create -O compression=${fs/zfs_/} -R "$MNTPOINTRW" "$FSLABEL" "${MOUNTDEVICE}" |
7d44ff7d VS |
716 | sleep 1 |
717 | "zfs" create -o compression=${fs/zfs_/} "$FSLABEL"/"grub fs" | |
718 | sleep 1;; | |
719 | x"zfs_raidz") | |
37865c2c | 720 | "zpool" create -R "$MNTPOINTRW" "$FSLABEL" raidz1 $LODEVICES |
7d44ff7d VS |
721 | sleep 1 |
722 | "zfs" create "$FSLABEL"/"grub fs" | |
723 | sleep 1;; | |
724 | x"zfs_raidz2") | |
37865c2c | 725 | "zpool" create -R "$MNTPOINTRW" "$FSLABEL" raidz2 $LODEVICES |
7d44ff7d VS |
726 | sleep 1 |
727 | "zfs" create "$FSLABEL"/"grub fs" | |
728 | sleep 1;; | |
729 | x"zfs_raidz3") | |
37865c2c | 730 | "zpool" create -R "$MNTPOINTRW" "$FSLABEL" raidz3 $LODEVICES |
7d44ff7d VS |
731 | sleep 1 |
732 | "zfs" create "$FSLABEL"/"grub fs" | |
733 | sleep 1;; | |
734 | x"zfs_mirror") | |
37865c2c | 735 | "zpool" create -R "$MNTPOINTRW" "$FSLABEL" mirror $LODEVICES |
7d44ff7d VS |
736 | sleep 1 |
737 | "zfs" create "$FSLABEL"/"grub fs" | |
738 | sleep 1;; | |
739 | x"zfs_stripe") | |
37865c2c | 740 | "zpool" create -R "$MNTPOINTRW" "$FSLABEL" $LODEVICES |
7d44ff7d VS |
741 | sleep 1 |
742 | "zfs" create "$FSLABEL"/"grub fs" | |
743 | sleep 1;; | |
744 | x"tarfs" | x"cpio_"* | x"iso9660" | xjoliet | xrockridge | xrockridge_joliet | x"iso9660_1999" | xjoliet_1999 | xrockridge_1999 | xrockridge_joliet_1999 | x"ziso9660" | x"romfs" | x"squash4_"*) | |
745 | INSTDEVICE=/dev/null;; | |
746 | x"reiserfs") | |
37865c2c | 747 | "mkfs.reiserfs" --format=3.6 -b $BLKSIZE -l "$FSLABEL" -q "${MOUNTDEVICE}" ;; |
7d44ff7d | 748 | x"reiserfs_old") |
37865c2c | 749 | "mkfs.reiserfs" --format=3.5 -b $BLKSIZE -l "$FSLABEL" -q "${MOUNTDEVICE}" |
7d44ff7d VS |
750 | MOUNTFS=reiserfs;; |
751 | x"jfs") | |
37865c2c | 752 | "mkfs.jfs" -L "$FSLABEL" -q "${MOUNTDEVICE}" |
7d44ff7d VS |
753 | MOUNTOPTS="iocharset=utf8,";; |
754 | x"jfs_caseins") | |
37865c2c | 755 | "mkfs.jfs" -O -L "$FSLABEL" -q "${MOUNTDEVICE}" |
7d44ff7d VS |
756 | MOUNTFS=jfs |
757 | MOUNTOPTS="iocharset=utf8,";; | |
758 | x"mdraid"*) | |
37865c2c | 759 | mdadm -C --chunk=$((BLKSIZE/1024)) --force -e "${fs:6:1}.${fs:7:1}" "/dev/md/${fs}_${NDEVICES}" --level="${fs:13}" --raid-devices="$NDEVICES" $LODEVICES |
7d44ff7d VS |
760 | MOUNTDEVICE="/dev/md/${fs}_${NDEVICES}" |
761 | MOUNTFS=ext2 | |
762 | "mkfs.ext2" -L "$FSLABEL" -q "${MOUNTDEVICE}" ;; | |
763 | x"lvm"*) | |
37865c2c VS |
764 | for lodev in $LODEVICES; do |
765 | pvcreate "$lodev" | |
7d44ff7d | 766 | done |
37865c2c | 767 | vgcreate -s $((BLKSIZE/1024))K grub_test $LODEVICES |
7d44ff7d VS |
768 | if [ x$fs = xlvm ] ; then |
769 | lvcreate -l "$((NDEVICES*7*LVMBLKMUL))" -n testvol grub_test | |
770 | elif [ x$fs = xlvm_stripe ] ; then | |
771 | lvcreate -l "$((NDEVICES*7*LVMBLKMUL))" -i "$NDEVICES" -n testvol grub_test | |
19c4156d AB |
772 | elif [ x$fs = xlvm_mirror1 ] || [ x$fs = xlvm_raid1 ] ; then |
773 | lvcreate -m 1 -l "$((NDEVICES*2*LVMBLKMUL))" --type "${fs/lvm_/}" -n testvol grub_test | |
7d44ff7d | 774 | elif [ x$fs = xlvm_mirrorall ] ; then |
7c9309e5 | 775 | lvcreate -m "$((NDEVICES-1))" -l "$((6*LVMBLKMUL))" --type mirror -n testvol grub_test |
19c4156d AB |
776 | elif [ x$fs = xlvm_raid1all ] ; then |
777 | # Until version 2.02.103 LVM counts metadata segments | |
778 | # twice when checking available space. Reduce segment | |
779 | # count to work around it. | |
780 | lvcreate -m "$((NDEVICES-1))" -l "$((6*LVMBLKMUL - 1))" --type raid1 -n testvol grub_test | |
7d44ff7d VS |
781 | elif [ x$fs = xlvm_raid4 ] || [ x$fs = xlvm_raid5 ]; then |
782 | lvcreate -l "$(((NDEVICES-1) * 5*LVMBLKMUL))" -i "$((NDEVICES-1))" --type "${fs/lvm_/}" -n testvol grub_test | |
783 | elif [ x$fs = xlvm_raid6 ]; then | |
784 | lvcreate -l "$(((NDEVICES-2) * 5*LVMBLKMUL))" -i "$((NDEVICES-2))" --type "${fs/lvm_/}" -n testvol grub_test | |
785 | fi | |
786 | MOUNTDEVICE="/dev/mapper/grub_test-testvol" | |
787 | MOUNTFS=ext2 | |
788 | "mkfs.ext2" -L "$FSLABEL" -q "${MOUNTDEVICE}" ;; | |
789 | xnilfs2) | |
37865c2c | 790 | "mkfs.nilfs2" -L "$FSLABEL" -b $BLKSIZE -q "${MOUNTDEVICE}" ;; |
7d44ff7d | 791 | xext2_old) |
37865c2c | 792 | MKE2FS_DEVICE_SECTSIZE=$SECSIZE "mkfs.ext2" -r 0 -b $BLKSIZE -L "$FSLABEL" -q "${MOUNTDEVICE}" |
7d44ff7d VS |
793 | MOUNTFS=ext2 |
794 | ;; | |
e20aa39e | 795 | xext4_metabg) |
37865c2c | 796 | MKE2FS_DEVICE_SECTSIZE=$SECSIZE "mkfs.ext4" -O meta_bg,^resize_inode -b $BLKSIZE -L "$FSLABEL" -q "${MOUNTDEVICE}" |
e20aa39e VS |
797 | MOUNTFS=ext4 |
798 | ;; | |
7d44ff7d | 799 | xext*) |
37865c2c | 800 | MKE2FS_DEVICE_SECTSIZE=$SECSIZE "mkfs.$fs" -b $BLKSIZE -L "$FSLABEL" -q "${MOUNTDEVICE}" ;; |
7d44ff7d | 801 | xxfs) |
37865c2c | 802 | "mkfs.xfs" -m crc=0 -b size=$BLKSIZE -s size=$SECSIZE -L "$FSLABEL" -q "${MOUNTDEVICE}" ;; |
900fca88 VS |
803 | xxfs_crc) |
804 | MOUNTFS="xfs" | |
37865c2c | 805 | "mkfs.xfs" -m crc=1 -b size=$BLKSIZE -s size=$SECSIZE -L "$FSLABEL" -q "${MOUNTDEVICE}" ;; |
7d44ff7d VS |
806 | *) |
807 | echo "Add appropriate mkfs command here" | |
808 | exit 1 | |
809 | ;; | |
810 | esac | |
811 | BASEFILE="1.img" | |
812 | NASTYFILE=".?*\\!\"#%@\$%&'()+ ,-.:;<=>^{_}[]\`|~." | |
813 | case x"$fs" in | |
814 | ||
815 | # FS LIMITATION: AFFS and SFS don't accept : | |
816 | xsfs*) | |
817 | NASTYFILE=".?*\\!\"#%@\$%&'()+ ,-.;<=>^{_}[]\`|~.";; | |
818 | # FS LIMITATION: AFFS is limited in file name length (30) | |
819 | x"affs" | xaffs_intl) | |
820 | NASTYFILE=".?*\\!\"#@\$'()+ ,-;<=>^{_}[]\`|~.";; | |
821 | # FS LIMITATION: hfs, minix and minix2 are limited in file name length (30 or 31) | |
822 | x"hfs" | x"minix" | x"minix2") | |
823 | NASTYFILE=".?*\\!\"#@\$&'()+ ,-:;<=>{}[]\`|~.";; | |
824 | # FS LIMITATION: FAT doesn't accept ?, *, \, ", :, <, >, | | |
825 | # FS LIMITATION: FAT discards dots at the end. | |
826 | x"vfat"* | x"exfat") | |
827 | NASTYFILE=".!#%@\$%&'()+ ,-.;=^{_}[]\`~";; | |
828 | # FS LIMITATION: 8.3 limitations apply | |
829 | x"msdos"*) | |
830 | NASTYFILE="!#%@\$%&.;=^";; | |
831 | # FS LIMITATION: No ' ', '*', '/', ':', ';', '?', '\\' in joliet | |
832 | # GRUB LIMITATION: GRUB prefers Joliet over ISO9660:1999 | |
833 | xjoliet | xjoliet_1999) | |
834 | NASTYFILE=".!\"#%@\$%&'()+,-.<=>^{_}[]\`|~.";; | |
835 | # FS LIMITATION: iso9660 accepts only [0-9A-Z_]*, 32 characters at most | |
836 | xiso9660) | |
837 | NASTYFILE="0123456789_acefghijknopqrvwxyz";; | |
838 | esac | |
839 | ||
840 | case x"$fs" in | |
841 | # FS LIMITATION: HFS, AFFS and SFS use legacy codepage (mac-roman or latin1) | |
842 | x"sfs"* | x"hfs" | x"affs" | xaffs_intl) | |
843 | IFILE="éàèüöäëñ" | |
844 | ISYM="ëñéüöäàè" | |
845 | ;; | |
846 | # FS LIMITATION: filename length limitation. | |
847 | x"minix" | x"minix2") | |
848 | IFILE="éàèüö😁ñкиΕλκά" | |
849 | ISYM="Ελκάкиéà😁öäëñ" | |
850 | ;; | |
851 | xminix3) | |
852 | IFILE="éàèüöäëñкирица莭茝Ελλικά😁😜😒" | |
853 | ISYM="Ελλικά😁😜😒莭茝кирицаéàèüöäëñ";; | |
854 | # GRUB LIMITATION: HFS+ uses NFD. GRUB doesn't handle NF conversion. | |
855 | # OS LIMITATION: Linux doesn't handle out-of-BMP characters for UTF-16 | |
856 | x"hfsplus" | x"hfsplus_casesens" | x"hfsplus_wrap") | |
857 | IFILE="éàèüöäëñкирилица䏌䐓䏕Ελληνικα̍䏌䐓䏕" | |
858 | ISYM="Ελληνικα̍кирилица䏌䐓䏕éàèüöäëñ䏌䐓䏕" | |
859 | ;; | |
860 | # GRUB LIMITATION: On case-insensitive ZFS isn't supported with non-uppercase characters | |
861 | xzfs_caseins) | |
862 | IFILE="ÉÀÈÜÖÄËÑКИРИЛИЦА莭莽茝ΕΛΛΗΝΙΚΆ😁😜😒" | |
863 | ISYM="ΕΛΛΗΝΙΚΆКИРИЛИЦА😁😜😒ÉÀÈÜÖÄËÑ莭莽茝";; | |
864 | # FS LIMITATION: 8.3 CP437 | |
865 | x"msdos"*) | |
866 | IFILE="éàèüöäëñ.éàè" | |
867 | ;; | |
868 | # FS LIMITATION: iso9660 is ASCII-only. | |
869 | x"iso9660") | |
870 | IFILE="abcdefghijkmmnop" | |
871 | ;; | |
872 | # OS LIMITATION: Linux doesn't handle out-of-BMP characters for UTF-16 | |
873 | # OS LIMITATION: xorriso doesn't handle out-of-BMP characters | |
874 | xjoliet | xjoliet_1999 | x"vfat"* | x"jfs"* | x"udf"*) | |
875 | IFILE="éàèüöäëñкирилица䏌䐓䏕Ελληνικά䏌䐓䏕" | |
876 | ISYM="Ελληνικάкирилица䏌䐓䏕éàèüöäëñ䏌䐓䏕";; | |
877 | *) | |
878 | IFILE="éàèüöäëñкирилица莭莽茝Ελληνικά😁😜😒" | |
879 | ISYM="Ελληνικάкирилица😁😜😒éàèüöäëñ莭莽茝";; | |
880 | esac | |
881 | BIGFILE="big.img" | |
882 | BASESYM="sym" | |
883 | BASEHARD="hard" | |
884 | SSYM="///sdir////ssym" | |
885 | USYM="///sdir////usym" | |
886 | LONGSYM="longsym" | |
887 | PSYM="psym" | |
888 | OSDIR="" | |
889 | GRUBDEVICE=loop0 | |
890 | case x"$fs" in | |
891 | xmdraid*) | |
892 | GRUBDEVICE="mduuid/`mdadm --detail --export $MOUNTDEVICE | grep MD_UUID=|sed 's,MD_UUID=,,g;s,:,,g'`";; | |
893 | xlvm*) | |
894 | GRUBDEVICE="lvm/grub_test-testvol";; | |
895 | esac | |
896 | GRUBDIR="($GRUBDEVICE)" | |
897 | case x"$fs" in | |
898 | x"zfs"*) | |
899 | OSDIR="grub fs/" | |
900 | GRUBDIR="($GRUBDEVICE)/grub fs@";; | |
901 | x"tarfs" | x"cpio_"* | x"iso9660" | xjoliet | xrockridge | xrockridge_joliet | x"iso9660_1999" | xjoliet_1999 | xrockridge_1999 | xrockridge_joliet_1999 | x"ziso9660" | x"romfs" | x"squash4_"* | xafs) | |
902 | ;; | |
903 | *) | |
904 | if ! mount -t "$MOUNTFS" "${MOUNTDEVICE}" "$MNTPOINTRW" -o ${MOUNTOPTS}${SELINUXOPTS}rw ; then | |
905 | echo "MOUNT FAILED." | |
37865c2c VS |
906 | for lodev in $LODEVICES; do |
907 | while ! losetup -d "$lodev"; do | |
7d44ff7d VS |
908 | sleep 1 |
909 | done | |
37865c2c VS |
910 | done |
911 | for i in $(range 0 $((NDEVICES-1)) 1); do | |
912 | rm "$FSIMAGEP${i}.img" | |
7d44ff7d VS |
913 | done |
914 | exit 1; | |
915 | fi | |
916 | ;; | |
917 | esac | |
918 | case x"$fs" in | |
919 | # FS LIMITATION: redundant storage | |
920 | xmdraid* | xlvm*) | |
921 | BLOCKCNT=1048576;; | |
922 | x"zfs_raid"* | x"zfs_stripe"* | x"zfs_mirror"* | x"btrfs_raid"*) | |
923 | BLOCKCNT=1048576;; | |
924 | ||
925 | # FS LIMITATION: small filesystems | |
926 | x"vfat16a" | x"msdos16a") | |
927 | BLOCKCNT=65536;; | |
928 | x"vfat12a" | xmsdos12a) | |
929 | BLOCKCNT=32768;; | |
930 | xminix) | |
931 | BLOCKCNT=2621440;; | |
932 | xvfat16 | xmsdos16) | |
933 | if [ $BLKSIZE = 512 ] || [ $BLKSIZE = 1024 ]; then | |
934 | BLOCKCNT=1048576 | |
935 | else | |
936 | BLOCKCNT=5242880 | |
937 | fi | |
938 | ;; | |
939 | xvfat12 | xmsdos12) | |
940 | BLOCKCNT=$((100*BLKSIZE)) | |
941 | if [ $BLOCKCNT -gt 5242880 ]; then | |
942 | BLOCKCNT=5242880; | |
943 | fi | |
944 | ;; | |
945 | *) | |
946 | BLOCKCNT=5242880;; | |
947 | esac | |
f34ed1f5 AB |
948 | # Make sure file is not exact multiple of block size. This helps to force |
949 | # tail packing in case of squash4. | |
950 | : $((BLOCKCNT--)) | |
7d44ff7d VS |
951 | case x"$fs" in |
952 | x"ntfscomp") | |
953 | setfattr -h -v 0x00000800 -n system.ntfs_attrib_be "$MNTPOINTRW/$OSDIR";; | |
954 | esac | |
955 | # OS LIMITATION: No AFS support under GNU/Linux | |
956 | mkdir "$MNTPOINTRW/$OSDIR/sdir" | |
957 | mkdir -p "$MNTPOINTRW/$OSDIR/$PDIR" | |
958 | "@builddir@"/garbage-gen $BLOCKCNT > "$MNTPOINTRW/$OSDIR/sdir/2.img" | |
959 | "@builddir@"/garbage-gen $BLOCKCNT > "$MNTPOINTRW/$OSDIR/$BASEFILE" | |
960 | "@builddir@"/garbage-gen $BLOCKCNT > "$MNTPOINTRW/$OSDIR/$NASTYFILE" | |
961 | "@builddir@"/garbage-gen $BLOCKCNT > "$MNTPOINTRW/$OSDIR/$IFILE" | |
962 | "@builddir@"/garbage-gen $BLOCKCNT > "$MNTPOINTRW/$OSDIR/$LONGNAME" | |
963 | "@builddir@"/garbage-gen $BLOCKCNT > "$MNTPOINTRW/$OSDIR/$PDIR/$PFIL" | |
964 | if [ $PDIR != $PDIR2 ]; then | |
965 | "@builddir@"/garbage-gen $BLOCKCNT > "$MNTPOINTRW/$OSDIR/${PDIR2}/$PFIL" | |
966 | fi | |
967 | "@builddir@"/garbage-gen $BLOCKCNT > "$MNTPOINTRW/$OSDIR/CaSe" | |
968 | if [ x$CASESENS = xy ]; then | |
969 | "@builddir@"/garbage-gen $BLOCKCNT > "$MNTPOINTRW/$OSDIR/cAsE" | |
970 | fi | |
971 | if (test x$fs = xvfat12a || test x$fs = xmsdos12a) && test x$BLKSIZE = x131072; then | |
972 | # With this config there isn't enough space for full copy. | |
973 | # Copy as much as we can | |
37865c2c | 974 | cp "${CFILESRC}" "$MNTPOINTRW/$OSDIR/${CFILE}" &> /dev/null; |
7d44ff7d | 975 | else |
37865c2c VS |
976 | |
977 | cp "${CFILESRC}" "$MNTPOINTRW/$OSDIR/${CFILE}"; | |
978 | ||
7d44ff7d VS |
979 | fi |
980 | ||
981 | if [ x$NOSYMLINK != xy ]; then | |
982 | ln -s "$BASEFILE" "$MNTPOINTRW/$OSDIR/$BASESYM" | |
983 | ln -s "2.img" "$MNTPOINTRW/$OSDIR/$SSYM" | |
984 | ln -s "../1.img" "$MNTPOINTRW/$OSDIR/$USYM" | |
985 | ln -s "$LONGNAME" "$MNTPOINTRW/$OSDIR/$LONGSYM" | |
986 | ln -s "${PDIR2}/$PFIL" "$MNTPOINTRW/$OSDIR/$PSYM" | |
987 | ln -s "$IFILE" "$MNTPOINTRW/$OSDIR/$ISYM" | |
988 | fi | |
989 | if [ x$NOHARDLINK != xy ]; then | |
990 | ln "$MNTPOINTRW/$OSDIR/$BASEFILE" "$MNTPOINTRW/$OSDIR/$BASEHARD" | |
991 | fi | |
992 | ||
993 | case x"$fs" in | |
994 | x"afs") | |
995 | ;; | |
996 | x"zfs"*) | |
997 | while ! zpool export "$FSLABEL" ; do | |
998 | sleep 1; | |
999 | done | |
1000 | sleep 2 | |
1001 | ;; | |
1002 | x"tarfs") | |
37865c2c | 1003 | (cd "$MASTER"; tar cf "${FSIMAGEP}0.img" .) ;; |
7d44ff7d | 1004 | x"cpio_"*) |
37865c2c | 1005 | (cd "$MASTER"; find . | cpio -o -H "$(echo ${fs} | sed 's@^cpio_@@')" > "${FSIMAGEP}0.img" ) ;; |
7d44ff7d VS |
1006 | x"ziso9660") |
1007 | FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00); | |
37865c2c | 1008 | xorriso -compliance rec_mtime -set_filter_r --zisofs -- -zisofs default -as mkisofs -iso-level 3 -graft-points -R -J -joliet-long -V "$FSLABEL" --modification-date=$(echo ${FSUUID} | sed 's/-//g;') -o "${FSIMAGEP}0.img" -- -set_filter_r --zisofs -- -zisofs default -add /="$MASTER" ;; |
7d44ff7d VS |
1009 | x"iso9660") |
1010 | FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00); | |
37865c2c | 1011 | xorriso --rockridge off -compliance rec_mtime -as mkisofs -iso-level 3 -graft-points -V "$FSLABEL" --modification-date=$(echo ${FSUUID} | sed 's/-//g;') -o "${FSIMAGEP}0.img" /="$MASTER" ;; |
7d44ff7d VS |
1012 | x"joliet") |
1013 | FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00); | |
37865c2c | 1014 | xorriso --rockridge off -compliance rec_mtime -as mkisofs -iso-level 3 -graft-points -J -joliet-long -V "$FSLABEL" --modification-date=$(echo ${FSUUID} | sed 's/-//g;') -o "${FSIMAGEP}0.img" /="$MASTER" ;; |
7d44ff7d VS |
1015 | x"rockridge") |
1016 | FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00); | |
37865c2c | 1017 | xorriso --rockridge on -compliance rec_mtime -as mkisofs -iso-level 3 -graft-points -V "$FSLABEL" --modification-date=$(echo ${FSUUID} | sed 's/-//g;') -o "${FSIMAGEP}0.img" /="$MASTER" ;; |
7d44ff7d VS |
1018 | x"rockridge_joliet") |
1019 | FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00); | |
37865c2c | 1020 | xorriso --rockridge on -compliance rec_mtime -as mkisofs -iso-level 3 -graft-points -J -joliet-long -V "$FSLABEL" --modification-date=$(echo ${FSUUID} | sed 's/-//g;') -o "${FSIMAGEP}0.img" /="$MASTER" ;; |
7d44ff7d VS |
1021 | x"iso9660_1999") |
1022 | FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00); | |
37865c2c | 1023 | xorriso --rockridge off -compliance rec_mtime -as mkisofs -iso-level 4 -graft-points -V "$FSLABEL" --modification-date=$(echo ${FSUUID} | sed 's/-//g;') -o "${FSIMAGEP}0.img" /="$MASTER" ;; |
7d44ff7d VS |
1024 | x"joliet_1999") |
1025 | FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00); | |
37865c2c | 1026 | xorriso --rockridge off -compliance rec_mtime -as mkisofs -iso-level 4 -graft-points -J -joliet-long -V "$FSLABEL" --modification-date=$(echo ${FSUUID} | sed 's/-//g;') -o "${FSIMAGEP}0.img" /="$MASTER" ;; |
7d44ff7d VS |
1027 | x"rockridge_1999") |
1028 | FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00); | |
37865c2c | 1029 | xorriso --rockridge on -compliance rec_mtime -as mkisofs -iso-level 4 -graft-points -V "$FSLABEL" --modification-date=$(echo ${FSUUID} | sed 's/-//g;') -o "${FSIMAGEP}0.img" /="$MASTER" ;; |
7d44ff7d VS |
1030 | x"rockridge_joliet_1999") |
1031 | FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00); | |
37865c2c | 1032 | xorriso --rockridge on -compliance rec_mtime -as mkisofs -iso-level 4 -graft-points -J -joliet-long -V "$FSLABEL" --modification-date=$(echo ${FSUUID} | sed 's/-//g;') -o "${FSIMAGEP}0.img" /="$MASTER" ;; |
7d44ff7d | 1033 | x"romfs") |
37865c2c | 1034 | genromfs -V "$FSLABEL" -f "${FSIMAGEP}0.img" -d "$MASTER" ;; |
7d44ff7d | 1035 | xsquash4_*) |
37865c2c VS |
1036 | echo mksquashfs "$MASTER" "${FSIMAGEP}0.img" -always-use-fragments -comp "${fs/squash4_/}" -b $BLKSIZE |
1037 | mksquashfs "$MASTER" "${FSIMAGEP}0.img" -always-use-fragments -comp "${fs/squash4_/}" -b $BLKSIZE ;; | |
7d44ff7d VS |
1038 | x"bfs") |
1039 | sleep 1 | |
1040 | fusermount -u "$MNTPOINTRW" | |
1041 | ;; | |
1042 | xlvm*) | |
1043 | sleep 1 | |
37865c2c | 1044 | for try in $(range 0 20 1); do |
7d44ff7d VS |
1045 | if umount "$MNTPOINTRW" ; then |
1046 | break; | |
1047 | fi | |
1048 | sleep 1; | |
1049 | done | |
fa07d919 | 1050 | UMOUNT_TIME=$(date -u "+%Y-%m-%d %H:%M:%S") |
7d44ff7d VS |
1051 | sleep 1 |
1052 | vgchange -a n grub_test | |
1053 | ;; | |
1054 | xmdraid*) | |
1055 | sleep 1 | |
37865c2c | 1056 | for try in $(range 0 20 1); do |
7d44ff7d VS |
1057 | if umount "$MNTPOINTRW" ; then |
1058 | break; | |
1059 | fi | |
1060 | sleep 1; | |
1061 | done | |
fa07d919 | 1062 | UMOUNT_TIME=$(date -u "+%Y-%m-%d %H:%M:%S") |
7d44ff7d VS |
1063 | sleep 1 |
1064 | mdadm --stop /dev/md/"${fs}_$NDEVICES" | |
1065 | ;; | |
1066 | *) | |
1067 | sleep 1 | |
37865c2c | 1068 | for try in $(range 0 20 1); do |
7d44ff7d VS |
1069 | if umount "$MNTPOINTRW" ; then |
1070 | break; | |
1071 | fi | |
1072 | sleep 1; | |
1073 | done | |
1074 | ;; | |
1075 | esac | |
1076 | sleep 1 | |
1077 | ||
1078 | case x"$fs" in | |
1079 | x"zfs"*) | |
1080 | "zpool" import -d /dev -R "$MNTPOINTRO" "$FSLABEL" | |
1081 | ;; | |
1082 | x"tarfs") | |
1083 | ;; | |
1084 | x"cpio_"*) | |
1085 | ;; | |
1086 | x"ziso9660") | |
1087 | ;; | |
1088 | xiso9660 | xrockridge | xjoliet | xrockridge_joliet) | |
1089 | ;; | |
1090 | xiso9660_1999 | xrockridge_1999 | xjoliet_1999 | xrockridge_joliet_1999) | |
1091 | ;; | |
1092 | x"romfs") | |
1093 | ;; | |
1094 | xsquash4_*) | |
1095 | ;; | |
1096 | xlvm*) | |
1097 | vgchange -a y grub_test | |
1098 | sleep 1 | |
1099 | mount -t "$MOUNTFS" "${MOUNTDEVICE}" "$MNTPOINTRO" -o ${MOUNTOPTS}${SELINUXOPTS}ro ;; | |
1100 | xmdraid*) | |
37865c2c | 1101 | mdadm --assemble /dev/md/"${fs}_$NDEVICES" $LODEVICES |
7d44ff7d VS |
1102 | sleep 1 |
1103 | mount -t "$MOUNTFS" "${MOUNTDEVICE}" "$MNTPOINTRO" -o ${MOUNTOPTS}${SELINUXOPTS}ro ;; | |
1104 | *) | |
1105 | mount -t "$MOUNTFS" "${MOUNTDEVICE}" "$MNTPOINTRO" -o ${MOUNTOPTS}${SELINUXOPTS}ro ;; | |
1106 | esac | |
1107 | ||
1108 | run_grubfstest ls -- -la | |
1109 | case x"$fs" in | |
1110 | x"zfs"*) | |
1111 | LSROUT=$(run_grubfstest ls -- -la "($GRUBDEVICE)/grub fs@/");; | |
1112 | *) | |
1113 | LSROUT=$(run_grubfstest ls -- -la "($GRUBDEVICE)/");; | |
1114 | esac | |
1115 | if echo "$LSROUT" | grep -F " $BASEFILE" | grep "$BLOCKCNT" > /dev/null; then | |
1116 | : | |
1117 | else | |
1118 | echo LIST FAIL | |
1119 | echo "$LSROUT" | |
37865c2c | 1120 | TZ=UTC ls -l "$MNTPOINTRO" |
7d44ff7d VS |
1121 | exit 1 |
1122 | fi | |
1123 | ||
1124 | if echo "$LSROUT" | grep -F " $NASTYFILE" | grep "$BLOCKCNT"> /dev/null; then | |
1125 | : | |
1126 | else | |
1127 | echo NLIST FAIL | |
e2dd6daa | 1128 | echo "$LSROUT" |
37865c2c | 1129 | TZ=UTC ls -lA "$MNTPOINTRO" |
7d44ff7d VS |
1130 | exit 1 |
1131 | fi | |
1132 | ||
1133 | if echo "$LSROUT" | grep -F " $IFILE" | grep "$BLOCKCNT"> /dev/null; then | |
1134 | : | |
1135 | else | |
1136 | echo ILIST FAIL | |
1137 | echo "$LSROUT" | |
37865c2c | 1138 | TZ=UTC ls -l "$MNTPOINTRO" |
7d44ff7d VS |
1139 | exit 1 |
1140 | fi | |
1141 | ||
1142 | if echo "$LSROUT" | grep -F " $LONGNAME" | grep "$BLOCKCNT"> /dev/null; then | |
1143 | : | |
1144 | else | |
1145 | echo LONG LIST FAIL | |
e2dd6daa | 1146 | echo "$LSROUT" |
37865c2c | 1147 | TZ=UTC ls -l "$MNTPOINTRO" |
7d44ff7d VS |
1148 | exit 1 |
1149 | fi | |
1150 | ||
1151 | if [ x$NOFILETIME != xy ]; then | |
1152 | filtime=$(TZ=UTC ls --time-style=+%Y%m%d%H%M%S -l -d "$MNTPOINTRO/$OSDIR/$BASEFILE"|awk '{print $6; }') | |
1153 | if echo "$LSROUT" | grep -F "$filtime $BASEFILE" > /dev/null; then | |
1154 | : | |
1155 | else | |
1156 | echo TIME FAIL | |
1157 | echo "$LSROUT" | |
37865c2c | 1158 | TZ=UTC ls -l "$MNTPOINTRO" |
7d44ff7d VS |
1159 | exit 1 |
1160 | fi | |
1161 | ||
1162 | filtime=$(TZ=UTC ls --time-style=+%Y%m%d%H%M%S -l -d "$MNTPOINTRO/$OSDIR/$LONGNAME"|awk '{print $6; }') | |
1163 | if echo "$LSROUT" | grep -F "$filtime $LONGNAME" > /dev/null; then | |
1164 | : | |
1165 | else | |
1166 | echo LONG TIME FAIL | |
1167 | echo "$LSROUT" | |
37865c2c | 1168 | TZ=UTC ls -l "$MNTPOINTRO" |
7d44ff7d VS |
1169 | exit 1 |
1170 | fi | |
1171 | fi | |
1172 | ||
7af839a1 AB |
1173 | case x"$fs" in |
1174 | x"zfs"*) | |
1175 | LSROUT=$(run_grubfstest ls -- -la "($GRUBDEVICE)/grub fs@/.");; | |
1176 | *) | |
1177 | LSROUT=$(run_grubfstest ls -- -la "($GRUBDEVICE)/.");; | |
1178 | esac | |
1179 | if echo "$LSROUT" | grep -F " $BASEFILE" | grep "$BLOCKCNT" > /dev/null; then | |
1180 | : | |
1181 | else | |
1182 | echo DOT IN ROOTDIR FAIL | |
1183 | echo "$LSROUT" | |
37865c2c | 1184 | TZ=UTC ls -l "$MNTPOINTRO" |
7af839a1 AB |
1185 | exit 1 |
1186 | fi | |
1187 | ||
1188 | case x"$fs" in | |
1189 | x"zfs"*) | |
333855c6 | 1190 | ;; |
7af839a1 | 1191 | *) |
333855c6 VS |
1192 | LSROUT=$(run_grubfstest ls -- -la "($GRUBDEVICE)/.."); |
1193 | if echo "$LSROUT" | grep -F " $BASEFILE" | grep "$BLOCKCNT" > /dev/null; then | |
1194 | : | |
1195 | else | |
1196 | echo DOTDOT IN ROOTDIR FAIL | |
1197 | echo "$LSROUT" | |
37865c2c | 1198 | TZ=UTC ls -l "$MNTPOINTRO" |
333855c6 VS |
1199 | exit 1 |
1200 | fi | |
1201 | ;; | |
7af839a1 | 1202 | esac |
7af839a1 | 1203 | |
7d44ff7d VS |
1204 | case x"$fs" in |
1205 | x"zfs"*) | |
1206 | LSROUT=$(run_grubfstest ls -- -l "($GRUBDEVICE)/grub fs@/////sdir");; | |
1207 | *) | |
1208 | LSROUT=$(run_grubfstest ls -- -l "($GRUBDEVICE)/////sdir");; | |
1209 | esac | |
1210 | if echo "$LSROUT" | grep -F " 2.img" | grep $BLOCKCNT > /dev/null; then | |
1211 | : | |
1212 | else | |
1213 | echo SLIST FAIL | |
1214 | echo "$LSROUT" | |
37865c2c | 1215 | TZ=UTC ls -l "$MNTPOINTRO/sdir" |
7d44ff7d VS |
1216 | exit 1 |
1217 | fi | |
1218 | ||
1219 | case x"$fs" in | |
1220 | x"zfs"*) | |
1221 | LSROUT=$(run_grubfstest ls -- -l "($GRUBDEVICE)/grub fs@/$PDIR");; | |
1222 | *) | |
1223 | LSROUT=$(run_grubfstest ls -- -l "($GRUBDEVICE)/$PDIR");; | |
1224 | esac | |
1225 | if echo "$LSROUT" | grep -F " p.img" | grep $BLOCKCNT > /dev/null; then | |
1226 | : | |
1227 | else | |
1228 | echo PLIST FAIL | |
1229 | echo "$LSROUT" | |
37865c2c | 1230 | TZ=UTC ls -l "$MNTPOINTRO/$PDIR" |
7d44ff7d VS |
1231 | exit 1 |
1232 | fi | |
1233 | ||
7af839a1 AB |
1234 | case x"$fs" in |
1235 | x"zfs"*) | |
1236 | LSROUT=$(run_grubfstest ls -- -l "($GRUBDEVICE)/grub fs@/sdir/.");; | |
1237 | *) | |
1238 | LSROUT=$(run_grubfstest ls -- -l "($GRUBDEVICE)/sdir/.");; | |
1239 | esac | |
1240 | if echo "$LSROUT" | grep -F " 2.img" | grep $BLOCKCNT > /dev/null; then | |
1241 | : | |
1242 | else | |
1243 | echo DOT IN SUBDIR FAIL | |
1244 | echo "$LSROUT" | |
37865c2c | 1245 | TZ=UTC ls -l "$MNTPOINTRO/$OSDIR/sdir" |
7af839a1 AB |
1246 | exit 1 |
1247 | fi | |
1248 | ||
1249 | case x"$fs" in | |
1250 | x"zfs"*) | |
1251 | LSROUT=$(run_grubfstest ls -- -l "($GRUBDEVICE)/grub fs@/sdir/../sdir");; | |
1252 | *) | |
1253 | LSROUT=$(run_grubfstest ls -- -l "($GRUBDEVICE)/sdir/../sdir");; | |
1254 | esac | |
1255 | if echo "$LSROUT" | grep -F " 2.img" | grep $BLOCKCNT > /dev/null; then | |
1256 | : | |
1257 | else | |
1258 | echo DOTDOT IN SUBDIR FAIL | |
1259 | echo "$LSROUT" | |
37865c2c | 1260 | TZ=UTC ls -l "$MNTPOINTRO/$OSDIR/ssdir" |
7af839a1 AB |
1261 | exit 1 |
1262 | fi | |
1263 | ||
7d44ff7d VS |
1264 | LSOUT=`run_grubfstest ls -- -l "($GRUBDEVICE)"` |
1265 | if [ x"$NOFSLABEL" = xy ]; then | |
1266 | : | |
1267 | elif echo "$LSOUT" | grep -F "Label \`$FSLABEL'" > /dev/null; then | |
1268 | : | |
1269 | else | |
1270 | echo LABEL FAIL | |
1271 | echo "$LSOUT" | |
1272 | blkid "${MOUNTDEVICE}" | |
1273 | exit 1 | |
1274 | fi | |
1275 | ||
1276 | # Inconsistencies between GRUB and blkid. | |
1277 | case x"$fs" in | |
1278 | x"iso9660" | x"ziso9660" | xrockridge | xjoliet | xrockridge_joliet | x"iso9660_1999" | xrockridge_1999 | xjoliet_1999 | xrockridge_joliet_1999) ;; | |
1279 | x"zfs"*) | |
37865c2c VS |
1280 | for lodev in $LODEVICES; do |
1281 | FSUUID=$(printf "%016x\n" $(blkid -o export "$lodev" |grep -F UUID=|sed s,UUID=,,g)) | |
7d44ff7d VS |
1282 | if [ "$FSUUID" != 0000000000000000 ]; then |
1283 | break; | |
1284 | fi | |
1285 | done;; | |
1286 | *) | |
1287 | FSUUID=`blkid -o export "${MOUNTDEVICE}" |grep -F UUID=|sed s,UUID=,,g` | |
1288 | ;; | |
1289 | esac | |
1290 | case x"$fs" in | |
1291 | x"hfs"*) | |
1292 | GRUBUUID="`run_grubfstest xnu_uuid "$GRUBDEVICE"`" | |
1293 | if [ x"$GRUBUUID" = x"$FSUUID" ]; then | |
1294 | : | |
1295 | else | |
1296 | echo UUID FAIL | |
1297 | echo "$LSOUT" | |
1298 | echo "$GRUBUUID" | |
37865c2c VS |
1299 | for lodev in $LODEVICES; do |
1300 | blkid "$lodev" | |
7d44ff7d VS |
1301 | done |
1302 | exit 1 | |
1303 | fi | |
1304 | ;; | |
1305 | # FS LIMITATION: romfs, cpio, tar, squash4, minix, AFS, old reiserfs and minix2 | |
1306 | # have no UUID. | |
1307 | # GRUB LIMITATION: use creation date for squash4, AFFS and SFS? | |
1308 | # GRUB LIMITATION: use tags serials on UDF? | |
1309 | # GRUB LIMITATION: use root ctime on cpio, tar, minix*, UDF, reiserfs_old? | |
1310 | # GRUB LIMITATION: Support Atari UUIDs | |
1311 | x"romfs" | x"cpio_"* | x"tarfs" | x"squash4_"* | x"minix" \ | |
1312 | | x"minix2" | x"minix3" | x"affs" | xaffs_intl \ | |
1313 | | x"udf" | xvfat12a | xvfat16a | xmsdos12a | xmsdos16a | xafs | xsfs* \ | |
1314 | | xreiserfs_old) | |
1315 | ;; | |
1316 | *) | |
1317 | if [ x"$FSUUID" = x ]; then | |
1318 | echo "Warning: blkid couldn't retrieve UUID" | |
1319 | elif echo "$LSOUT" | grep -F 'UUID '"$FSUUID"' ' > /dev/null; then | |
1320 | : | |
1321 | else | |
1322 | echo UUID FAIL | |
1323 | echo "$FSUUID" | |
1324 | echo "$LSOUT" | |
37865c2c | 1325 | blkid "${MOUNTDEVICE}" |
7d44ff7d VS |
1326 | exit 1 |
1327 | fi | |
1328 | ;; | |
1329 | esac | |
1330 | ||
6dec3a26 VS |
1331 | if [ x$NOFSTIME != xy ]; then |
1332 | case x$fs in | |
1333 | xiso9660 | xziso9660 | xrockridge | xjoliet | xrockridge_joliet | xiso9660_1999 | xrockridge_1999 | xjoliet_1999 | xrockridge_joliet_1999) | |
1334 | FSTIME="$(date -d "$(echo ${FSUUID} | awk -F - '{ print $1"-"$2"-"$3" "$4":"$5":"$6 ;}')" '+%Y-%m-%d %H:%M:%S')";; | |
1335 | xlvm*|xmdraid*) | |
1336 | # With some abstractions like mdraid flushing to disk | |
1337 | # may be delayed for a long time. | |
1338 | FSTIME="$UMOUNT_TIME";; | |
1339 | *) | |
1340 | FSTIME="$(TZ=UTC ls --time-style="+%Y-%m-%d_%H:%M:%S" -l -d "${FSIMAGEP}0.img"|awk '{print $6; }'|sed 's,_, ,g')";; | |
1341 | esac | |
1342 | # With some abstractions like mdraid computing of UMOUNT_TIME | |
1343 | # is not precise. Account for small difference here. | |
1344 | FSTIMEM1="$(date -d "$FSTIME UTC -1 second" -u "+%Y-%m-%d %H:%M:%S")" | |
1345 | FSTIMEM2="$(date -d "$FSTIME UTC -2 second" -u "+%Y-%m-%d %H:%M:%S")" | |
1346 | FSTIMEM3="$(date -d "$FSTIME UTC -3 second" -u "+%Y-%m-%d %H:%M:%S")" | |
7d44ff7d | 1347 | |
6dec3a26 VS |
1348 | if echo "$LSOUT" | grep -F 'Last modification time '"$FSTIME" > /dev/null || echo "$LSOUT" | grep -F 'Last modification time '"$FSTIMEM1" > /dev/null || echo "$LSOUT" | grep -F 'Last modification time '"$FSTIMEM2" || echo "$LSOUT" | grep -F 'Last modification time '"$FSTIMEM3" > /dev/null; then |
1349 | : | |
1350 | else | |
1351 | echo FSTIME FAIL | |
1352 | echo "$FSTIME" | |
1353 | echo "$LSOUT" | |
1354 | exit 1 | |
1355 | fi | |
7d44ff7d VS |
1356 | fi |
1357 | ||
1358 | if [ x$NOHARDLINK != xy ]; then | |
1359 | if run_grubfstest cmp "$GRUBDIR/$BASEHARD" "$MNTPOINTRO/$OSDIR/$BASEFILE" ; then | |
1360 | : | |
1361 | else | |
1362 | echo HARDLINK FAIL | |
1363 | exit 1 | |
1364 | fi | |
1365 | fi | |
1366 | ||
1367 | if [ x$NOSYMLINK != xy ]; then | |
1368 | if run_grubfstest cmp "$GRUBDIR/$BASESYM" "$MNTPOINTRO/$OSDIR/$BASEFILE" ; then | |
1369 | : | |
1370 | else | |
1371 | echo SYMLINK FAIL | |
1372 | exit 1 | |
1373 | fi | |
1374 | if run_grubfstest cmp "$GRUBDIR/$LONGSYM" "$MNTPOINTRO/$OSDIR/$LONGNAME" ; then | |
1375 | : | |
1376 | else | |
1377 | echo LONG SYMLINK FAIL | |
1378 | exit 1 | |
1379 | fi | |
1380 | if run_grubfstest cmp "$GRUBDIR/$ISYM" "$MNTPOINTRO/$OSDIR/$IFILE" ; then | |
1381 | : | |
1382 | else | |
1383 | echo INTL SYMLINK FAIL | |
1384 | exit 1 | |
1385 | fi | |
1386 | if run_grubfstest cmp "$GRUBDIR/$SSYM" "$MNTPOINTRO/$OSDIR/////sdir/////2.img" ; then | |
1387 | : | |
1388 | else | |
1389 | echo SDIR SYMLINK FAIL | |
1390 | exit 1 | |
1391 | fi | |
1392 | if run_grubfstest cmp "$GRUBDIR/$USYM" "$MNTPOINTRO/$OSDIR/1.img" ; then | |
1393 | : | |
1394 | else | |
1395 | echo SDIR SYMLINK FAIL | |
1396 | exit 1 | |
1397 | fi | |
1398 | if run_grubfstest cmp "$GRUBDIR/$PSYM" "$MNTPOINTRO/$OSDIR/${PDIR2}/$PFIL" ; then | |
1399 | : | |
1400 | else | |
1401 | echo PATH LONG SYMLINK FAIL | |
1402 | exit 1 | |
1403 | fi | |
1404 | fi | |
1405 | ||
1406 | if run_grubfstest cmp "$GRUBDIR/$BASEFILE" "$MNTPOINTRO/$OSDIR/$BASEFILE" ; then | |
1407 | : | |
1408 | else | |
1409 | echo READ FAIL | |
1410 | exit 1 | |
1411 | fi | |
1412 | if run_grubfstest cmp "$GRUBDIR/$NASTYFILE" "$MNTPOINTRO/$OSDIR/$NASTYFILE" ; then | |
1413 | : | |
1414 | else | |
1415 | echo NREAD FAIL | |
1416 | exit 1 | |
1417 | fi | |
1418 | # Reference archive contains original name | |
1419 | if run_grubfstest cmp "$GRUBDIR/$LONGNAME" "$MNTPOINTRO/$OSDIR/$LONGNAME" ; then | |
1420 | : | |
1421 | else | |
1422 | echo LONG NAME READ FAIL | |
1423 | exit 1 | |
1424 | fi | |
1425 | if run_grubfstest cmp "$GRUBDIR/////sdir/////2.img" "$MNTPOINTRO/$OSDIR/sdir/2.img" ; then | |
1426 | : | |
1427 | else | |
1428 | echo LONG NAME READ FAIL | |
1429 | exit 1 | |
1430 | fi | |
1431 | if run_grubfstest cmp "$GRUBDIR/$IFILE" "$MNTPOINTRO/$OSDIR/$IFILE" ; then | |
1432 | : | |
1433 | else | |
1434 | echo IREAD FAIL | |
1435 | exit 1 | |
1436 | fi | |
1437 | if run_grubfstest cmp "$GRUBDIR/$PDIR/$PFIL" "$MNTPOINTRO/$OSDIR/$PDIR/$PFIL" ; then | |
1438 | : | |
1439 | else | |
1440 | echo PREAD FAIL | |
1441 | echo cmp "$GRUBDIR/$PDIR/$PFIL" "$MNTPOINTRO/$OSDIR/$PDIR/$PFIL" | |
1442 | exit 1 | |
1443 | fi | |
1444 | ok=true | |
37865c2c VS |
1445 | if ! run_grubfstest cmp "$GRUBDIR/${CFILE}" "$MNTPOINTRO/$OSDIR/${CFILE}" ; then |
1446 | ok=false; | |
1447 | fi | |
7d44ff7d VS |
1448 | if test x$ok = xtrue; then |
1449 | : | |
1450 | else | |
1451 | echo CREAD FAIL | |
1452 | exit 1 | |
1453 | fi | |
1454 | ||
1455 | if [ x$CASESENS = xy ]; then | |
1456 | if run_grubfstest cmp "$GRUBDIR/CaSe" "$MNTPOINTRO/$OSDIR/CaSe" ; then | |
1457 | : | |
1458 | else | |
1459 | echo CASE1 READ FAIL | |
1460 | exit 1 | |
1461 | fi | |
1462 | if run_grubfstest cmp "$GRUBDIR/cAsE" "$MNTPOINTRO/$OSDIR/cAsE" ; then | |
1463 | : | |
1464 | else | |
1465 | exit 1 | |
1466 | fi | |
1467 | if cmp "$MNTPOINTRO/$OSDIR/cAsE" "$MNTPOINTRO/$OSDIR/CaSe" > /dev/null ; then | |
1468 | exit 1 | |
1469 | fi | |
1470 | if test x$ok = xtrue; then | |
1471 | : | |
1472 | else | |
1473 | echo CASE READ FAIL | |
1474 | exit 1 | |
1475 | fi | |
1476 | else | |
1477 | # OS LIMITATION: Linux make FAT (partially) case-sensitive... | |
1478 | # ISO9660 is generated and master doesn't change | |
1479 | case x$fs in | |
1480 | xiso9660 | xvfat*) | |
1481 | CASEX=CaSe;; | |
1482 | *) | |
1483 | CASEX=cAsE;; | |
1484 | esac | |
1485 | if run_grubfstest cmp "$GRUBDIR/CaSe" "$MNTPOINTRO/$OSDIR/${CASEX}" ; then | |
1486 | : | |
1487 | else | |
1488 | echo CASE1 READ FAIL | |
1489 | exit 1 | |
1490 | fi | |
1491 | if run_grubfstest cmp "$GRUBDIR/cAsE" "$MNTPOINTRO/$OSDIR/CaSe" ; then | |
1492 | : | |
1493 | else | |
1494 | echo CASE2 READ FAIL | |
1495 | exit 1 | |
1496 | fi | |
1497 | if ! cmp "$MNTPOINTRO/$OSDIR/CaSe" "$MNTPOINTRO/$OSDIR/${CASEX}" > /dev/null ; then | |
1498 | echo CASE CMP READ FAIL | |
1499 | exit 1 | |
1500 | fi | |
1501 | if test x$ok = xtrue; then | |
1502 | : | |
1503 | else | |
1504 | echo CASE READ FAIL | |
1505 | exit 1 | |
1506 | fi | |
1507 | fi | |
1508 | ||
1509 | case x"$fs" in | |
1510 | x"zfs"*) | |
1511 | while ! zpool export "$FSLABEL" ; do | |
1512 | sleep 1; | |
1513 | done | |
1514 | sleep 5;; | |
1515 | x"tarfs" | x"cpio_"* | xrockridge | xjoliet | xrockridge_joliet | x"ziso9660" | x"romfs" | x"squash4_"* | xiso9660 | xiso9660_1999 | xrockridge_1999 | xjoliet_1999 | xrockridge_joliet_1999) | |
1516 | rm -rf "$MNTPOINTRW";; | |
1517 | x"afs") | |
1518 | rm -rf "$MNTPOINTRO" | |
1519 | ;; | |
1520 | *) | |
1521 | sleep 1 | |
1522 | umount "$MNTPOINTRO" || true | |
1523 | umount "$MNTPOINTRW" || true | |
1524 | esac | |
1525 | sleep 1 | |
1526 | case x"$fs" in | |
1527 | xmdraid*) | |
1528 | mdadm --stop /dev/md/"${fs}_$NDEVICES" | |
1529 | sleep 1 | |
1530 | ;; | |
1531 | xlvm*) | |
1532 | vgchange -a n grub_test | |
1533 | sleep 1 | |
1534 | ;; | |
1535 | esac | |
37865c2c VS |
1536 | case x"$fs" in |
1537 | x"tarfs" | x"cpio_"* | x"iso9660" | xrockridge | xjoliet | xrockridge_joliet | x"ziso9660" | x"romfs" | x"squash4_"* | x"iso9660_1999" | xrockridge_1999 | xjoliet_1999 | xrockridge_joliet_1999) ;; | |
1538 | *) | |
1539 | for lodev in $LODEVICES; do | |
1540 | while ! losetup -d "$lodev"; do | |
7d44ff7d | 1541 | sleep 1 |
37865c2c VS |
1542 | done |
1543 | done;; | |
1544 | esac | |
1545 | for i in $(range 0 $((NDEVICES-1)) 1); do | |
1546 | rm "$FSIMAGEP${i}.img" | |
7d44ff7d VS |
1547 | done |
1548 | if [ x"$fs" = x"zfs" ]; then | |
1549 | rmdir "$MNTPOINTRW"/"grub fs" || true | |
1550 | rmdir "$MNTPOINTRO"/"grub fs" || true | |
1551 | fi | |
1552 | rm -rf "$MNTPOINTRW" || true | |
1553 | rm -rf "$MNTPOINTRO" || true | |
1554 | done | |
1555 | done | |
1556 | done | |
afa9dda3 | 1557 | rmdir "${tempdir}" |