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