| #!@BUILD_SHEBANG@ |
| |
| set -e |
| |
| fs="$1" |
| |
| GRUBFSTEST="@builddir@/grub-fstest" |
| |
| tempdir=`mktemp -d "${TMPDIR:-/tmp}/tmp.XXXXXXXXXX"` || exit 1 |
| |
| # This wrapper is to ease insertion of valgrind or time statistics |
| run_it () { |
| LC_ALL=C "$GRUBFSTEST" "$@" |
| } |
| |
| range() { |
| range_counter="$1" |
| while test "$range_counter" -le "$2"; do |
| echo "$range_counter" |
| range_counter="$((range_counter + $3))" |
| done |
| } |
| |
| powrange() { |
| range_counter="$1" |
| while test "$range_counter" -le "$2"; do |
| echo "$range_counter" |
| range_counter="$((range_counter * 2))" |
| done |
| } |
| |
| run_grubfstest () { |
| need_images= |
| for i in $(range 0 $((NEED_IMAGES_N-1)) 1); do |
| need_images="$need_images $FSIMAGEP${i}.img"; |
| done |
| |
| run_it -c $NEED_IMAGES_N $need_images "$@" |
| } |
| |
| # OS LIMITATION: GNU/Linux has no AFS support, so we use a premade image and a reference tar file. I.a. no multiblocksize test |
| |
| MINLOGSECSIZE=9 |
| MAXLOGSECSIZE=9 |
| case x"$fs" in |
| xntfs*) |
| MINLOGSECSIZE=8 |
| MAXLOGSECSIZE=12;; |
| xvfat*|xmsdos*) |
| MINLOGSECSIZE=9 |
| # OS LIMITATION: It could go up to 32768 but Linux rejects sector sizes > 4096 |
| MAXLOGSECSIZE=12;; |
| xext*) |
| MINLOGSECSIZE=8 |
| MAXLOGSECSIZE=12;; |
| xbtrfs*) |
| MINLOGSECSIZE=8 |
| # OS LIMITATION: It could go up to 32768 but Linux rejects sector sizes > 4096 |
| MAXLOGSECSIZE=12;; |
| xxfs) |
| MINLOGSECSIZE=9 |
| # OS LIMITATION: GNU/Linux doesn't accept > 4096 |
| MAXLOGSECSIZE=12;; |
| xxfs_crc) |
| MINLOGSECSIZE=9 |
| # OS LIMITATION: GNU/Linux doesn't accept > 1024 |
| MAXLOGSECSIZE=10;; |
| xzfs*) |
| # OS LIMITATION: zfs-fuse hangs when creating zpool with sectors <=256B. |
| MINLOGSECSIZE=9 |
| # OS LIMITATION: zfs-fuse fails with >= 32K sectors. |
| # OS limitation: zfs-fuse always uses ashift=9 with loop devices |
| MAXLOGSECSIZE=9;; |
| esac |
| for LOGSECSIZE in $(range "$MINLOGSECSIZE" "$MAXLOGSECSIZE" 1); do |
| SECSIZE="$((1 << LOGSECSIZE))" |
| MINBLKSIZE=512 |
| MAXBLKSIZE=512 |
| BLKSTEP=0 |
| case x"$fs" in |
| xntfs*) |
| MINBLKSIZE=$SECSIZE |
| MAXBLKSIZE=65536 |
| if [ x"$SECSIZE" = x256 ]; then |
| MINBLKSIZE=512 |
| MAXBLKSIZE=32768 |
| fi |
| ;; |
| xvfat* | xmsdos*) |
| MINBLKSIZE=$SECSIZE |
| MAXBLKSIZE=$((128*SECSIZE)) |
| ;; |
| xexfat*) |
| MINBLKSIZE=$SECSIZE |
| # It could go further but it requires more and more space |
| MAXBLKSIZE=8286208 |
| ;; |
| xhfs) |
| MINBLKSIZE=512 |
| # OS LIMITATION: should be 1048576 but linux hangs on unmnount with |
| # >= 524288 |
| MAXBLKSIZE=262144 |
| ;; |
| xhfsplus | xhfsplus_casesens | xhfsplus_wrap) |
| MINBLKSIZE=512 |
| MAXBLKSIZE=1048576 |
| ;; |
| xnilfs2) |
| # nilfs2 supports blocksizes from 1024 to 4096 |
| # but non-4096 results in kernel oops in some cases, |
| # avoid it. |
| MINBLKSIZE=4096 |
| MAXBLKSIZE=4096 |
| ;; |
| xsfs*) |
| MINBLKSIZE=512 |
| MAXBLKSIZE=4096 |
| ;; |
| xaffs | xaffs_intl) |
| MINBLKSIZE=512 |
| MAXBLKSIZE=4096 |
| ;; |
| xreiserfs*) |
| MINBLKSIZE=512 |
| # OS LIMITATION: 8192 isn't supported. |
| MAXBLKSIZE=4096 |
| ;; |
| x"mdraid"*) |
| MINBLKSIZE=4096 |
| # OS LIMITATION: Linux oopses with >=32768K |
| MAXBLKSIZE=$((16384*1024)) |
| ;; |
| x"lvm_raid1"* | x"lvm_raid4" | x"lvm_raid5" | x"lvm_raid6") |
| # OS LIMITATION: Linux crashes with less than 16384 |
| MINBLKSIZE=16384 |
| # Could go further but what's the point? |
| MAXBLKSIZE=$((65536*1024)) |
| ;; |
| x"lvm_mirrorall") |
| MINBLKSIZE=2048 |
| # Could go further but what's the point? |
| MAXBLKSIZE=$((65536*1024)) |
| ;; |
| x"lvm_mirror1") |
| MINBLKSIZE=4096 |
| # Could go further but what's the point? |
| MAXBLKSIZE=$((65536*1024)) |
| ;; |
| x"lvm_stripe") |
| MINBLKSIZE=4096 |
| # Could go further but what's the point? |
| MAXBLKSIZE=$((65536*1024)) |
| ;; |
| x"lvm"*) |
| MINBLKSIZE=1024 |
| # Could go further but what's the point? |
| MAXBLKSIZE=$((65536*1024)) |
| ;; |
| xext*) |
| MINBLKSIZE=1024 |
| if [ $MINBLKSIZE -lt $SECSIZE ]; then |
| MINBLKSIZE=$SECSIZE |
| fi |
| MAXBLKSIZE=4096 |
| ;; |
| xsquash*) |
| MINBLKSIZE=4096 |
| MAXBLKSIZE=1048576;; |
| xxfs) |
| MINBLKSIZE=$SECSIZE |
| # OS Limitation: GNU/Linux doesn't accept > 4096 |
| MAXBLKSIZE=4096;; |
| xxfs_crc) |
| # OS Limitation: GNU/Linux doesn't accept != 1024 |
| MINBLKSIZE=1024 |
| MAXBLKSIZE=1024;; |
| xudf) |
| MINBLKSIZE=1024 |
| MAXBLKSIZE=4096;; |
| xbfs) |
| MINBLKSIZE=1024 |
| MAXBLKSIZE=8192;; |
| xufs*) |
| MINBLKSIZE=4096 |
| # OS Limitation: Linux rejects 65536 blocks. |
| MAXBLKSIZE=32768;; |
| xminix3) |
| # OS LIMITATION: Linux rejects non-power-of-two blocks. |
| # OS LIMITATION: Linux rejects > 4096. |
| MINBLKSIZE=1024 |
| MAXBLKSIZE=4096;; |
| esac |
| if test "$BLKSTEP" -eq 0; then |
| blksizes="$(powrange "$MINBLKSIZE" "$MAXBLKSIZE")" |
| else |
| blksizes="$(range "$MINBLKSIZE" "$MAXBLKSIZE" "$BLKSTEP")" |
| fi |
| for BLKSIZE in $blksizes; do |
| MAXDEVICES=1 |
| MINDEVICES=1 |
| export fs |
| case x"$fs" in |
| x"zfs_raidz" | x"zfs_stripe" | x"zfs_mirror" | xbtrfs_raid0 \ |
| | xbtrfs_raid1 | x"mdraid"*"_raid4" | x"mdraid"*"_raid5" \ |
| | x"mdraid"*"_linear" \ |
| | x"mdraid"*"_raid10" | xlvm_raid1* | xlvm_mirror1 | xlvm_mirrorall) |
| MINDEVICES=2 |
| MAXDEVICES=7 |
| ;; |
| xbtrfs_raid10) |
| MINDEVICES=4 |
| MAXDEVICES=7 |
| ;; |
| x"zfs_raidz2"| xlvm_raid5 | xlvm_raid4) |
| MINDEVICES=3 |
| MAXDEVICES=7;; |
| x"zfs_raidz3" | x"mdraid"*"_raid6") |
| MINDEVICES=4 |
| MAXDEVICES=7;; |
| xlvm_raid6) |
| MINDEVICES=5 |
| MAXDEVICES=7;; |
| x"mdraid"*"_raid0" | x"mdraid"*"_raid1" | x"lvm" | xlvm_stripe) |
| MINDEVICES=1 |
| MAXDEVICES=7;; |
| esac |
| |
| for NDEVICES in $(range "$MINDEVICES" "$MAXDEVICES" 1); do |
| export NDEVICES |
| unset FSIMAGEP |
| FSIMAGEP="${tempdir}/${fs}_${SECSIZE}_${BLKSIZE}_${NDEVICES}_" |
| export FSIMAGEP |
| unset NEED_IMAGES; |
| |
| case x$fs in |
| # RAID 1 has to work with even one device of the set. |
| xzfs_mirror | x"mdraid"*"_raid1" | xlvm_mirrorall | xlvm_raid1all) |
| NEED_IMAGES_N=1;; |
| # Degrade raidz by removing 3 devices |
| xzfs_raidz3) |
| NEED_IMAGES_N=$((NDEVICES-3));; |
| # Degrade raidz by removing 2 devices |
| xzfs_raidz2 | x"mdraid"*"_raid6" | x"lvm_raid6") |
| NEED_IMAGES_N=$((NDEVICES-2));; |
| # Degrade raidz and btrfs RAID1 by removing one device |
| xbtrfs_raid1 | xbtrfs_raid10 | xzfs_raidz | x"mdraid"*"_raid4" \ |
| | x"mdraid"*"_raid5" | x"mdraid"*"_raid10" | xlvm_mirror1 \ |
| | x"lvm_raid1" | x"lvm_raid4" | x"lvm_raid5") |
| NEED_IMAGES_N=$((NDEVICES-1));; |
| *) |
| NEED_IMAGES_N=$NDEVICES;; |
| esac |
| export NEED_IMAGES_N |
| |
| MNTPOINTRO="${tempdir}/${fs}_ro" |
| MNTPOINTRW="${tempdir}/${fs}_rw" |
| MOUNTOPTS="" |
| MOUNTFS="$fs" |
| MASTER="${tempdir}/master" |
| FSLABEL="grub_;/testé莭莽茝😁киритi urewfceniuewruevrewnuuireurevueurnievrewfnerfcnevirivinrewvnirewnivrewiuvcrewvnuewvrrrewniuerwreiuviurewiuviurewnuvewnvrenurnunuvrevuurerejiremvreijnvcreivire nverivnreivrevnureiorfnfrvoeoiroireoireoifrefoieroifoireoifoirefoireoifoijfoirereoireoivoioirevoinvoinreoinvnoieoinreoinveoinveoinreoinvoineoinoinoineoinernoiveoinvreoiioewdioewoirvnoireoivfoirewfewoifoijewoijfoijewfoijfewoijoijoijoijoijoijoijfewceniuewruevrewnuuireurevueurnievrewfnerfcnevirivinrewvnirewnivrewiuvcrewvnuewvrrrewniuerwreiuviurewiuviurewnuvewnvrenurnunuvrevuurerejiremvreijnvcreivire nverivnreivrevnureiorfnfrvoeoiroireoireoifrefoieroifoireoifoirefoireoifoijfoirereoireoivoioirevoinvoinreoinvnoieoinreoinveoinveoinreoinvoineoinoinoineoinernoiveoinvreoiioewdioewoirvnoireoivfoirewfewoifoijewoijfoijewfoijfewoijoijoijoijoijoijoijfewrewfceniuewruevrewnuuireurevueurnievrewfnerfcnevirivinrewvnirewnivrewiuvcrewvnuewvrrrewniuerwreiuviurewiuviurewnuvewnvrenurnunuvrevuurerejiremvreijnvcreivire nverivnreivrevnureiorfnfrvoeoiroireoireoifrefoieroifoireoifoirefoireoifoijfoirereoireoivoioirevoinvoinreoinvnoieoinreoinveoinveoinreoinvoineoinoinoineoinernoiveoinvreoiioewdioewoirvnoireoivfoirewfewoifoijewoijfoijewfoijfewoijoijoijoijoijoijoijfewceniuewruevrewnuuireurevueurnievrewfnerfcnevirivinrewvnirewnivrewiuvcrewvnuewvrrrewniuerwreiuviurewiuviurewnuvewnvrenurnunuvrevuurerejiremvreijnvcreivire nverivnreivrevnureiorfnfrvoeoiroireoireoifrefoieroifoireoifoirefoireoifoijfoirereoireoivoioirevoinvoinreoinvnoieoinreoinveoinveoinreoinvoineoinoinoineoinernoiveoinvreoiioewdioewoirvnoireoivfoirewfewoifoijewoijfoijewfoijfewoijoijoijoijoijoijoijfew" |
| CFILESRC= |
| 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 |
| if test -f "$cand" ; then |
| CFILESRC="$cand" |
| break |
| fi |
| done |
| if test "$CFILESRC" = "" ; then |
| echo "Couldn't find compressible file" >&2 |
| exit 1 |
| fi |
| case x"$fs" in |
| # FS LIMITATION: 8.3 names |
| xmsdos*) |
| CFILE="american.eng";; |
| xiso9660) |
| CFILE="american_english";; |
| *) |
| CFILE="american-english";; |
| esac |
| # OS LIMITATION: Limited by NAME_MAX (usually 255) in GNU/Linux |
| LONGNAME="qwertzuiopasdfghjklyxcvbnm1234567890qwertzuiopasdfghjklyxcvbnm1234567890oiewqfiewioqoiqoiurqruewqoiuwoieoiiuewqroreqiufieiuwrnureweriuvceoiroiewqoiricdsalkcndsakfirefoiwqeoircorejwoijfreoijojoiewjfwnfcoirenfoirefnreoifenoiwfnoi" |
| rm -rf "$MASTER" |
| |
| case x"$fs" in |
| # FS LIMITATION: HFS+ label is at most 255 UTF-16 chars |
| # OS LIMITATION: Linux HFS+ tools check UTF-8 length and don't |
| # handle out-of-BMP characters |
| x"hfsplus" | x"hfsplus_casesens" | x"hfsplus_wrap") |
| FSLABEL="grub_;/testé䏌䐓䏕киритi urewfceniuewruevrewnuuireurevueurnievrewfnerfcnevirivinrewvnirewnivrewiuvcrewvnuewvrrrewniuerwreiuviurewiuviurewnuvewnvrenurnunuvrevuurerejiremvreijnvcreivire nverivnreivrevnureiorfnfrvoeoiroireoireoifrefoieroifoireoifoiq" |
| ;; |
| # FS LIMITATION: btrfs label is at most 255 UTF-8 chars |
| x"btrfs"*) |
| FSLABEL="grub_;/testé莭莽😁киритi urewfceniuewruevrewnuuireurevueurnievrewfnerfcnevirivinrewvnirewnivrewiuvcrewvnuewvrrrewniuerwreiuviurewiuviurewnuvewnvrenurnunuvrevuurerejiremvreijnvcreivire nverivnreivrevnureiorfnfrvoeoiroireoireoifrefoieroifoireoi";; |
| |
| # FS LIMITATION: exfat is at most 15 UTF-16 chars |
| x"exfat") |
| FSLABEL="géт ;/莭莽😁кир";; |
| # FS LIMITATION: ntfs label is at most ?? UTF-16 chars |
| x"ntfs"*) |
| FSLABEL="grub_;/testéтi u莭😁茝кириrewfceniuewruevrewnuuireurevueurnievrewfnerfcnevirivinrewvniwnivrewiuvcrewvnuewvrrrewniureifiuewifjiww";; |
| # FS LIMITATION: nilfs2 label is at most 80 UTF-8 characters |
| x"nilfs2") |
| FSLABEL="grub_;/testéтi u😁莽茝кириrewfceniuewruevrewnuuireurevueurnievrewfne";; |
| # FS LIMITATION: afs and iso9660 label is at most 32 UTF-8 characters |
| x"afs" | xiso9660 | xrockridge | xrockridge_joliet\ |
| | xiso9660_1999 | xrockridge_1999 | xrockridge_joliet_1999) |
| FSLABEL="gr_;/é莭莽😁кирит u";; |
| # FS LIMITATION: bfs label is at most 32 UTF-8 characters |
| # OS LIMITATION: bfs label can't contain ; or / |
| x"bfs") |
| FSLABEL="grub_é莭莽😁кирит u";; |
| # FS LIMITATION: Joliet label is at most 16 UTF-16 characters |
| # OS LIMITATION: xorriso doesn't handle out-of-BMP characters |
| xjoliet | xjoliet_1999) |
| FSLABEL="g;/_é䏌䐓䏕䎛䎾䏴кит u" |
| #FSLABEL="g;/_é莭莽😁кит u" |
| ;; |
| # FS LIMITATION: reiserfs, extN and jfs label is at most 16 UTF-8 characters |
| x"reiserfs_old" | x"reiserfs" | x"ext"* | x"lvm"* | x"mdraid"* | x"jfs" | x"jfs_caseins") |
| FSLABEL="g;/éт 莭😁";; |
| # FS LIMITATION: No underscore, space, semicolon, slash or international characters in UFS* in label. Limited to 32 UTF-8 characters |
| x"ufs1" | x"ufs1_sun" | x"ufs2") |
| FSLABEL="grubtest""ieurrucnenreeiurueurewf";; |
| # FS LIMITATION: XFS label is at most 12 UTF-8 characters |
| x"xfs"|x"xfs_crc") |
| FSLABEL="géт 😁к";; |
| # FS LIMITATION: FAT labels limited to 11 characters, no international characters or lowercase |
| x"vfat"* | xmsdos*) |
| FSLABEL="GRUBTEST ;_";; |
| # FS LIMITATION: AFFS is latin1. At most 29 characters |
| x"affs" | xaffs_intl) |
| FSLABEL="grub_tt? #*w;/e£@¡¤½¾{[]}<>.,";; |
| # FS LIMITATION: SFS is latin1. At most 30 characters |
| x"sfs"*) |
| FSLABEL="GRUB tt öäüé;/àèç åø¿ª©þð׫»µ¬";; |
| # FS LIMITATION: HFS is Mac-Roman. At most 27 characters |
| x"hfs") |
| FSLABEL="grub_t;/estéàèèéie fiucnree";; |
| # FS LIMITATION: UDF label is either up to 127 latin1 characters or 63 UTF-16 ones |
| # OS LIMITATION: Linux UDF tools force ASCII label ... |
| x"udf") |
| FSLABEL="grub_;/testurewfceniuewruevrewnuuireurevueurnievr";; |
| # FS LIMITATION: ZFS doesn't accept non-ASCII in label |
| # FIXME: since this is used as a path component for mount it's very limited in length |
| xzfs_* | xzfs) |
| FSLABEL="grub_testieufiue r";; |
| esac |
| case x"$fs" in |
| xmdraid*) |
| DISKSIZE=314572800;; |
| xlvm*) |
| LVMBLKMUL=$(((5800 * 1048576) / (8 * BLKSIZE * NDEVICES))) |
| DISKSIZE=$((8*BLKSIZE*LVMBLKMUL));; |
| # FS LIMITATION: some fs have disk size limit |
| x"vfat12" | xmsdos12) |
| DISKSIZE=$((4000*BLKSIZE));; |
| x"vfat12a" | xmsdos12a) |
| if [ $BLKSIZE -ge 2048 ]; then |
| DISKSIZE=$((2500*BLKSIZE)) |
| else |
| DISKSIZE=$((3000*BLKSIZE)) |
| fi |
| if [ $DISKSIZE -gt $((60000*SECSIZE)) ]; then |
| DISKSIZE=$((60000*SECSIZE)) |
| fi;; |
| x"vfat16" | xmsdos16) |
| DISKSIZE=$((65000*BLKSIZE));; |
| x"vfat16a" | xmsdos16a) |
| DISKSIZE=$((60000*SECSIZE)) |
| ;; |
| *) |
| DISKSIZE=10737418240;; |
| esac |
| |
| if [ $DISKSIZE -ge $(((5800/NDEVICES)*1048576)) ]; then |
| DISKSIZE=$(((5800/NDEVICES)*1048576)) |
| fi |
| |
| case x"$fs" in |
| xvfat* | xmsdos* | xexfat* | xhfs | xhfsplus | xhfsplus_wrap | xaffs \ |
| | xaffs_intl | xjfs_caseins | xsfs_caseins \ |
| | xzfs_caseins | xiso9660) |
| CASESENS=n;; |
| *) |
| CASESENS=y;; |
| esac |
| |
| BIGBLOCKCNT=$((5000 * 1048576)) |
| case x"$fs" in |
| # FS LIMITATION: small filesystems |
| x"vfat12" | xmsdos12) |
| if [ $BLKSIZE -le 4096 ]; then |
| BIGBLOCKCNT=0 |
| elif [ $BLKSIZE = 8192 ]; then |
| BIGBLOCKCNT=1500000 |
| else |
| BIGBLOCKCNT=$((2000*BLKSIZE)) |
| fi |
| ;; |
| x"vfat12a" | xmsdos12a) |
| if [ $BLKSIZE -le 4096 ] || [ $((128*SECSIZE)) = $BLKSIZE ]; then |
| BIGBLOCKCNT=0 |
| else |
| BIGBLOCKCNT=700000 |
| fi;; |
| x"vfat16a" | xmsdos16a) |
| if [ $((128*SECSIZE)) = $BLKSIZE ]; then |
| BIGBLOCKCNT=0 |
| else |
| BIGBLOCKCNT=$((2500*SECSIZE)) |
| fi |
| ;; |
| x"vfat16" | xmsdos16) |
| BIGBLOCKCNT=$((25000 * BLKSIZE)) |
| if [ $BIGBLOCKCNT -gt 4294967295 ]; then |
| BIGBLOCKCNT=4294967295 |
| fi |
| ;; |
| x"minix") |
| BIGBLOCKCNT=30000000;; |
| |
| xexfat) |
| # Big blocks waste really a lot of space. |
| # Not much is left. |
| if [ $BLKSIZE = 2097152 ]; then |
| BIGBLOCKCNT=4500000000 |
| fi |
| if [ $BLKSIZE = 4194304 ]; then |
| BIGBLOCKCNT=3500000000 |
| fi |
| ;; |
| # FS LIMITATION: romfs image is limited to 4G. |
| x"romfs") |
| BIGBLOCKCNT=$((4000 * 1048576));; |
| # FS LIMITATION: These FS have uint32 as file size field |
| x"vfat"* | xmsdos* | x"cpio_crc" | x"cpio_newc" | x"cpio_bin" | x"cpio_hpbin" | xsfs*) |
| BIGBLOCKCNT=4294967295;; |
| # FS LIMITATION: These FS have int32 as file size field |
| # FIXME: not so sure about AFFS |
| # OS LIMITATION: minix2/minix3 could be formatted in a way to permit more. |
| x"minix3" | x"minix2" | x"hfs"| x"affs" | xaffs_intl | xreiserfs_old | xext2_old) |
| BIGBLOCKCNT=$((16#7fffffff));; |
| |
| # FS LIMITATION: redundant storage |
| # We have only limited space. Mirroring multiplies it very effectively. |
| xmdraid* | xlvm* | xzfs_mirror | xbtrfs_raid1) |
| BIGBLOCKCNT=$((100 * 1048576));; |
| # We already test the FS for big files separately. Save some time here. |
| x"zfs_raid"* | x"zfs_stripe"* | x"zfs_mirror"* | x"btrfs_raid"*) |
| BIGBLOCKCNT=$((100 * 1048576));; |
| |
| # OS LIMITATION: bfs_fuse bugs beyond that |
| xbfs) |
| BIGBLOCKCNT=$((800 * 1048576));; |
| esac |
| |
| NOSYMLINK=n |
| case x"$fs" in |
| # FS LIMITATION: no symlinks on FAT, exFAT, HFS, plain ISO9660 and Joliet |
| # OS LIMITATION: ntfs-3g creates interix symlinks which aren't real symlinks |
| x"vfat"* | xmsdos* | x"hfs" | x"exfat" | x"ntfs"* \ |
| | xiso9660 | xjoliet| xiso9660_1999 | xjoliet_1999) |
| NOSYMLINK=y;; |
| esac |
| NOHARDLINK=n |
| case x"$fs" in |
| # FS LIMITATION: no hardlinks on BFS, exfat, fat, hfs and SFS |
| xbfs | xexfat | x"vfat"* | xmsdos* | xhfs | xsfs | xsfs_caseins) |
| NOHARDLINK=y;; |
| # GRUB LIMITATION: no hardlink support on newc and hfs+ |
| xcpio_crc | xcpio_newc | xhfsplus*) |
| NOHARDLINK=y;; |
| esac |
| |
| # FS LIMITATION: some filesystems limit file name size |
| case x"$fs" in |
| x"cpio_ustar") |
| LONGNAME="`echo $LONGNAME |head -c 99`";; |
| x"hfs") |
| LONGNAME="`echo $LONGNAME |head -c 31`";; |
| x"minix" | x"minix2" | x"affs" | xaffs_intl | xiso9660) |
| LONGNAME="`echo $LONGNAME |head -c 30`";; |
| x"sfs"*) |
| LONGNAME="`echo $LONGNAME |head -c 105`";; |
| x"minix3") |
| LONGNAME="`echo $LONGNAME |head -c 60`";; |
| x"udf") |
| LONGNAME="`echo $LONGNAME |head -c 192`";; |
| # GRUB LIMITATION: GRUB prefers Joliet over ISO9660:1999 |
| xjoliet | xjoliet_1999) |
| LONGNAME="`echo $LONGNAME |head -c 103`";; |
| xiso9660_1999) |
| LONGNAME="`echo $LONGNAME |head -c 207`";; |
| # FS LIMITATION: 8.3 |
| xmsdos*) |
| LONGNAME="qwertzui.opa";; |
| esac |
| NOFILETIME=n |
| NOFSTIME=n |
| case x"$fs" in |
| # FIXME: Not sure about BtrFS, NTFS, JFS, AFS, UDF and SFS. Check it. |
| # FS LIMITATION: as far as I know those FS don't store their last modification date. |
| x"jfs_caseins" | x"jfs" | x"xfs" | x"xfs_crc" | x"btrfs"* | x"reiserfs_old" | x"reiserfs" \ |
| | x"bfs" | x"afs" \ |
| | x"tarfs" | x"cpio_"* | x"minix" | x"minix2" \ |
| | x"minix3" | x"ntfs"* | x"udf" | x"sfs"*) |
| NOFSTIME=y;; |
| # OS LIMITATION: Linux doesn't update fstime. |
| # OS LIMITATION: Linux apparently uses localtime instead of UTC |
| xhfs) |
| NOFILETIME=y; NOFSTIME=y;; |
| # GRUB LIMITATION: FAT and exFAT use localtime. Unusable for GRUB |
| x"vfat"* | x"msdos"* | x"exfat") |
| NOFILETIME=y; NOFSTIME=y;; |
| # FS LIMITATION: romfs has no timestamps. |
| x"romfs") |
| NOFILETIME=y; NOFSTIME=y;; |
| esac |
| |
| NOFSLABEL=n |
| case x"$fs" in |
| # FS LIMITATION: these filesystems have no label. |
| x"cpio_"* | x"tarfs" | x"squash4_"* | x"minix" | x"minix2" \ |
| | x"minix3" | xreiserfs_old) |
| NOFSLABEL=y;; |
| esac |
| |
| PDIRCOMPNUM=210 |
| PDIR2COMPNUM=210 |
| |
| case x$fs in |
| # OS LIMITATION: bfs_fuse bugs beyond that |
| xbfs) |
| PDIRCOMPNUM=10 |
| PDIR2COMPNUM=10;; |
| # OS LIMITATION: Linux supports only inline symlinks |
| xudf) |
| if [ $BLKSIZE = 1024 ]; then |
| PDIR2COMPNUM=113 |
| fi ;; |
| # FS LIMITATION: at most 255 on path length |
| # FS LIMITATION: at most 100 on symlink length |
| xcpio_ustar) |
| PDIRCOMPNUM=84 |
| PDIR2COMPNUM=30;; |
| # OS LIMITATION: Linux supports only symlink at most one block long on reiserfs |
| xreiserfs | xreiserfs_old) |
| if [ $BLKSIZE = 512 ]; then |
| PDIR2COMPNUM=114 |
| fi ;; |
| # FS LIMITATION: SFS assumes that symlink |
| # with header fit in one block. |
| # FIXME: not sure about it. |
| xsfs | xsfs_caseins) |
| if [ $BLKSIZE = 512 ]; then |
| PDIR2COMPNUM=147 |
| fi ;; |
| # FS LIMITATION: AFFS assumes that symlink |
| # with rather larger header fit in one block. |
| # FIXME: not sure about it. |
| xaffs | xaffs_intl) |
| if [ $BLKSIZE = 512 ]; then |
| PDIR2COMPNUM=97 |
| fi ;; |
| esac |
| |
| |
| PDIR="" |
| # OS LIMITATION: Limited by PATH_MAX (usually 1024) |
| for i in $(range 0 $((PDIRCOMPNUM-1)) 1); do |
| PDIR="$PDIR/$i"; |
| if test $((i%3)) = 0; then |
| PDIR="$PDIR/" |
| fi |
| done |
| |
| PDIR2="" |
| # OS LIMITATION: Limited by PATH_MAX (usually 1024) |
| for i in $(range 0 $((PDIR2COMPNUM-1)) 1); do |
| PDIR2="${PDIR2}/$i"; |
| if test $((i%3)) = 0; then |
| PDIR2="${PDIR2}/" |
| fi |
| done |
| |
| PFIL="p.img" |
| |
| unset LODEVICES |
| GENERATED=n |
| LODEVICES= |
| MOUNTDEVICE= |
| |
| case x"$fs" in |
| x"tarfs" | x"cpio_"*| x"ziso9660" | x"romfs" | x"squash4_"*\ |
| | x"iso9660" | xjoliet | xrockridge | xrockridge_joliet \ |
| | x"iso9660_1999" | xjoliet_1999 | xrockridge_1999 \ |
| | xrockridge_joliet_1999) |
| MNTPOINTRW="$MASTER" |
| MNTPOINTRO="$MASTER" |
| GENERATED=y |
| mkdir -p "$MASTER";; |
| # No mkfs for GNU/Linux. Just unpack preformatted empty image |
| *) |
| mkdir -p "$MNTPOINTRW" |
| mkdir -p "$MNTPOINTRO" |
| for i in $(range 0 $((NDEVICES-1)) 1); do |
| dd if=/dev/zero of="$FSIMAGEP${i}.img" count=1 bs=1 seek=$((DISKSIZE-1)) &> /dev/null |
| LODEVICE="$(losetup -f)" |
| LODEVICES="$LODEVICES $LODEVICE" |
| losetup "$LODEVICE" "$FSIMAGEP${i}.img" |
| if test "$i" = 0; then |
| MOUNTDEVICE="$LODEVICE" |
| fi |
| done ;; |
| esac |
| |
| case x"$fs" in |
| x"afs") |
| ;; |
| x"btrfs") |
| "mkfs.btrfs" -s $SECSIZE -L "$FSLABEL" "${MOUNTDEVICE}" ;; |
| x"btrfs_zlib" | x"btrfs_lzo") |
| "mkfs.btrfs" -s $SECSIZE -L "$FSLABEL" "${MOUNTDEVICE}" |
| MOUNTOPTS="compress=${fs/btrfs_/}," |
| MOUNTFS="btrfs" |
| ;; |
| x"btrfs_raid0") |
| "mkfs.btrfs" -s $SECSIZE -d raid0 -m raid0 -L "$FSLABEL" $LODEVICES |
| MOUNTFS="btrfs" |
| ;; |
| x"btrfs_raid1") |
| "mkfs.btrfs" -s $SECSIZE -d raid1 -m raid1 -L "$FSLABEL" $LODEVICES |
| MOUNTFS="btrfs" |
| ;; |
| x"btrfs_raid10") |
| "mkfs.btrfs" -s $SECSIZE -d raid10 -m raid10 -L "$FSLABEL" $LODEVICES |
| MOUNTFS="btrfs" |
| ;; |
| x"btrfs_single") |
| "mkfs.btrfs" -s $SECSIZE -d single -L "$FSLABEL" $LODEVICES |
| MOUNTFS="btrfs" |
| ;; |
| x"exfat") |
| "mkfs.$fs" -s $((BLKSIZE/512)) -n "$FSLABEL" "${MOUNTDEVICE}" |
| MOUNTOPTS="iocharset=utf8," |
| MOUNTFS="exfat-fuse";; |
| x"minix") |
| "mkfs.minix" "${MOUNTDEVICE}" |
| ;; |
| # mkfs.hfs and mkfs.hfsplus don't fill UUID. |
| x"hfsplus") |
| "mkfs.hfsplus" -b $BLKSIZE -v "$FSLABEL" "${MOUNTDEVICE}" |
| dd if=/dev/urandom of="${MOUNTDEVICE}" bs=1 seek=$((16#468)) conv=notrunc count=8 ;; |
| x"hfsplus_wrap") |
| "mkfs.hfsplus" -w -b $BLKSIZE -v "$FSLABEL" "${MOUNTDEVICE}" |
| dd if=/dev/urandom of="${MOUNTDEVICE}" bs=1 seek=$((16#468)) conv=notrunc count=8 |
| MOUNTFS="hfsplus";; |
| x"hfsplus_casesens") |
| "mkfs.hfsplus" -s -b $BLKSIZE -v "$FSLABEL" "${MOUNTDEVICE}" |
| dd if=/dev/urandom of="${MOUNTDEVICE}" bs=1 seek=$((16#468)) conv=notrunc count=8 |
| MOUNTFS="hfsplus";; |
| x"hfs") |
| "mkfs.hfs" -b $BLKSIZE -v "`echo $FSLABEL |recode utf8..macroman`" -h "${MOUNTDEVICE}" |
| dd if=/dev/urandom of="${MOUNTDEVICE}" bs=1 seek=$((16#474)) conv=notrunc count=8 |
| MOUNTOPTS="iocharset=utf8,codepage=macroman," |
| ;; |
| x"vfat"*|xmsdos*) |
| BITS="${fs/vfat/}" |
| BITS="${BITS/msdos/}" |
| if [ "x${BITS:2:1}" = xa ]; then |
| A=-A |
| else |
| A= |
| fi |
| "mkfs.vfat" -a $A -S $SECSIZE -s $((BLKSIZE/SECSIZE)) -F "${BITS:0:2}" -n "$FSLABEL" "${MOUNTDEVICE}" |
| MOUNTOPTS="iocharset=utf8,codepage=437," |
| MOUNTFS="$(echo "$fs"|sed 's,[0-9]*a\?$,,')";; |
| x"minix2") |
| "mkfs.minix" -v "${MOUNTDEVICE}" |
| MOUNTFS="minix";; |
| x"minix3") |
| "mkfs.minix" -B $BLKSIZE -3 "${MOUNTDEVICE}" |
| MOUNTFS="minix";; |
| x"ntfs"*) |
| "mkfs.ntfs" -s "$SECSIZE" -c "$BLKSIZE" -L "$FSLABEL" -Q -q "${MOUNTDEVICE}" |
| MOUNTOPTS="iocharset=utf8,compression," |
| MOUNTFS="ntfs-3g";; |
| x"udf") |
| "mkudffs" --utf8 -b $BLKSIZE --lvid="$FSLABEL" "${MOUNTDEVICE}" |
| MOUNTOPTS="iocharset=utf8,bs=$BLKSIZE,";; |
| x"ufs2") |
| "mkfs.ufs" -b $BLKSIZE -L "$FSLABEL" -O 2 "${MOUNTDEVICE}" |
| MOUNTOPTS="ufstype=ufs2," |
| MOUNTFS="ufs";; |
| x"ufs1") |
| "mkfs.ufs" -b $BLKSIZE -L "$FSLABEL" -O 1 "${MOUNTDEVICE}" |
| MOUNTOPTS="ufstype=44bsd," |
| MOUNTFS="ufs";; |
| x"ufs1_sun") |
| "mkfs.ufs" -b $BLKSIZE -L "$FSLABEL" -O 1 "${MOUNTDEVICE}" |
| MOUNTOPTS="ufstype=sun," |
| MOUNTFS="ufs";; |
| x"zfs") |
| "zpool" create -R "$MNTPOINTRW" "$FSLABEL" "${MOUNTDEVICE}" |
| sleep 1 |
| "zfs" create "$FSLABEL"/"grub fs" |
| sleep 1;; |
| x"zfs_caseins") |
| "zpool" create -R "$MNTPOINTRW" "$FSLABEL" "${MOUNTDEVICE}" |
| sleep 1 |
| "zfs" create -o casesensitivity=insensitive "$FSLABEL"/"grub fs" |
| sleep 1;; |
| x"zfs_lzjb" | xzfs_gzip | xzfs_zle) |
| "zpool" create -O compression=${fs/zfs_/} -R "$MNTPOINTRW" "$FSLABEL" "${MOUNTDEVICE}" |
| sleep 1 |
| "zfs" create -o compression=${fs/zfs_/} "$FSLABEL"/"grub fs" |
| sleep 1;; |
| x"zfs_raidz") |
| "zpool" create -R "$MNTPOINTRW" "$FSLABEL" raidz1 $LODEVICES |
| sleep 1 |
| "zfs" create "$FSLABEL"/"grub fs" |
| sleep 1;; |
| x"zfs_raidz2") |
| "zpool" create -R "$MNTPOINTRW" "$FSLABEL" raidz2 $LODEVICES |
| sleep 1 |
| "zfs" create "$FSLABEL"/"grub fs" |
| sleep 1;; |
| x"zfs_raidz3") |
| "zpool" create -R "$MNTPOINTRW" "$FSLABEL" raidz3 $LODEVICES |
| sleep 1 |
| "zfs" create "$FSLABEL"/"grub fs" |
| sleep 1;; |
| x"zfs_mirror") |
| "zpool" create -R "$MNTPOINTRW" "$FSLABEL" mirror $LODEVICES |
| sleep 1 |
| "zfs" create "$FSLABEL"/"grub fs" |
| sleep 1;; |
| x"zfs_stripe") |
| "zpool" create -R "$MNTPOINTRW" "$FSLABEL" $LODEVICES |
| sleep 1 |
| "zfs" create "$FSLABEL"/"grub fs" |
| sleep 1;; |
| 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_"*) |
| INSTDEVICE=/dev/null;; |
| x"reiserfs") |
| "mkfs.reiserfs" --format=3.6 -b $BLKSIZE -l "$FSLABEL" -q "${MOUNTDEVICE}" ;; |
| x"reiserfs_old") |
| "mkfs.reiserfs" --format=3.5 -b $BLKSIZE -l "$FSLABEL" -q "${MOUNTDEVICE}" |
| MOUNTFS=reiserfs;; |
| x"jfs") |
| "mkfs.jfs" -L "$FSLABEL" -q "${MOUNTDEVICE}" |
| MOUNTOPTS="iocharset=utf8,";; |
| x"jfs_caseins") |
| "mkfs.jfs" -O -L "$FSLABEL" -q "${MOUNTDEVICE}" |
| MOUNTFS=jfs |
| MOUNTOPTS="iocharset=utf8,";; |
| x"mdraid"*) |
| mdadm -C --chunk=$((BLKSIZE/1024)) --force -e "${fs:6:1}.${fs:7:1}" "/dev/md/${fs}_${NDEVICES}" --level="${fs:13}" --raid-devices="$NDEVICES" $LODEVICES |
| MOUNTDEVICE="/dev/md/${fs}_${NDEVICES}" |
| MOUNTFS=ext2 |
| "mkfs.ext2" -L "$FSLABEL" -q "${MOUNTDEVICE}" ;; |
| x"lvm"*) |
| for lodev in $LODEVICES; do |
| pvcreate "$lodev" |
| done |
| vgcreate -s $((BLKSIZE/1024))K grub_test $LODEVICES |
| if [ x$fs = xlvm ] ; then |
| lvcreate -l "$((NDEVICES*7*LVMBLKMUL))" -n testvol grub_test |
| elif [ x$fs = xlvm_stripe ] ; then |
| lvcreate -l "$((NDEVICES*7*LVMBLKMUL))" -i "$NDEVICES" -n testvol grub_test |
| elif [ x$fs = xlvm_mirror1 ] || [ x$fs = xlvm_raid1 ] ; then |
| lvcreate -m 1 -l "$((NDEVICES*2*LVMBLKMUL))" --type "${fs/lvm_/}" -n testvol grub_test |
| elif [ x$fs = xlvm_mirrorall ] ; then |
| lvcreate -m "$((NDEVICES-1))" -l "$((6*LVMBLKMUL))" --type mirror -n testvol grub_test |
| elif [ x$fs = xlvm_raid1all ] ; then |
| # Until version 2.02.103 LVM counts metadata segments |
| # twice when checking available space. Reduce segment |
| # count to work around it. |
| lvcreate -m "$((NDEVICES-1))" -l "$((6*LVMBLKMUL - 1))" --type raid1 -n testvol grub_test |
| elif [ x$fs = xlvm_raid4 ] || [ x$fs = xlvm_raid5 ]; then |
| lvcreate -l "$(((NDEVICES-1) * 5*LVMBLKMUL))" -i "$((NDEVICES-1))" --type "${fs/lvm_/}" -n testvol grub_test |
| elif [ x$fs = xlvm_raid6 ]; then |
| lvcreate -l "$(((NDEVICES-2) * 5*LVMBLKMUL))" -i "$((NDEVICES-2))" --type "${fs/lvm_/}" -n testvol grub_test |
| fi |
| MOUNTDEVICE="/dev/mapper/grub_test-testvol" |
| MOUNTFS=ext2 |
| "mkfs.ext2" -L "$FSLABEL" -q "${MOUNTDEVICE}" ;; |
| xnilfs2) |
| "mkfs.nilfs2" -L "$FSLABEL" -b $BLKSIZE -q "${MOUNTDEVICE}" ;; |
| xext2_old) |
| MKE2FS_DEVICE_SECTSIZE=$SECSIZE "mkfs.ext2" -r 0 -b $BLKSIZE -L "$FSLABEL" -q "${MOUNTDEVICE}" |
| MOUNTFS=ext2 |
| ;; |
| xext4_metabg) |
| MKE2FS_DEVICE_SECTSIZE=$SECSIZE "mkfs.ext4" -O meta_bg,^resize_inode -b $BLKSIZE -L "$FSLABEL" -q "${MOUNTDEVICE}" |
| MOUNTFS=ext4 |
| ;; |
| xext*) |
| MKE2FS_DEVICE_SECTSIZE=$SECSIZE "mkfs.$fs" -b $BLKSIZE -L "$FSLABEL" -q "${MOUNTDEVICE}" ;; |
| xxfs) |
| "mkfs.xfs" -m crc=0 -b size=$BLKSIZE -s size=$SECSIZE -L "$FSLABEL" -q "${MOUNTDEVICE}" ;; |
| xxfs_crc) |
| MOUNTFS="xfs" |
| "mkfs.xfs" -m crc=1 -b size=$BLKSIZE -s size=$SECSIZE -L "$FSLABEL" -q "${MOUNTDEVICE}" ;; |
| *) |
| echo "Add appropriate mkfs command here" |
| exit 1 |
| ;; |
| esac |
| BASEFILE="1.img" |
| NASTYFILE=".?*\\!\"#%@\$%&'()+ ,-.:;<=>^{_}[]\`|~." |
| case x"$fs" in |
| |
| # FS LIMITATION: AFFS and SFS don't accept : |
| xsfs*) |
| NASTYFILE=".?*\\!\"#%@\$%&'()+ ,-.;<=>^{_}[]\`|~.";; |
| # FS LIMITATION: AFFS is limited in file name length (30) |
| x"affs" | xaffs_intl) |
| NASTYFILE=".?*\\!\"#@\$'()+ ,-;<=>^{_}[]\`|~.";; |
| # FS LIMITATION: hfs, minix and minix2 are limited in file name length (30 or 31) |
| x"hfs" | x"minix" | x"minix2") |
| NASTYFILE=".?*\\!\"#@\$&'()+ ,-:;<=>{}[]\`|~.";; |
| # FS LIMITATION: FAT doesn't accept ?, *, \, ", :, <, >, | |
| # FS LIMITATION: FAT discards dots at the end. |
| x"vfat"* | x"exfat") |
| NASTYFILE=".!#%@\$%&'()+ ,-.;=^{_}[]\`~";; |
| # FS LIMITATION: 8.3 limitations apply |
| x"msdos"*) |
| NASTYFILE="!#%@\$%&.;=^";; |
| # FS LIMITATION: No ' ', '*', '/', ':', ';', '?', '\\' in joliet |
| # GRUB LIMITATION: GRUB prefers Joliet over ISO9660:1999 |
| xjoliet | xjoliet_1999) |
| NASTYFILE=".!\"#%@\$%&'()+,-.<=>^{_}[]\`|~.";; |
| # FS LIMITATION: iso9660 accepts only [0-9A-Z_]*, 32 characters at most |
| xiso9660) |
| NASTYFILE="0123456789_acefghijknopqrvwxyz";; |
| esac |
| |
| case x"$fs" in |
| # FS LIMITATION: HFS, AFFS and SFS use legacy codepage (mac-roman or latin1) |
| x"sfs"* | x"hfs" | x"affs" | xaffs_intl) |
| IFILE="éàèüöäëñ" |
| ISYM="ëñéüöäàè" |
| ;; |
| # FS LIMITATION: filename length limitation. |
| x"minix" | x"minix2") |
| IFILE="éàèüö😁ñкиΕλκά" |
| ISYM="Ελκάкиéà😁öäëñ" |
| ;; |
| xminix3) |
| IFILE="éàèüöäëñкирица莭茝Ελλικά😁😜😒" |
| ISYM="Ελλικά😁😜😒莭茝кирицаéàèüöäëñ";; |
| # GRUB LIMITATION: HFS+ uses NFD. GRUB doesn't handle NF conversion. |
| # OS LIMITATION: Linux doesn't handle out-of-BMP characters for UTF-16 |
| x"hfsplus" | x"hfsplus_casesens" | x"hfsplus_wrap") |
| IFILE="éàèüöäëñкирилица䏌䐓䏕Ελληνικα̍䏌䐓䏕" |
| ISYM="Ελληνικα̍кирилица䏌䐓䏕éàèüöäëñ䏌䐓䏕" |
| ;; |
| # GRUB LIMITATION: On case-insensitive ZFS isn't supported with non-uppercase characters |
| xzfs_caseins) |
| IFILE="ÉÀÈÜÖÄËÑКИРИЛИЦА莭莽茝ΕΛΛΗΝΙΚΆ😁😜😒" |
| ISYM="ΕΛΛΗΝΙΚΆКИРИЛИЦА😁😜😒ÉÀÈÜÖÄËÑ莭莽茝";; |
| # FS LIMITATION: 8.3 CP437 |
| x"msdos"*) |
| IFILE="éàèüöäëñ.éàè" |
| ;; |
| # FS LIMITATION: iso9660 is ASCII-only. |
| x"iso9660") |
| IFILE="abcdefghijkmmnop" |
| ;; |
| # OS LIMITATION: Linux doesn't handle out-of-BMP characters for UTF-16 |
| # OS LIMITATION: xorriso doesn't handle out-of-BMP characters |
| xjoliet | xjoliet_1999 | x"vfat"* | x"jfs"* | x"udf"*) |
| IFILE="éàèüöäëñкирилица䏌䐓䏕Ελληνικά䏌䐓䏕" |
| ISYM="Ελληνικάкирилица䏌䐓䏕éàèüöäëñ䏌䐓䏕";; |
| *) |
| IFILE="éàèüöäëñкирилица莭莽茝Ελληνικά😁😜😒" |
| ISYM="Ελληνικάкирилица😁😜😒éàèüöäëñ莭莽茝";; |
| esac |
| BIGFILE="big.img" |
| BASESYM="sym" |
| BASEHARD="hard" |
| SSYM="///sdir////ssym" |
| USYM="///sdir////usym" |
| LONGSYM="longsym" |
| PSYM="psym" |
| OSDIR="" |
| GRUBDEVICE=loop0 |
| case x"$fs" in |
| xmdraid*) |
| GRUBDEVICE="mduuid/`mdadm --detail --export $MOUNTDEVICE | grep MD_UUID=|sed 's,MD_UUID=,,g;s,:,,g'`";; |
| xlvm*) |
| GRUBDEVICE="lvm/grub_test-testvol";; |
| esac |
| GRUBDIR="($GRUBDEVICE)" |
| case x"$fs" in |
| x"zfs"*) |
| OSDIR="grub fs/" |
| GRUBDIR="($GRUBDEVICE)/grub fs@";; |
| 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) |
| ;; |
| *) |
| if ! mount -t "$MOUNTFS" "${MOUNTDEVICE}" "$MNTPOINTRW" -o ${MOUNTOPTS}${SELINUXOPTS}rw ; then |
| echo "MOUNT FAILED." |
| for lodev in $LODEVICES; do |
| while ! losetup -d "$lodev"; do |
| sleep 1 |
| done |
| done |
| for i in $(range 0 $((NDEVICES-1)) 1); do |
| rm "$FSIMAGEP${i}.img" |
| done |
| exit 1; |
| fi |
| ;; |
| esac |
| case x"$fs" in |
| # FS LIMITATION: redundant storage |
| xmdraid* | xlvm*) |
| BLOCKCNT=1048576;; |
| x"zfs_raid"* | x"zfs_stripe"* | x"zfs_mirror"* | x"btrfs_raid"*) |
| BLOCKCNT=1048576;; |
| |
| # FS LIMITATION: small filesystems |
| x"vfat16a" | x"msdos16a") |
| BLOCKCNT=65536;; |
| x"vfat12a" | xmsdos12a) |
| BLOCKCNT=32768;; |
| xminix) |
| BLOCKCNT=2621440;; |
| xvfat16 | xmsdos16) |
| if [ $BLKSIZE = 512 ] || [ $BLKSIZE = 1024 ]; then |
| BLOCKCNT=1048576 |
| else |
| BLOCKCNT=5242880 |
| fi |
| ;; |
| xvfat12 | xmsdos12) |
| BLOCKCNT=$((100*BLKSIZE)) |
| if [ $BLOCKCNT -gt 5242880 ]; then |
| BLOCKCNT=5242880; |
| fi |
| ;; |
| *) |
| BLOCKCNT=5242880;; |
| esac |
| # Make sure file is not exact multiple of block size. This helps to force |
| # tail packing in case of squash4. |
| : $((BLOCKCNT--)) |
| case x"$fs" in |
| x"ntfscomp") |
| setfattr -h -v 0x00000800 -n system.ntfs_attrib_be "$MNTPOINTRW/$OSDIR";; |
| esac |
| # OS LIMITATION: No AFS support under GNU/Linux |
| mkdir "$MNTPOINTRW/$OSDIR/sdir" |
| mkdir -p "$MNTPOINTRW/$OSDIR/$PDIR" |
| "@builddir@"/garbage-gen $BLOCKCNT > "$MNTPOINTRW/$OSDIR/sdir/2.img" |
| "@builddir@"/garbage-gen $BLOCKCNT > "$MNTPOINTRW/$OSDIR/$BASEFILE" |
| "@builddir@"/garbage-gen $BLOCKCNT > "$MNTPOINTRW/$OSDIR/$NASTYFILE" |
| "@builddir@"/garbage-gen $BLOCKCNT > "$MNTPOINTRW/$OSDIR/$IFILE" |
| "@builddir@"/garbage-gen $BLOCKCNT > "$MNTPOINTRW/$OSDIR/$LONGNAME" |
| "@builddir@"/garbage-gen $BLOCKCNT > "$MNTPOINTRW/$OSDIR/$PDIR/$PFIL" |
| if [ $PDIR != $PDIR2 ]; then |
| "@builddir@"/garbage-gen $BLOCKCNT > "$MNTPOINTRW/$OSDIR/${PDIR2}/$PFIL" |
| fi |
| "@builddir@"/garbage-gen $BLOCKCNT > "$MNTPOINTRW/$OSDIR/CaSe" |
| if [ x$CASESENS = xy ]; then |
| "@builddir@"/garbage-gen $BLOCKCNT > "$MNTPOINTRW/$OSDIR/cAsE" |
| fi |
| if (test x$fs = xvfat12a || test x$fs = xmsdos12a) && test x$BLKSIZE = x131072; then |
| # With this config there isn't enough space for full copy. |
| # Copy as much as we can |
| cp "${CFILESRC}" "$MNTPOINTRW/$OSDIR/${CFILE}" &> /dev/null; |
| else |
| |
| cp "${CFILESRC}" "$MNTPOINTRW/$OSDIR/${CFILE}"; |
| |
| fi |
| |
| if [ x$NOSYMLINK != xy ]; then |
| ln -s "$BASEFILE" "$MNTPOINTRW/$OSDIR/$BASESYM" |
| ln -s "2.img" "$MNTPOINTRW/$OSDIR/$SSYM" |
| ln -s "../1.img" "$MNTPOINTRW/$OSDIR/$USYM" |
| ln -s "$LONGNAME" "$MNTPOINTRW/$OSDIR/$LONGSYM" |
| ln -s "${PDIR2}/$PFIL" "$MNTPOINTRW/$OSDIR/$PSYM" |
| ln -s "$IFILE" "$MNTPOINTRW/$OSDIR/$ISYM" |
| fi |
| if [ x$NOHARDLINK != xy ]; then |
| ln "$MNTPOINTRW/$OSDIR/$BASEFILE" "$MNTPOINTRW/$OSDIR/$BASEHARD" |
| fi |
| |
| case x"$fs" in |
| x"afs") |
| ;; |
| x"zfs"*) |
| while ! zpool export "$FSLABEL" ; do |
| sleep 1; |
| done |
| sleep 2 |
| ;; |
| x"tarfs") |
| (cd "$MASTER"; tar cf "${FSIMAGEP}0.img" .) ;; |
| x"cpio_"*) |
| (cd "$MASTER"; find . | cpio -o -H "$(echo ${fs} | sed 's@^cpio_@@')" > "${FSIMAGEP}0.img" ) ;; |
| x"ziso9660") |
| FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00); |
| 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" ;; |
| x"iso9660") |
| FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00); |
| 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" ;; |
| x"joliet") |
| FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00); |
| 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" ;; |
| x"rockridge") |
| FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00); |
| 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" ;; |
| x"rockridge_joliet") |
| FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00); |
| 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" ;; |
| x"iso9660_1999") |
| FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00); |
| 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" ;; |
| x"joliet_1999") |
| FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00); |
| 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" ;; |
| x"rockridge_1999") |
| FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00); |
| 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" ;; |
| x"rockridge_joliet_1999") |
| FSUUID=$(date -u +%Y-%m-%d-%H-%M-%S-00); |
| 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" ;; |
| x"romfs") |
| genromfs -V "$FSLABEL" -f "${FSIMAGEP}0.img" -d "$MASTER" ;; |
| xsquash4_*) |
| echo mksquashfs "$MASTER" "${FSIMAGEP}0.img" -always-use-fragments -comp "${fs/squash4_/}" -b $BLKSIZE |
| mksquashfs "$MASTER" "${FSIMAGEP}0.img" -always-use-fragments -comp "${fs/squash4_/}" -b $BLKSIZE ;; |
| x"bfs") |
| sleep 1 |
| fusermount -u "$MNTPOINTRW" |
| ;; |
| xlvm*) |
| sleep 1 |
| for try in $(range 0 20 1); do |
| if umount "$MNTPOINTRW" ; then |
| break; |
| fi |
| sleep 1; |
| done |
| UMOUNT_TIME=$(date -u "+%Y-%m-%d %H:%M:%S") |
| sleep 1 |
| vgchange -a n grub_test |
| ;; |
| xmdraid*) |
| sleep 1 |
| for try in $(range 0 20 1); do |
| if umount "$MNTPOINTRW" ; then |
| break; |
| fi |
| sleep 1; |
| done |
| UMOUNT_TIME=$(date -u "+%Y-%m-%d %H:%M:%S") |
| sleep 1 |
| mdadm --stop /dev/md/"${fs}_$NDEVICES" |
| ;; |
| *) |
| sleep 1 |
| for try in $(range 0 20 1); do |
| if umount "$MNTPOINTRW" ; then |
| break; |
| fi |
| sleep 1; |
| done |
| ;; |
| esac |
| sleep 1 |
| |
| case x"$fs" in |
| x"zfs"*) |
| "zpool" import -d /dev -R "$MNTPOINTRO" "$FSLABEL" |
| ;; |
| x"tarfs") |
| ;; |
| x"cpio_"*) |
| ;; |
| x"ziso9660") |
| ;; |
| xiso9660 | xrockridge | xjoliet | xrockridge_joliet) |
| ;; |
| xiso9660_1999 | xrockridge_1999 | xjoliet_1999 | xrockridge_joliet_1999) |
| ;; |
| x"romfs") |
| ;; |
| xsquash4_*) |
| ;; |
| xlvm*) |
| vgchange -a y grub_test |
| sleep 1 |
| mount -t "$MOUNTFS" "${MOUNTDEVICE}" "$MNTPOINTRO" -o ${MOUNTOPTS}${SELINUXOPTS}ro ;; |
| xmdraid*) |
| mdadm --assemble /dev/md/"${fs}_$NDEVICES" $LODEVICES |
| sleep 1 |
| mount -t "$MOUNTFS" "${MOUNTDEVICE}" "$MNTPOINTRO" -o ${MOUNTOPTS}${SELINUXOPTS}ro ;; |
| *) |
| mount -t "$MOUNTFS" "${MOUNTDEVICE}" "$MNTPOINTRO" -o ${MOUNTOPTS}${SELINUXOPTS}ro ;; |
| esac |
| |
| run_grubfstest ls -- -la |
| case x"$fs" in |
| x"zfs"*) |
| LSROUT=$(run_grubfstest ls -- -la "($GRUBDEVICE)/grub fs@/");; |
| *) |
| LSROUT=$(run_grubfstest ls -- -la "($GRUBDEVICE)/");; |
| esac |
| if echo "$LSROUT" | grep -F " $BASEFILE" | grep "$BLOCKCNT" > /dev/null; then |
| : |
| else |
| echo LIST FAIL |
| echo "$LSROUT" |
| TZ=UTC ls -l "$MNTPOINTRO" |
| exit 1 |
| fi |
| |
| if echo "$LSROUT" | grep -F " $NASTYFILE" | grep "$BLOCKCNT"> /dev/null; then |
| : |
| else |
| echo NLIST FAIL |
| echo "$LSROUT" |
| TZ=UTC ls -lA "$MNTPOINTRO" |
| exit 1 |
| fi |
| |
| if echo "$LSROUT" | grep -F " $IFILE" | grep "$BLOCKCNT"> /dev/null; then |
| : |
| else |
| echo ILIST FAIL |
| echo "$LSROUT" |
| TZ=UTC ls -l "$MNTPOINTRO" |
| exit 1 |
| fi |
| |
| if echo "$LSROUT" | grep -F " $LONGNAME" | grep "$BLOCKCNT"> /dev/null; then |
| : |
| else |
| echo LONG LIST FAIL |
| echo "$LSROUT" |
| TZ=UTC ls -l "$MNTPOINTRO" |
| exit 1 |
| fi |
| |
| if [ x$NOFILETIME != xy ]; then |
| filtime=$(TZ=UTC ls --time-style=+%Y%m%d%H%M%S -l -d "$MNTPOINTRO/$OSDIR/$BASEFILE"|awk '{print $6; }') |
| if echo "$LSROUT" | grep -F "$filtime $BASEFILE" > /dev/null; then |
| : |
| else |
| echo TIME FAIL |
| echo "$LSROUT" |
| TZ=UTC ls -l "$MNTPOINTRO" |
| exit 1 |
| fi |
| |
| filtime=$(TZ=UTC ls --time-style=+%Y%m%d%H%M%S -l -d "$MNTPOINTRO/$OSDIR/$LONGNAME"|awk '{print $6; }') |
| if echo "$LSROUT" | grep -F "$filtime $LONGNAME" > /dev/null; then |
| : |
| else |
| echo LONG TIME FAIL |
| echo "$LSROUT" |
| TZ=UTC ls -l "$MNTPOINTRO" |
| exit 1 |
| fi |
| fi |
| |
| case x"$fs" in |
| x"zfs"*) |
| LSROUT=$(run_grubfstest ls -- -la "($GRUBDEVICE)/grub fs@/.");; |
| *) |
| LSROUT=$(run_grubfstest ls -- -la "($GRUBDEVICE)/.");; |
| esac |
| if echo "$LSROUT" | grep -F " $BASEFILE" | grep "$BLOCKCNT" > /dev/null; then |
| : |
| else |
| echo DOT IN ROOTDIR FAIL |
| echo "$LSROUT" |
| TZ=UTC ls -l "$MNTPOINTRO" |
| exit 1 |
| fi |
| |
| case x"$fs" in |
| x"zfs"*) |
| ;; |
| *) |
| LSROUT=$(run_grubfstest ls -- -la "($GRUBDEVICE)/.."); |
| if echo "$LSROUT" | grep -F " $BASEFILE" | grep "$BLOCKCNT" > /dev/null; then |
| : |
| else |
| echo DOTDOT IN ROOTDIR FAIL |
| echo "$LSROUT" |
| TZ=UTC ls -l "$MNTPOINTRO" |
| exit 1 |
| fi |
| ;; |
| esac |
| |
| case x"$fs" in |
| x"zfs"*) |
| LSROUT=$(run_grubfstest ls -- -l "($GRUBDEVICE)/grub fs@/////sdir");; |
| *) |
| LSROUT=$(run_grubfstest ls -- -l "($GRUBDEVICE)/////sdir");; |
| esac |
| if echo "$LSROUT" | grep -F " 2.img" | grep $BLOCKCNT > /dev/null; then |
| : |
| else |
| echo SLIST FAIL |
| echo "$LSROUT" |
| TZ=UTC ls -l "$MNTPOINTRO/sdir" |
| exit 1 |
| fi |
| |
| case x"$fs" in |
| x"zfs"*) |
| LSROUT=$(run_grubfstest ls -- -l "($GRUBDEVICE)/grub fs@/$PDIR");; |
| *) |
| LSROUT=$(run_grubfstest ls -- -l "($GRUBDEVICE)/$PDIR");; |
| esac |
| if echo "$LSROUT" | grep -F " p.img" | grep $BLOCKCNT > /dev/null; then |
| : |
| else |
| echo PLIST FAIL |
| echo "$LSROUT" |
| TZ=UTC ls -l "$MNTPOINTRO/$PDIR" |
| exit 1 |
| fi |
| |
| case x"$fs" in |
| x"zfs"*) |
| LSROUT=$(run_grubfstest ls -- -l "($GRUBDEVICE)/grub fs@/sdir/.");; |
| *) |
| LSROUT=$(run_grubfstest ls -- -l "($GRUBDEVICE)/sdir/.");; |
| esac |
| if echo "$LSROUT" | grep -F " 2.img" | grep $BLOCKCNT > /dev/null; then |
| : |
| else |
| echo DOT IN SUBDIR FAIL |
| echo "$LSROUT" |
| TZ=UTC ls -l "$MNTPOINTRO/$OSDIR/sdir" |
| exit 1 |
| fi |
| |
| case x"$fs" in |
| x"zfs"*) |
| LSROUT=$(run_grubfstest ls -- -l "($GRUBDEVICE)/grub fs@/sdir/../sdir");; |
| *) |
| LSROUT=$(run_grubfstest ls -- -l "($GRUBDEVICE)/sdir/../sdir");; |
| esac |
| if echo "$LSROUT" | grep -F " 2.img" | grep $BLOCKCNT > /dev/null; then |
| : |
| else |
| echo DOTDOT IN SUBDIR FAIL |
| echo "$LSROUT" |
| TZ=UTC ls -l "$MNTPOINTRO/$OSDIR/ssdir" |
| exit 1 |
| fi |
| |
| LSOUT=`run_grubfstest ls -- -l "($GRUBDEVICE)"` |
| if [ x"$NOFSLABEL" = xy ]; then |
| : |
| elif echo "$LSOUT" | grep -F "Label \`$FSLABEL'" > /dev/null; then |
| : |
| else |
| echo LABEL FAIL |
| echo "$LSOUT" |
| blkid "${MOUNTDEVICE}" |
| exit 1 |
| fi |
| |
| # Inconsistencies between GRUB and blkid. |
| case x"$fs" in |
| x"iso9660" | x"ziso9660" | xrockridge | xjoliet | xrockridge_joliet | x"iso9660_1999" | xrockridge_1999 | xjoliet_1999 | xrockridge_joliet_1999) ;; |
| x"zfs"*) |
| for lodev in $LODEVICES; do |
| FSUUID=$(printf "%016x\n" $(blkid -o export "$lodev" |grep -F UUID=|sed s,UUID=,,g)) |
| if [ "$FSUUID" != 0000000000000000 ]; then |
| break; |
| fi |
| done;; |
| *) |
| FSUUID=`blkid -o export "${MOUNTDEVICE}" |grep -F UUID=|sed s,UUID=,,g` |
| ;; |
| esac |
| case x"$fs" in |
| x"hfs"*) |
| GRUBUUID="`run_grubfstest xnu_uuid "$GRUBDEVICE"`" |
| if [ x"$GRUBUUID" = x"$FSUUID" ]; then |
| : |
| else |
| echo UUID FAIL |
| echo "$LSOUT" |
| echo "$GRUBUUID" |
| for lodev in $LODEVICES; do |
| blkid "$lodev" |
| done |
| exit 1 |
| fi |
| ;; |
| # FS LIMITATION: romfs, cpio, tar, squash4, minix, AFS, old reiserfs and minix2 |
| # have no UUID. |
| # GRUB LIMITATION: use creation date for squash4, AFFS and SFS? |
| # GRUB LIMITATION: use tags serials on UDF? |
| # GRUB LIMITATION: use root ctime on cpio, tar, minix*, UDF, reiserfs_old? |
| # GRUB LIMITATION: Support Atari UUIDs |
| x"romfs" | x"cpio_"* | x"tarfs" | x"squash4_"* | x"minix" \ |
| | x"minix2" | x"minix3" | x"affs" | xaffs_intl \ |
| | x"udf" | xvfat12a | xvfat16a | xmsdos12a | xmsdos16a | xafs | xsfs* \ |
| | xreiserfs_old) |
| ;; |
| *) |
| if [ x"$FSUUID" = x ]; then |
| echo "Warning: blkid couldn't retrieve UUID" |
| elif echo "$LSOUT" | grep -F 'UUID '"$FSUUID"' ' > /dev/null; then |
| : |
| else |
| echo UUID FAIL |
| echo "$FSUUID" |
| echo "$LSOUT" |
| blkid "${MOUNTDEVICE}" |
| exit 1 |
| fi |
| ;; |
| esac |
| |
| if [ x$NOFSTIME != xy ]; then |
| case x$fs in |
| xiso9660 | xziso9660 | xrockridge | xjoliet | xrockridge_joliet | xiso9660_1999 | xrockridge_1999 | xjoliet_1999 | xrockridge_joliet_1999) |
| FSTIME="$(date -d "$(echo ${FSUUID} | awk -F - '{ print $1"-"$2"-"$3" "$4":"$5":"$6 ;}')" '+%Y-%m-%d %H:%M:%S')";; |
| xlvm*|xmdraid*) |
| # With some abstractions like mdraid flushing to disk |
| # may be delayed for a long time. |
| FSTIME="$UMOUNT_TIME";; |
| *) |
| FSTIME="$(TZ=UTC ls --time-style="+%Y-%m-%d_%H:%M:%S" -l -d "${FSIMAGEP}0.img"|awk '{print $6; }'|sed 's,_, ,g')";; |
| esac |
| # With some abstractions like mdraid computing of UMOUNT_TIME |
| # is not precise. Account for small difference here. |
| FSTIMEM1="$(date -d "$FSTIME UTC -1 second" -u "+%Y-%m-%d %H:%M:%S")" |
| FSTIMEM2="$(date -d "$FSTIME UTC -2 second" -u "+%Y-%m-%d %H:%M:%S")" |
| FSTIMEM3="$(date -d "$FSTIME UTC -3 second" -u "+%Y-%m-%d %H:%M:%S")" |
| |
| 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 |
| : |
| else |
| echo FSTIME FAIL |
| echo "$FSTIME" |
| echo "$LSOUT" |
| exit 1 |
| fi |
| fi |
| |
| if [ x$NOHARDLINK != xy ]; then |
| if run_grubfstest cmp "$GRUBDIR/$BASEHARD" "$MNTPOINTRO/$OSDIR/$BASEFILE" ; then |
| : |
| else |
| echo HARDLINK FAIL |
| exit 1 |
| fi |
| fi |
| |
| if [ x$NOSYMLINK != xy ]; then |
| if run_grubfstest cmp "$GRUBDIR/$BASESYM" "$MNTPOINTRO/$OSDIR/$BASEFILE" ; then |
| : |
| else |
| echo SYMLINK FAIL |
| exit 1 |
| fi |
| if run_grubfstest cmp "$GRUBDIR/$LONGSYM" "$MNTPOINTRO/$OSDIR/$LONGNAME" ; then |
| : |
| else |
| echo LONG SYMLINK FAIL |
| exit 1 |
| fi |
| if run_grubfstest cmp "$GRUBDIR/$ISYM" "$MNTPOINTRO/$OSDIR/$IFILE" ; then |
| : |
| else |
| echo INTL SYMLINK FAIL |
| exit 1 |
| fi |
| if run_grubfstest cmp "$GRUBDIR/$SSYM" "$MNTPOINTRO/$OSDIR/////sdir/////2.img" ; then |
| : |
| else |
| echo SDIR SYMLINK FAIL |
| exit 1 |
| fi |
| if run_grubfstest cmp "$GRUBDIR/$USYM" "$MNTPOINTRO/$OSDIR/1.img" ; then |
| : |
| else |
| echo SDIR SYMLINK FAIL |
| exit 1 |
| fi |
| if run_grubfstest cmp "$GRUBDIR/$PSYM" "$MNTPOINTRO/$OSDIR/${PDIR2}/$PFIL" ; then |
| : |
| else |
| echo PATH LONG SYMLINK FAIL |
| exit 1 |
| fi |
| fi |
| |
| if run_grubfstest cmp "$GRUBDIR/$BASEFILE" "$MNTPOINTRO/$OSDIR/$BASEFILE" ; then |
| : |
| else |
| echo READ FAIL |
| exit 1 |
| fi |
| if run_grubfstest cmp "$GRUBDIR/$NASTYFILE" "$MNTPOINTRO/$OSDIR/$NASTYFILE" ; then |
| : |
| else |
| echo NREAD FAIL |
| exit 1 |
| fi |
| # Reference archive contains original name |
| if run_grubfstest cmp "$GRUBDIR/$LONGNAME" "$MNTPOINTRO/$OSDIR/$LONGNAME" ; then |
| : |
| else |
| echo LONG NAME READ FAIL |
| exit 1 |
| fi |
| if run_grubfstest cmp "$GRUBDIR/////sdir/////2.img" "$MNTPOINTRO/$OSDIR/sdir/2.img" ; then |
| : |
| else |
| echo LONG NAME READ FAIL |
| exit 1 |
| fi |
| if run_grubfstest cmp "$GRUBDIR/$IFILE" "$MNTPOINTRO/$OSDIR/$IFILE" ; then |
| : |
| else |
| echo IREAD FAIL |
| exit 1 |
| fi |
| if run_grubfstest cmp "$GRUBDIR/$PDIR/$PFIL" "$MNTPOINTRO/$OSDIR/$PDIR/$PFIL" ; then |
| : |
| else |
| echo PREAD FAIL |
| echo cmp "$GRUBDIR/$PDIR/$PFIL" "$MNTPOINTRO/$OSDIR/$PDIR/$PFIL" |
| exit 1 |
| fi |
| ok=true |
| if ! run_grubfstest cmp "$GRUBDIR/${CFILE}" "$MNTPOINTRO/$OSDIR/${CFILE}" ; then |
| ok=false; |
| fi |
| if test x$ok = xtrue; then |
| : |
| else |
| echo CREAD FAIL |
| exit 1 |
| fi |
| |
| if [ x$CASESENS = xy ]; then |
| if run_grubfstest cmp "$GRUBDIR/CaSe" "$MNTPOINTRO/$OSDIR/CaSe" ; then |
| : |
| else |
| echo CASE1 READ FAIL |
| exit 1 |
| fi |
| if run_grubfstest cmp "$GRUBDIR/cAsE" "$MNTPOINTRO/$OSDIR/cAsE" ; then |
| : |
| else |
| exit 1 |
| fi |
| if cmp "$MNTPOINTRO/$OSDIR/cAsE" "$MNTPOINTRO/$OSDIR/CaSe" > /dev/null ; then |
| exit 1 |
| fi |
| if test x$ok = xtrue; then |
| : |
| else |
| echo CASE READ FAIL |
| exit 1 |
| fi |
| else |
| # OS LIMITATION: Linux make FAT (partially) case-sensitive... |
| # ISO9660 is generated and master doesn't change |
| case x$fs in |
| xiso9660 | xvfat*) |
| CASEX=CaSe;; |
| *) |
| CASEX=cAsE;; |
| esac |
| if run_grubfstest cmp "$GRUBDIR/CaSe" "$MNTPOINTRO/$OSDIR/${CASEX}" ; then |
| : |
| else |
| echo CASE1 READ FAIL |
| exit 1 |
| fi |
| if run_grubfstest cmp "$GRUBDIR/cAsE" "$MNTPOINTRO/$OSDIR/CaSe" ; then |
| : |
| else |
| echo CASE2 READ FAIL |
| exit 1 |
| fi |
| if ! cmp "$MNTPOINTRO/$OSDIR/CaSe" "$MNTPOINTRO/$OSDIR/${CASEX}" > /dev/null ; then |
| echo CASE CMP READ FAIL |
| exit 1 |
| fi |
| if test x$ok = xtrue; then |
| : |
| else |
| echo CASE READ FAIL |
| exit 1 |
| fi |
| fi |
| |
| case x"$fs" in |
| x"zfs"*) |
| while ! zpool export "$FSLABEL" ; do |
| sleep 1; |
| done |
| sleep 5;; |
| x"tarfs" | x"cpio_"* | xrockridge | xjoliet | xrockridge_joliet | x"ziso9660" | x"romfs" | x"squash4_"* | xiso9660 | xiso9660_1999 | xrockridge_1999 | xjoliet_1999 | xrockridge_joliet_1999) |
| rm -rf "$MNTPOINTRW";; |
| x"afs") |
| rm -rf "$MNTPOINTRO" |
| ;; |
| *) |
| sleep 1 |
| umount "$MNTPOINTRO" || true |
| umount "$MNTPOINTRW" || true |
| esac |
| sleep 1 |
| case x"$fs" in |
| xmdraid*) |
| mdadm --stop /dev/md/"${fs}_$NDEVICES" |
| sleep 1 |
| ;; |
| xlvm*) |
| vgchange -a n grub_test |
| sleep 1 |
| ;; |
| esac |
| case x"$fs" in |
| 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) ;; |
| *) |
| for lodev in $LODEVICES; do |
| while ! losetup -d "$lodev"; do |
| sleep 1 |
| done |
| done;; |
| esac |
| for i in $(range 0 $((NDEVICES-1)) 1); do |
| rm "$FSIMAGEP${i}.img" |
| done |
| if [ x"$fs" = x"zfs" ]; then |
| rmdir "$MNTPOINTRW"/"grub fs" || true |
| rmdir "$MNTPOINTRO"/"grub fs" || true |
| fi |
| rm -rf "$MNTPOINTRW" || true |
| rm -rf "$MNTPOINTRO" || true |
| done |
| done |
| done |
| rmdir "${tempdir}" |