88cbe7365e92fa769002f3cf219b815640943fce
[grub.git] / tests / util / grub-fs-tester.in
1 #!@BUILD_SHEBANG@
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 () {
13     LC_ALL=C "$GRUBFSTEST" "$@"
14 }
15
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
32 run_grubfstest () {
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  "$@"
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;;
64     xxfs_crc)
65         MINLOGSECSIZE=9
66             # OS LIMITATION: GNU/Linux doesn't accept > 1024
67         MAXLOGSECSIZE=10;;
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
75 for LOGSECSIZE in $(range "$MINLOGSECSIZE" "$MAXLOGSECSIZE" 1); do
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)
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
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             ;;
133         x"lvm_raid1"* | x"lvm_raid4" | x"lvm_raid5" | x"lvm_raid6")
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;;
173         xxfs_crc)
174             # OS Limitation: GNU/Linux doesn't accept != 1024
175             MINBLKSIZE=1024
176             MAXBLKSIZE=1024;;
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
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
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" \
206                 | x"mdraid"*"_raid10" | xlvm_raid1* | xlvm_mirror1 | xlvm_mirrorall)
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
228         for NDEVICES in $(range "$MINDEVICES" "$MAXDEVICES" 1); do
229             export NDEVICES
230             unset FSIMAGEP
231             FSIMAGEP="${tempdir}/${fs}_${SECSIZE}_${BLKSIZE}_${NDEVICES}_"
232             export FSIMAGEP
233             unset NEED_IMAGES;
234
235             case x$fs in
236             # RAID 1 has to work with even one device of the set.
237                 xzfs_mirror | x"mdraid"*"_raid1" | xlvm_mirrorall | xlvm_raid1all)
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 \
248                     | x"lvm_raid1" | x"lvm_raid4" | x"lvm_raid5")
249                     NEED_IMAGES_N=$((NDEVICES-1));;
250                 *)
251                     NEED_IMAGES_N=$NDEVICES;;
252             esac
253             export NEED_IMAGES_N
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"
261             CFILESRC=
262             for cand in /usr/share/dict/american-english /usr/share/dict/linux.words /data/data/com.termux/files/usr/share/hunspell/en_US.dic; 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
271             fi
272             case x"$fs" in
273                     # FS LIMITATION: 8.3 names
274                 xmsdos*)
275                     CFILE="american.eng";;
276                 xiso9660)
277                     CFILE="american_english";;
278                 *)
279                     CFILE="american-english";;
280             esac
281         # OS LIMITATION: Limited by NAME_MAX (usually 255) in GNU/Linux
282             LONGNAME="qwertzuiopasdfghjklyxcvbnm1234567890qwertzuiopasdfghjklyxcvbnm1234567890oiewqfiewioqoiqoiurqruewqoiuwoieoiiuewqroreqiufieiuwrnureweriuvceoiroiewqoiricdsalkcndsakfirefoiwqeoircorejwoijfreoijojoiewjfwnfcoirenfoirefnreoifenoiwfnoi"
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"*)
294                     FSLABEL="grub_;/testé莭莽😁киритi urewfceniuewruevrewnuuireurevueurnievrewfnerfcnevirivinrewvnirewnivrewiuvcrewvnuewvrrrewniuerwreiuviurewiuviurewnuvewnvrenurnunuvrevuurerejiremvreijnvcreivire nverivnreivrevnureiorfnfrvoeoiroireoireoifrefoieroifoireoi";;
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
320                 x"reiserfs_old" | x"reiserfs" | x"ext"* | x"lvm"* | x"mdraid"* | x"jfs" | x"jfs_caseins")
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
326                 x"xfs"|x"xfs_crc")
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))
416                     if [ $BIGBLOCKCNT -gt 4294967295 ]; then
417                         BIGBLOCKCNT=4294967295
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*)
438                     BIGBLOCKCNT=4294967295;;
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.
504                 x"jfs_caseins" | x"jfs" | x"xfs" | x"xfs_crc" | x"btrfs"* | x"reiserfs_old" | x"reiserfs" \
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
529             PDIRCOMPNUM=210
530             PDIR2COMPNUM=210
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)
545                     PDIRCOMPNUM=84
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)
571             for i in $(range 0 $((PDIRCOMPNUM-1)) 1); do
572                 PDIR="$PDIR/$i";
573                 if test $((i%3)) = 0; then
574                     PDIR="$PDIR/"
575                 fi
576             done
577
578             PDIR2=""
579                 # OS LIMITATION: Limited by PATH_MAX (usually 1024)
580             for i in $(range 0 $((PDIR2COMPNUM-1)) 1); do
581                 PDIR2="${PDIR2}/$i";
582                 if test $((i%3)) = 0; then
583                     PDIR2="${PDIR2}/"
584                 fi
585             done
586
587             PFIL="p.img"
588
589             unset LODEVICES
590             GENERATED=n
591             LODEVICES=
592             MOUNTDEVICE=
593             
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"
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
615                     done ;;
616             esac
617
618             case x"$fs" in
619                 x"afs")
620                     ;;
621                 x"btrfs")
622                     "mkfs.btrfs" -s $SECSIZE -L "$FSLABEL" "${MOUNTDEVICE}" ;;
623                 x"btrfs_zlib" | x"btrfs_lzo")
624                     "mkfs.btrfs" -s $SECSIZE -L "$FSLABEL" "${MOUNTDEVICE}"
625                     MOUNTOPTS="compress=${fs/btrfs_/},"
626                     MOUNTFS="btrfs"
627                     ;;
628                 x"btrfs_raid0")
629                     "mkfs.btrfs" -s $SECSIZE -d raid0 -m raid0 -L "$FSLABEL" $LODEVICES
630                     MOUNTFS="btrfs"
631                     ;;
632                 x"btrfs_raid1")
633                     "mkfs.btrfs" -s $SECSIZE -d raid1 -m raid1 -L "$FSLABEL" $LODEVICES
634                     MOUNTFS="btrfs"
635                     ;;
636                 x"btrfs_raid10")
637                     "mkfs.btrfs" -s $SECSIZE -d raid10 -m raid10 -L "$FSLABEL" $LODEVICES
638                     MOUNTFS="btrfs"
639                     ;;
640                 x"btrfs_single")
641                     "mkfs.btrfs" -s $SECSIZE -d single -L "$FSLABEL" $LODEVICES
642                     MOUNTFS="btrfs"
643                     ;;
644                 x"exfat")
645                     "mkfs.$fs" -s $((BLKSIZE/512)) -n "$FSLABEL" "${MOUNTDEVICE}"
646                     MOUNTOPTS="iocharset=utf8,"
647                     MOUNTFS="exfat-fuse";;
648                 x"minix")
649                     "mkfs.minix" "${MOUNTDEVICE}"
650                     ;;
651         # mkfs.hfs and mkfs.hfsplus don't fill UUID.
652                 x"hfsplus")
653                     "mkfs.hfsplus" -b $BLKSIZE -v "$FSLABEL" "${MOUNTDEVICE}"
654                     dd if=/dev/urandom of="${MOUNTDEVICE}" bs=1 seek=$((16#468)) conv=notrunc count=8 ;;
655                 x"hfsplus_wrap")
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
658                     MOUNTFS="hfsplus";;
659                 x"hfsplus_casesens")
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
662                     MOUNTFS="hfsplus";;
663                 x"hfs")
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
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
676                     "mkfs.vfat" -a $A -S $SECSIZE -s $((BLKSIZE/SECSIZE)) -F "${BITS:0:2}" -n "$FSLABEL" "${MOUNTDEVICE}"
677                     MOUNTOPTS="iocharset=utf8,codepage=437,"
678                     MOUNTFS="$(echo "$fs"|sed 's,[0-9]*a\?$,,')";;
679                 x"minix2")
680                     "mkfs.minix" -v "${MOUNTDEVICE}"
681                     MOUNTFS="minix";;
682                 x"minix3")
683                     "mkfs.minix" -B $BLKSIZE -3 "${MOUNTDEVICE}"
684                     MOUNTFS="minix";;
685                 x"ntfs"*)
686                     "mkfs.ntfs" -s "$SECSIZE" -c "$BLKSIZE" -L "$FSLABEL" -Q -q "${MOUNTDEVICE}"
687                     MOUNTOPTS="iocharset=utf8,compression,"
688                     MOUNTFS="ntfs-3g";;
689                 x"udf")
690                     "mkudffs" --utf8 -b $BLKSIZE --lvid="$FSLABEL" "${MOUNTDEVICE}"
691                     MOUNTOPTS="iocharset=utf8,bs=$BLKSIZE,";;
692                 x"ufs2")
693                     "mkfs.ufs" -b $BLKSIZE -L "$FSLABEL" -O 2 "${MOUNTDEVICE}"
694                     MOUNTOPTS="ufstype=ufs2,"
695                     MOUNTFS="ufs";;
696                 x"ufs1")
697                     "mkfs.ufs" -b $BLKSIZE -L "$FSLABEL" -O 1 "${MOUNTDEVICE}"
698                     MOUNTOPTS="ufstype=44bsd,"
699                     MOUNTFS="ufs";;
700                 x"ufs1_sun")
701                     "mkfs.ufs" -b $BLKSIZE -L "$FSLABEL" -O 1 "${MOUNTDEVICE}"
702                     MOUNTOPTS="ufstype=sun,"
703                     MOUNTFS="ufs";;
704                 x"zfs")
705                     "zpool" create -R "$MNTPOINTRW" "$FSLABEL" "${MOUNTDEVICE}"
706                     sleep 1
707                     "zfs" create "$FSLABEL"/"grub fs"
708                     sleep 1;;
709                 x"zfs_caseins")
710                     "zpool" create -R "$MNTPOINTRW" "$FSLABEL" "${MOUNTDEVICE}"
711                     sleep 1
712                     "zfs" create -o casesensitivity=insensitive "$FSLABEL"/"grub fs"
713                     sleep 1;;
714                 x"zfs_lzjb" | xzfs_gzip | xzfs_zle)
715                     "zpool" create -O compression=${fs/zfs_/} -R "$MNTPOINTRW" "$FSLABEL" "${MOUNTDEVICE}"
716                     sleep 1
717                     "zfs" create -o compression=${fs/zfs_/} "$FSLABEL"/"grub fs"
718                     sleep 1;;
719                 x"zfs_raidz")
720                     "zpool" create -R "$MNTPOINTRW" "$FSLABEL" raidz1 $LODEVICES
721                     sleep 1
722                     "zfs" create "$FSLABEL"/"grub fs"
723                     sleep 1;;
724                 x"zfs_raidz2")
725                     "zpool" create -R "$MNTPOINTRW" "$FSLABEL" raidz2 $LODEVICES
726                     sleep 1
727                     "zfs" create "$FSLABEL"/"grub fs"
728                     sleep 1;;
729                 x"zfs_raidz3")
730                     "zpool" create -R "$MNTPOINTRW" "$FSLABEL" raidz3 $LODEVICES
731                     sleep 1
732                     "zfs" create "$FSLABEL"/"grub fs"
733                     sleep 1;;
734                 x"zfs_mirror")
735                     "zpool" create -R "$MNTPOINTRW" "$FSLABEL" mirror $LODEVICES
736                     sleep 1
737                     "zfs" create "$FSLABEL"/"grub fs"
738                     sleep 1;;
739                 x"zfs_stripe")
740                     "zpool" create -R "$MNTPOINTRW" "$FSLABEL" $LODEVICES
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")
747                     "mkfs.reiserfs" --format=3.6 -b $BLKSIZE -l "$FSLABEL" -q "${MOUNTDEVICE}" ;;
748                 x"reiserfs_old")
749                     "mkfs.reiserfs" --format=3.5 -b $BLKSIZE -l "$FSLABEL" -q "${MOUNTDEVICE}"
750                     MOUNTFS=reiserfs;;
751                 x"jfs")
752                     "mkfs.jfs" -L "$FSLABEL" -q "${MOUNTDEVICE}"
753                     MOUNTOPTS="iocharset=utf8,";;
754                 x"jfs_caseins")
755                     "mkfs.jfs" -O -L "$FSLABEL" -q "${MOUNTDEVICE}"
756                     MOUNTFS=jfs
757                     MOUNTOPTS="iocharset=utf8,";;
758                 x"mdraid"*)
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
760                     MOUNTDEVICE="/dev/md/${fs}_${NDEVICES}"
761                     MOUNTFS=ext2
762                     "mkfs.ext2" -L "$FSLABEL" -q "${MOUNTDEVICE}" ;;
763                 x"lvm"*)
764                     for lodev in $LODEVICES; do
765                         pvcreate "$lodev"
766                     done
767                     vgcreate -s $((BLKSIZE/1024))K grub_test $LODEVICES
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
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
774                     elif [ x$fs = xlvm_mirrorall ] ; then
775                         lvcreate -m "$((NDEVICES-1))" -l "$((6*LVMBLKMUL))" --type mirror -n testvol grub_test
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
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)
790                     "mkfs.nilfs2" -L "$FSLABEL" -b $BLKSIZE  -q "${MOUNTDEVICE}" ;;
791                 xext2_old)
792                     MKE2FS_DEVICE_SECTSIZE=$SECSIZE "mkfs.ext2" -r 0 -b $BLKSIZE -L "$FSLABEL" -q "${MOUNTDEVICE}"
793                     MOUNTFS=ext2
794                     ;;
795                 xext4_metabg)
796                     MKE2FS_DEVICE_SECTSIZE=$SECSIZE "mkfs.ext4" -O meta_bg,^resize_inode -b $BLKSIZE -L "$FSLABEL" -q "${MOUNTDEVICE}"
797                     MOUNTFS=ext4
798                     ;;
799                 xext*)
800                     MKE2FS_DEVICE_SECTSIZE=$SECSIZE "mkfs.$fs" -b $BLKSIZE -L "$FSLABEL" -q "${MOUNTDEVICE}" ;;
801                 xxfs)
802                     "mkfs.xfs" -m crc=0 -b size=$BLKSIZE -s size=$SECSIZE -L "$FSLABEL" -q "${MOUNTDEVICE}" ;;
803                 xxfs_crc)
804                     MOUNTFS="xfs"
805                     "mkfs.xfs" -m crc=1 -b size=$BLKSIZE -s size=$SECSIZE -L "$FSLABEL" -q "${MOUNTDEVICE}" ;;
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."
906                         for lodev in $LODEVICES; do
907                             while ! losetup -d "$lodev"; do
908                                 sleep 1
909                             done
910                         done
911                         for i in $(range 0 $((NDEVICES-1)) 1); do
912                             rm "$FSIMAGEP${i}.img"
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
948             # Make sure file is not exact multiple of block size. This helps to force
949             # tail packing in case of squash4.
950             : $((BLOCKCNT--))
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
974                 cp "${CFILESRC}" "$MNTPOINTRW/$OSDIR/${CFILE}" &> /dev/null;
975             else
976
977                 cp "${CFILESRC}" "$MNTPOINTRW/$OSDIR/${CFILE}";
978
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")
1003                     (cd "$MASTER"; tar cf "${FSIMAGEP}0.img" .) ;;
1004                 x"cpio_"*)
1005                     (cd "$MASTER"; find . | cpio -o -H "$(echo ${fs} | sed 's@^cpio_@@')" > "${FSIMAGEP}0.img" ) ;;
1006                 x"ziso9660")
1007                     FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00);
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" ;;
1009                 x"iso9660")
1010                     FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00);
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"  ;;
1012                 x"joliet")
1013                     FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00);
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"  ;;
1015                 x"rockridge")
1016                     FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00);
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"  ;;
1018                 x"rockridge_joliet")
1019                     FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00);
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"  ;;
1021                 x"iso9660_1999")
1022                     FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00);
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"  ;;
1024                 x"joliet_1999")
1025                     FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00);
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"  ;;
1027                 x"rockridge_1999")
1028                     FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00);
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"  ;;
1030                 x"rockridge_joliet_1999")
1031                     FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00);
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"  ;;
1033                 x"romfs")
1034                     genromfs -V "$FSLABEL" -f "${FSIMAGEP}0.img" -d "$MASTER" ;;
1035                 xsquash4_*)
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 ;;
1038                 x"bfs")
1039                     sleep 1
1040                     fusermount -u "$MNTPOINTRW"
1041                     ;;
1042                 xlvm*)
1043                     sleep 1
1044                     for try in $(range 0 20 1); do
1045                         if umount "$MNTPOINTRW" ; then
1046                             break;
1047                         fi
1048                         sleep 1;
1049                     done
1050                     UMOUNT_TIME=$(date -u "+%Y-%m-%d %H:%M:%S")
1051                     sleep 1
1052                     vgchange -a n grub_test
1053                     ;;
1054                 xmdraid*)
1055                     sleep 1
1056                     for try in $(range 0 20 1); do
1057                         if umount "$MNTPOINTRW" ; then
1058                             break;
1059                         fi
1060                         sleep 1;
1061                     done
1062                     UMOUNT_TIME=$(date -u "+%Y-%m-%d %H:%M:%S")
1063                     sleep 1
1064                     mdadm --stop /dev/md/"${fs}_$NDEVICES"
1065                     ;;
1066                 *)
1067                     sleep 1
1068                     for try in $(range 0 20 1); do
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*)
1101                     mdadm --assemble /dev/md/"${fs}_$NDEVICES" $LODEVICES
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"
1120                 TZ=UTC ls -l "$MNTPOINTRO"
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
1128                 echo "$LSROUT"
1129                 TZ=UTC ls -lA "$MNTPOINTRO"
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"
1138                 TZ=UTC ls -l "$MNTPOINTRO"
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
1146                 echo "$LSROUT"
1147                 TZ=UTC ls -l "$MNTPOINTRO"
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"
1158                     TZ=UTC ls -l "$MNTPOINTRO"
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"
1168                     TZ=UTC ls -l "$MNTPOINTRO"
1169                     exit 1
1170                 fi
1171             fi
1172
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"
1184                 TZ=UTC ls -l "$MNTPOINTRO"
1185                 exit 1
1186             fi
1187
1188             case x"$fs" in
1189                 x"zfs"*)
1190                     ;;
1191                 *)
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"
1198                         TZ=UTC ls -l "$MNTPOINTRO"
1199                         exit 1
1200                     fi
1201                     ;;
1202             esac
1203
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"
1215                 TZ=UTC ls -l "$MNTPOINTRO/sdir"
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"
1230                 TZ=UTC ls -l "$MNTPOINTRO/$PDIR"
1231                 exit 1
1232             fi
1233
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"
1245                 TZ=UTC ls -l "$MNTPOINTRO/$OSDIR/sdir"
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"
1260                 TZ=UTC ls -l "$MNTPOINTRO/$OSDIR/ssdir"
1261                 exit 1
1262             fi
1263
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"*)
1280                     for lodev in $LODEVICES; do
1281                         FSUUID=$(printf "%016x\n" $(blkid -o export "$lodev" |grep -F UUID=|sed s,UUID=,,g))
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"
1299                         for lodev in $LODEVICES; do
1300                             blkid "$lodev"
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"
1325                         blkid "${MOUNTDEVICE}"
1326                         exit 1
1327                     fi
1328                     ;;
1329             esac
1330
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")"
1347
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
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
1445             if ! run_grubfstest cmp "$GRUBDIR/${CFILE}" "$MNTPOINTRO/$OSDIR/${CFILE}"  ; then
1446                 ok=false;
1447             fi
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
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
1541                             sleep 1
1542                         done
1543                     done;;
1544             esac
1545             for i in $(range 0 $((NDEVICES-1)) 1); do
1546                 rm "$FSIMAGEP${i}.img"
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
1557 rmdir "${tempdir}"