]> git.proxmox.com Git - grub2.git/blame - tests/util/grub-fs-tester.in
Don't retrieve fstime when it's not useful.
[grub2.git] / tests / util / grub-fs-tester.in
CommitLineData
37865c2c 1#!/bin/sh
7d44ff7d
VS
2
3set -e
4
5fs="$1"
6
7GRUBFSTEST="@builddir@/grub-fstest"
8
9tempdir=`mktemp -d "${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` || exit 1
10
11# This wrapper is to ease insertion of valgrind or time statistics
12run_it () {
4656ced4 13 LC_ALL=C "$GRUBFSTEST" "$@"
7d44ff7d
VS
14}
15
37865c2c
VS
16range() {
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
24powrange() {
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 32run_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
43MINLOGSECSIZE=9
44MAXLOGSECSIZE=9
45case 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;;
74esac
37865c2c 75for 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
1556done
afa9dda3 1557rmdir "${tempdir}"