grub-fs-tester.in 52 KB

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