grub-fs-tester.in 53 KB

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