Merge lp:~psusi/ubuntu/quantal/grub2/fix-ldm into lp:ubuntu/quantal-proposed/grub2

Proposed by Phillip Susi
Status: Work in progress
Proposed branch: lp:~psusi/ubuntu/quantal/grub2/fix-ldm
Merge into: lp:ubuntu/quantal-proposed/grub2
Diff against target: 2237 lines (+2103/-3)
10 files modified
.pc/applied-patches (+1/-0)
.pc/ldm-require-sfs-partition.patch/Makefile.util.def (+783/-0)
.pc/ldm-require-sfs-partition.patch/grub-core/disk/ldm.c (+1010/-0)
.pc/ldm-require-sfs-partition.patch/include/grub/msdos_partition.h (+126/-0)
Makefile.util.def (+1/-1)
debian/changelog (+7/-0)
debian/patches/ldm-require-sfs-partition.patch (+136/-0)
debian/patches/series (+1/-0)
grub-core/disk/ldm.c (+37/-2)
include/grub/msdos_partition.h (+1/-0)
To merge this branch: bzr merge lp:~psusi/ubuntu/quantal/grub2/fix-ldm
Reviewer Review Type Date Requested Status
Ubuntu Development Team Pending
Review via email: mp+137594@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Dimitri John Ledkov (xnox) wrote :

Setting to work in progress.
Should first be fixed / accepted in the devel release.
https://code.launchpad.net/~psusi/ubuntu/raring/grub2/fix-ldm/+merge/137588/comments/304031

Unmerged revisions

161. By Phillip Susi

debian/ldm-require-sfs-partition.patch: Only recognize ldm partition
table if there is an SFS partition listed in the DOS MBR (LP: #1061255)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file '.pc/applied-patches'
2--- .pc/applied-patches 2012-10-14 09:30:55 +0000
3+++ .pc/applied-patches 2012-12-03 15:27:20 +0000
4@@ -55,3 +55,4 @@
5 ubuntu_linuxefi_debug.patch
6 ubuntu_mount_readdir_symlink_failures.patch
7 ubuntu_initrd_addr_min.patch
8+ldm-require-sfs-partition.patch
9
10=== added directory '.pc/ldm-require-sfs-partition.patch'
11=== added file '.pc/ldm-require-sfs-partition.patch/.timestamp'
12=== added file '.pc/ldm-require-sfs-partition.patch/Makefile.util.def'
13--- .pc/ldm-require-sfs-partition.patch/Makefile.util.def 1970-01-01 00:00:00 +0000
14+++ .pc/ldm-require-sfs-partition.patch/Makefile.util.def 2012-12-03 15:27:20 +0000
15@@ -0,0 +1,783 @@
16+AutoGen definitions Makefile.tpl;
17+
18+library = {
19+ name = libgrubkern.a;
20+ cflags = '$(CFLAGS_GNULIB)';
21+ cppflags = '$(CPPFLAGS_GNULIB)';
22+
23+ common = util/misc.c;
24+ common = grub-core/kern/command.c;
25+ common = grub-core/kern/device.c;
26+ common = grub-core/kern/disk.c;
27+ common = util/getroot.c;
28+ common = util/raid.c;
29+ common = grub-core/kern/emu/hostdisk.c;
30+ common = grub-core/kern/emu/misc.c;
31+ common = grub-core/kern/emu/mm.c;
32+ common = grub-core/kern/env.c;
33+ common = grub-core/kern/err.c;
34+ common = grub-core/kern/file.c;
35+ common = grub-core/kern/fs.c;
36+ common = grub-core/kern/list.c;
37+ common = grub-core/kern/misc.c;
38+ common = grub-core/kern/partition.c;
39+ common = grub-core/lib/crypto.c;
40+ common = grub-core/disk/luks.c;
41+ common = grub-core/disk/geli.c;
42+ common = grub-core/disk/cryptodisk.c;
43+ common = grub-core/disk/AFSplitter.c;
44+ common = grub-core/lib/pbkdf2.c;
45+ common = grub-core/commands/extcmd.c;
46+ common = grub-core/lib/arg.c;
47+ common = grub-core/disk/ldm.c;
48+ common = grub-core/disk/diskfilter.c;
49+ common = grub-core/partmap/gpt.c;
50+};
51+
52+library = {
53+ name = libgrubmods.a;
54+ cflags = '$(CFLAGS_POSIX) -Wno-undef -Wno-error=missing-noreturn';
55+ cppflags = '-I$(top_srcdir)/grub-core/lib/minilzo -I$(srcdir)/grub-core/lib/xzembed -DMINILZO_HAVE_CONFIG_H';
56+
57+ common_nodist = grub_script.tab.c;
58+ common_nodist = grub_script.yy.c;
59+ common_nodist = libgrub_a_init.c;
60+ common_nodist = grub_script.yy.h;
61+ common_nodist = grub_script.tab.h;
62+
63+ common = grub-core/commands/blocklist.c;
64+ common = grub-core/commands/xnu_uuid.c;
65+ common = grub-core/commands/testload.c;
66+ common = grub-core/commands/ls.c;
67+ common = grub-core/disk/dmraid_nvidia.c;
68+ common = grub-core/disk/loopback.c;
69+ common = grub-core/disk/lvm.c;
70+ common = grub-core/disk/mdraid_linux.c;
71+ common = grub-core/disk/mdraid_linux_be.c;
72+ common = grub-core/disk/mdraid1x_linux.c;
73+ common = grub-core/disk/raid5_recover.c;
74+ common = grub-core/disk/raid6_recover.c;
75+ common = grub-core/fs/affs.c;
76+ common = grub-core/fs/afs.c;
77+ common = grub-core/fs/bfs.c;
78+ common = grub-core/fs/btrfs.c;
79+ common = grub-core/fs/cpio.c;
80+ common = grub-core/fs/cpio_be.c;
81+ common = grub-core/fs/odc.c;
82+ common = grub-core/fs/newc.c;
83+ common = grub-core/fs/ext2.c;
84+ common = grub-core/fs/fat.c;
85+ common = grub-core/fs/exfat.c;
86+ common = grub-core/fs/fshelp.c;
87+ common = grub-core/fs/hfs.c;
88+ common = grub-core/fs/hfsplus.c;
89+ common = grub-core/fs/iso9660.c;
90+ common = grub-core/fs/jfs.c;
91+ common = grub-core/fs/minix.c;
92+ common = grub-core/fs/minix2.c;
93+ common = grub-core/fs/minix3.c;
94+ common = grub-core/fs/minix_be.c;
95+ common = grub-core/fs/minix2_be.c;
96+ common = grub-core/fs/minix3_be.c;
97+ common = grub-core/fs/nilfs2.c;
98+ common = grub-core/fs/ntfs.c;
99+ common = grub-core/fs/ntfscomp.c;
100+ common = grub-core/fs/reiserfs.c;
101+ common = grub-core/fs/romfs.c;
102+ common = grub-core/fs/sfs.c;
103+ common = grub-core/fs/squash4.c;
104+ common = grub-core/fs/tar.c;
105+ common = grub-core/fs/udf.c;
106+ common = grub-core/fs/ufs2.c;
107+ common = grub-core/fs/ufs.c;
108+ common = grub-core/fs/xfs.c;
109+ common = grub-core/fs/zfs/zfscrypt.c;
110+ common = grub-core/fs/zfs/zfs.c;
111+ common = grub-core/fs/zfs/zfsinfo.c;
112+ common = grub-core/fs/zfs/zfs_lzjb.c;
113+ common = grub-core/fs/zfs/zfs_sha256.c;
114+ common = grub-core/fs/zfs/zfs_fletcher.c;
115+ common = grub-core/lib/envblk.c;
116+ common = grub-core/lib/hexdump.c;
117+ common = grub-core/lib/LzFind.c;
118+ common = grub-core/lib/LzmaEnc.c;
119+ common = grub-core/lib/crc.c;
120+ common = grub-core/lib/adler32.c;
121+ common = grub-core/lib/crc64.c;
122+ common = grub-core/normal/datetime.c;
123+ common = grub-core/normal/misc.c;
124+ common = grub-core/partmap/acorn.c;
125+ common = grub-core/partmap/amiga.c;
126+ common = grub-core/partmap/apple.c;
127+ common = grub-core/partmap/msdos.c;
128+ common = grub-core/partmap/sun.c;
129+ common = grub-core/partmap/plan.c;
130+ common = grub-core/partmap/dvh.c;
131+ common = grub-core/partmap/sunpc.c;
132+ common = grub-core/partmap/bsdlabel.c;
133+ common = grub-core/script/function.c;
134+ common = grub-core/script/lexer.c;
135+ common = grub-core/script/main.c;
136+ common = grub-core/script/script.c;
137+ common = grub-core/script/argv.c;
138+ common = grub-core/io/gzio.c;
139+ common = grub-core/io/lzopio.c;
140+ common = grub-core/kern/ia64/dl_helper.c;
141+ common = grub-core/lib/minilzo/minilzo.c;
142+ common = grub-core/lib/xzembed/xz_dec_bcj.c;
143+ common = grub-core/lib/xzembed/xz_dec_lzma2.c;
144+ common = grub-core/lib/xzembed/xz_dec_stream.c;
145+};
146+
147+program = {
148+ name = grub-bin2h;
149+ common = util/bin2h.c;
150+ ldadd = libgrubmods.a;
151+ ldadd = libgrubgcry.a;
152+ ldadd = libgrubkern.a;
153+ ldadd = grub-core/gnulib/libgnu.a;
154+ ldadd = '$(LIBINTL) $(LIBDEVMAPPER)';
155+ installdir = noinst;
156+};
157+
158+program = {
159+ name = grub-mkimage;
160+ mansection = 1;
161+
162+ common = util/grub-mkimage.c;
163+ common = util/resolve.c;
164+ common = grub-core/kern/emu/argp_common.c;
165+
166+ extra_dist = util/grub-mkimagexx.c;
167+
168+ ldadd = libgrubmods.a;
169+ ldadd = libgrubgcry.a;
170+ ldadd = libgrubkern.a;
171+ ldadd = grub-core/gnulib/libgnu.a;
172+ ldadd = '$(LIBLZMA)';
173+ ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
174+ cppflags = '-DGRUB_PKGLIBDIR=\"$(pkglibdir)\"';
175+};
176+
177+program = {
178+ name = grub-mkrelpath;
179+ mansection = 1;
180+
181+ common = util/grub-mkrelpath.c;
182+ common = grub-core/kern/emu/argp_common.c;
183+
184+ ldadd = libgrubmods.a;
185+ ldadd = libgrubgcry.a;
186+ ldadd = libgrubkern.a;
187+ ldadd = grub-core/gnulib/libgnu.a;
188+ ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
189+};
190+
191+program = {
192+ name = grub-script-check;
193+ mansection = 1;
194+
195+ common = util/grub-script-check.c;
196+ common = grub-core/kern/emu/argp_common.c;
197+
198+ ldadd = libgrubmods.a;
199+ ldadd = libgrubgcry.a;
200+ ldadd = libgrubkern.a;
201+ ldadd = grub-core/gnulib/libgnu.a;
202+ ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
203+};
204+
205+program = {
206+ name = grub-editenv;
207+ mansection = 1;
208+
209+ common = util/grub-editenv.c;
210+
211+ ldadd = libgrubmods.a;
212+ ldadd = libgrubgcry.a;
213+ ldadd = libgrubkern.a;
214+ ldadd = grub-core/gnulib/libgnu.a;
215+ ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
216+};
217+
218+program = {
219+ name = grub-mkpasswd-pbkdf2;
220+ mansection = 1;
221+
222+ common = util/grub-mkpasswd-pbkdf2.c;
223+ common = grub-core/kern/emu/argp_common.c;
224+
225+ ldadd = libgrubmods.a;
226+ ldadd = libgrubgcry.a;
227+ ldadd = libgrubkern.a;
228+ ldadd = grub-core/gnulib/libgnu.a;
229+ ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
230+ cflags = '$(CFLAGS_GCRY)';
231+ cppflags = '$(CPPFLAGS_GCRY)';
232+};
233+
234+program = {
235+ name = grub-macho2img;
236+ mansection = 1;
237+ common = util/grub-macho2img.c;
238+ condition = COND_APPLE_CC;
239+};
240+
241+program = {
242+ name = grub-pe2elf;
243+ mansection = 1;
244+ common = util/grub-pe2elf.c;
245+
246+ ldadd = libgrubmods.a;
247+ ldadd = libgrubgcry.a;
248+ ldadd = libgrubkern.a;
249+ ldadd = grub-core/gnulib/libgnu.a;
250+ ldadd = '$(LIBINTL)';
251+ condition = COND_GRUB_PE2ELF;
252+};
253+
254+program = {
255+ name = grub-fstest;
256+ mansection = 1;
257+ common_nodist = grub_fstest_init.c;
258+ common = util/grub-fstest.c;
259+ common = grub-core/kern/emu/hostfs.c;
260+ common = grub-core/disk/host.c;
261+
262+ cflags = '$(CFLAGS_GCRY)';
263+ cppflags = '$(CPPFLAGS_GCRY)';
264+
265+ ldadd = libgrubmods.a;
266+ ldadd = libgrubgcry.a;
267+ ldadd = libgrubkern.a;
268+ ldadd = grub-core/gnulib/libgnu.a;
269+ ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
270+};
271+
272+program = {
273+ name = grub-mount;
274+ mansection = 1;
275+ common_nodist = grub_fstest_init.c;
276+ common = util/grub-mount.c;
277+ common = grub-core/kern/emu/hostfs.c;
278+ common = grub-core/disk/host.c;
279+
280+ ldadd = libgrubmods.a;
281+ ldadd = libgrubgcry.a;
282+ ldadd = libgrubkern.a;
283+ ldadd = grub-core/gnulib/libgnu.a;
284+ ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM) -lfuse';
285+ condition = COND_GRUB_MOUNT;
286+};
287+
288+program = {
289+ name = grub-mkfont;
290+ mansection = 1;
291+ common = util/grub-mkfont.c;
292+ common = grub-core/unidata.c;
293+ common = grub-core/kern/emu/argp_common.c;
294+
295+ cflags = '$(freetype_cflags)';
296+
297+ ldadd = libgrubmods.a;
298+ ldadd = libgrubgcry.a;
299+ ldadd = libgrubkern.a;
300+ ldadd = grub-core/gnulib/libgnu.a;
301+ ldadd = '$(freetype_libs)';
302+ ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
303+ condition = COND_GRUB_MKFONT;
304+};
305+
306+program = {
307+ name = grub-mkdevicemap;
308+ installdir = sbin;
309+ mansection = 8;
310+
311+ common = util/grub-mkdevicemap.c;
312+ common = util/deviceiter.c;
313+ common = util/devicemap.c;
314+
315+ ldadd = libgrubmods.a;
316+ ldadd = libgrubgcry.a;
317+ ldadd = libgrubkern.a;
318+ ldadd = grub-core/gnulib/libgnu.a;
319+ ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
320+};
321+
322+program = {
323+ name = grub-probe;
324+ installdir = sbin;
325+ mansection = 8;
326+ common = util/grub-probe.c;
327+ common = util/ieee1275/ofpath.c;
328+ common = grub-core/kern/emu/argp_common.c;
329+
330+ ldadd = libgrubmods.a;
331+ ldadd = libgrubgcry.a;
332+ ldadd = libgrubkern.a;
333+ ldadd = grub-core/gnulib/libgnu.a;
334+ ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
335+};
336+
337+program = {
338+ name = grub-bios-setup;
339+ installdir = sbin;
340+ mansection = 8;
341+ common = util/grub-setup.c;
342+ common = util/lvm.c;
343+ common = grub-core/kern/emu/argp_common.c;
344+ common = grub-core/lib/reed_solomon.c;
345+
346+ ldadd = libgrubmods.a;
347+ ldadd = libgrubkern.a;
348+ ldadd = libgrubgcry.a;
349+ ldadd = grub-core/gnulib/libgnu.a;
350+ ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
351+ cppflags = '-DGRUB_SETUP_BIOS=1';
352+};
353+
354+program = {
355+ name = grub-sparc64-setup;
356+ installdir = sbin;
357+ mansection = 8;
358+ common = util/grub-setup.c;
359+ common = util/lvm.c;
360+ common = grub-core/kern/emu/argp_common.c;
361+ common = grub-core/lib/reed_solomon.c;
362+ common = util/ieee1275/ofpath.c;
363+
364+ ldadd = libgrubmods.a;
365+ ldadd = libgrubkern.a;
366+ ldadd = libgrubgcry.a;
367+ ldadd = grub-core/gnulib/libgnu.a;
368+ ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
369+ cppflags = '-DGRUB_SETUP_SPARC64=1';
370+};
371+
372+program = {
373+ name = grub-ofpathname;
374+ installdir = sbin;
375+ mansection = 8;
376+ common = util/ieee1275/grub-ofpathname.c;
377+ common = util/ieee1275/ofpath.c;
378+
379+ ldadd = libgrubmods.a;
380+ ldadd = libgrubgcry.a;
381+ ldadd = libgrubkern.a;
382+ ldadd = grub-core/gnulib/libgnu.a;
383+ ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBUTIL) $(LIBGEOM)';
384+};
385+
386+program = {
387+ name = grub-mklayout;
388+ mansection = 1;
389+
390+ common = util/grub-mklayout.c;
391+ common = grub-core/kern/emu/argp_common.c;
392+
393+ ldadd = libgrubmods.a;
394+ ldadd = libgrubgcry.a;
395+ ldadd = libgrubkern.a;
396+ ldadd = grub-core/gnulib/libgnu.a;
397+ ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
398+};
399+
400+data = {
401+ common = util/grub.d/README;
402+ installdir = grubconf;
403+};
404+
405+script = {
406+ name = '00_header';
407+ common = util/grub.d/00_header.in;
408+ installdir = grubconf;
409+};
410+
411+script = {
412+ name = '10_windows';
413+ common = util/grub.d/10_windows.in;
414+ installdir = grubconf;
415+ condition = COND_HOST_WINDOWS;
416+};
417+
418+script = {
419+ name = '10_hurd';
420+ common = util/grub.d/10_hurd.in;
421+ installdir = grubconf;
422+ condition = COND_HOST_HURD;
423+};
424+
425+script = {
426+ name = '10_kfreebsd';
427+ common = util/grub.d/10_kfreebsd.in;
428+ installdir = grubconf;
429+ condition = COND_HOST_KFREEBSD;
430+};
431+
432+script = {
433+ name = '10_illumos';
434+ common = util/grub.d/10_illumos.in;
435+ installdir = grubconf;
436+ condition = COND_HOST_ILLUMOS;
437+};
438+
439+script = {
440+ name = '10_netbsd';
441+ common = util/grub.d/10_netbsd.in;
442+ installdir = grubconf;
443+ condition = COND_HOST_NETBSD;
444+};
445+
446+script = {
447+ name = '10_linux';
448+ common = util/grub.d/10_linux.in;
449+ installdir = grubconf;
450+ condition = COND_HOST_LINUX;
451+};
452+
453+script = {
454+ name = '10_xnu';
455+ common = util/grub.d/10_xnu.in;
456+ installdir = grubconf;
457+ condition = COND_HOST_XNU;
458+};
459+
460+script = {
461+ name = '20_linux_xen';
462+ common = util/grub.d/20_linux_xen.in;
463+ installdir = grubconf;
464+ condition = COND_HOST_LINUX;
465+};
466+
467+script = {
468+ name = '30_os-prober';
469+ common = util/grub.d/30_os-prober.in;
470+ installdir = grubconf;
471+};
472+
473+script = {
474+ name = '30_uefi-firmware';
475+ common = util/grub.d/30_uefi-firmware.in;
476+ installdir = grubconf;
477+};
478+
479+script = {
480+ name = '40_custom';
481+ common = util/grub.d/40_custom.in;
482+ installdir = grubconf;
483+};
484+
485+script = {
486+ name = '41_custom';
487+ common = util/grub.d/41_custom.in;
488+ installdir = grubconf;
489+};
490+
491+script = {
492+ mansection = 1;
493+ name = grub-mkrescue;
494+ x86 = util/grub-mkrescue.in;
495+ mips_qemu_mips = util/grub-mkrescue.in;
496+ mips_loongson = util/grub-mkrescue.in;
497+ ia64_efi = util/grub-mkrescue.in;
498+ powerpc_ieee1275 = util/powerpc/ieee1275/grub-mkrescue.in;
499+ enable = i386_pc;
500+ enable = i386_efi;
501+ enable = x86_64_efi;
502+ enable = i386_qemu;
503+ enable = i386_multiboot;
504+ enable = i386_coreboot;
505+ enable = mips_qemu_mips;
506+ enable = mips_loongson;
507+ enable = ia64_efi;
508+ enable = powerpc_ieee1275;
509+};
510+
511+script = {
512+ mansection = 1;
513+ name = grub-mkstandalone;
514+ common = util/grub-mkstandalone.in;
515+};
516+
517+script = {
518+ mansection = 8;
519+ installdir = sbin;
520+ name = grub-install;
521+
522+ common = util/grub-install.in;
523+ enable = noemu;
524+};
525+
526+script = {
527+ mansection = 8;
528+ installdir = sbin;
529+ name = grub-mknetdir;
530+
531+ common = util/grub-mknetdir.in;
532+};
533+
534+script = {
535+ name = grub-mkconfig;
536+ common = util/grub-mkconfig.in;
537+ mansection = 8;
538+ installdir = sbin;
539+};
540+
541+script = {
542+ name = grub-set-default;
543+ common = util/grub-set-default.in;
544+ mansection = 8;
545+ installdir = sbin;
546+};
547+
548+script = {
549+ name = grub-reboot;
550+ common = util/grub-reboot.in;
551+ mansection = 8;
552+ installdir = sbin;
553+};
554+
555+script = {
556+ name = grub-mkconfig_lib;
557+ common = util/grub-mkconfig_lib.in;
558+ installdir = noinst;
559+};
560+
561+script = {
562+ name = grub-kbdcomp;
563+ common = util/grub-kbdcomp.in;
564+ mansection = 1;
565+};
566+
567+script = {
568+ name = grub-shell;
569+ common = tests/util/grub-shell.in;
570+ installdir = noinst;
571+};
572+
573+script = {
574+ name = grub-shell-tester;
575+ common = tests/util/grub-shell-tester.in;
576+ installdir = noinst;
577+};
578+
579+script = {
580+ testcase;
581+ name = example_scripted_test;
582+ common = tests/example_scripted_test.in;
583+};
584+
585+script = {
586+ testcase;
587+ name = example_grub_script_test;
588+ common = tests/example_grub_script_test.in;
589+};
590+
591+script = {
592+ testcase;
593+ name = grub_script_echo1;
594+ common = tests/grub_script_echo1.in;
595+};
596+
597+script = {
598+ testcase;
599+ name = grub_script_leading_whitespace;
600+ common = tests/grub_script_leading_whitespace.in;
601+};
602+
603+script = {
604+ testcase;
605+ name = grub_script_echo_keywords;
606+ common = tests/grub_script_echo_keywords.in;
607+};
608+
609+script = {
610+ testcase;
611+ name = grub_script_vars1;
612+ common = tests/grub_script_vars1.in;
613+};
614+
615+script = {
616+ testcase;
617+ name = grub_script_for1;
618+ common = tests/grub_script_for1.in;
619+};
620+
621+script = {
622+ testcase;
623+ name = grub_script_while1;
624+ common = tests/grub_script_while1.in;
625+};
626+
627+script = {
628+ testcase;
629+ name = grub_script_if;
630+ common = tests/grub_script_if.in;
631+};
632+
633+script = {
634+ testcase;
635+ name = grub_script_blanklines;
636+ common = tests/grub_script_blanklines.in;
637+};
638+
639+script = {
640+ testcase;
641+ name = grub_script_final_semicolon;
642+ common = tests/grub_script_final_semicolon.in;
643+};
644+
645+script = {
646+ testcase;
647+ name = grub_script_dollar;
648+ common = tests/grub_script_dollar.in;
649+};
650+
651+script = {
652+ testcase;
653+ name = grub_script_comments;
654+ common = tests/grub_script_comments.in;
655+};
656+
657+script = {
658+ testcase;
659+ name = grub_script_functions;
660+ common = tests/grub_script_functions.in;
661+};
662+
663+script = {
664+ testcase;
665+ name = grub_script_break;
666+ common = tests/grub_script_break.in;
667+};
668+
669+script = {
670+ testcase;
671+ name = grub_script_continue;
672+ common = tests/grub_script_continue.in;
673+};
674+
675+script = {
676+ testcase;
677+ name = grub_script_shift;
678+ common = tests/grub_script_shift.in;
679+};
680+
681+script = {
682+ testcase;
683+ name = grub_script_blockarg;
684+ common = tests/grub_script_blockarg.in;
685+};
686+
687+script = {
688+ testcase;
689+ name = grub_script_setparams;
690+ common = tests/grub_script_setparams.in;
691+};
692+
693+script = {
694+ testcase;
695+ name = grub_script_return;
696+ common = tests/grub_script_return.in;
697+};
698+
699+script = {
700+ testcase;
701+ name = grub_cmd_regexp;
702+ common = tests/grub_cmd_regexp.in;
703+};
704+
705+script = {
706+ testcase;
707+ name = grub_script_expansion;
708+ common = tests/grub_script_expansion.in;
709+};
710+
711+script = {
712+ testcase;
713+ name = grub_script_not;
714+ common = tests/grub_script_not.in;
715+};
716+
717+script = {
718+ testcase;
719+ name = partmap_test;
720+ common = tests/partmap_test.in;
721+};
722+
723+script = {
724+ testcase;
725+ name = grub_cmd_echo;
726+ common = tests/grub_cmd_echo.in;
727+};
728+
729+script = {
730+ testcase;
731+ name = grub_script_gettext;
732+ common = tests/grub_script_gettext.in;
733+};
734+
735+script = {
736+ testcase;
737+ name = grub_script_strcmp;
738+ common = tests/grub_script_strcmp.in;
739+};
740+
741+program = {
742+ testcase;
743+ name = example_unit_test;
744+ common = tests/example_unit_test.c;
745+ common = tests/lib/unit_test.c;
746+ common = grub-core/kern/list.c;
747+ common = grub-core/kern/misc.c;
748+ common = grub-core/tests/lib/test.c;
749+ ldadd = libgrubmods.a;
750+ ldadd = libgrubgcry.a;
751+ ldadd = libgrubkern.a;
752+ ldadd = grub-core/gnulib/libgnu.a;
753+ ldadd = '$(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
754+};
755+
756+program = {
757+ testcase;
758+ name = printf_test;
759+ common = tests/printf_unit_test.c;
760+ common = tests/lib/unit_test.c;
761+ common = grub-core/kern/list.c;
762+ common = grub-core/kern/misc.c;
763+ common = grub-core/tests/lib/test.c;
764+ ldadd = libgrubmods.a;
765+ ldadd = libgrubgcry.a;
766+ ldadd = libgrubkern.a;
767+ ldadd = grub-core/gnulib/libgnu.a;
768+ ldadd = '$(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
769+};
770+
771+program = {
772+ testcase;
773+ name = cmp_test;
774+ common = tests/cmp_unit_test.c;
775+ common = tests/lib/unit_test.c;
776+ common = grub-core/kern/list.c;
777+ common = grub-core/kern/misc.c;
778+ common = grub-core/tests/lib/test.c;
779+ ldadd = libgrubmods.a;
780+ ldadd = libgrubgcry.a;
781+ ldadd = libgrubkern.a;
782+ ldadd = grub-core/gnulib/libgnu.a;
783+ ldadd = '$(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
784+};
785+
786+program = {
787+ name = grub-menulst2cfg;
788+ mansection = 1;
789+ common = util/grub-menulst2cfg.c;
790+ common = grub-core/lib/legacy_parse.c;
791+ common = grub-core/lib/i386/pc/vesa_modes_table.c;
792+
793+ ldadd = libgrubmods.a;
794+ ldadd = libgrubgcry.a;
795+ ldadd = libgrubkern.a;
796+ ldadd = grub-core/gnulib/libgnu.a;
797+ ldadd = '$(LIBINTL) $(LIBDEVMAPPER) $(LIBZFS) $(LIBNVPAIR) $(LIBGEOM)';
798+};
799
800=== added directory '.pc/ldm-require-sfs-partition.patch/grub-core'
801=== added directory '.pc/ldm-require-sfs-partition.patch/grub-core/disk'
802=== added file '.pc/ldm-require-sfs-partition.patch/grub-core/disk/ldm.c'
803--- .pc/ldm-require-sfs-partition.patch/grub-core/disk/ldm.c 1970-01-01 00:00:00 +0000
804+++ .pc/ldm-require-sfs-partition.patch/grub-core/disk/ldm.c 2012-12-03 15:27:20 +0000
805@@ -0,0 +1,1010 @@
806+/*
807+ * GRUB -- GRand Unified Bootloader
808+ * Copyright (C) 2006,2007,2008,2009,2011 Free Software Foundation, Inc.
809+ *
810+ * GRUB is free software: you can redistribute it and/or modify
811+ * it under the terms of the GNU General Public License as published by
812+ * the Free Software Foundation, either version 3 of the License, or
813+ * (at your option) any later version.
814+ *
815+ * GRUB is distributed in the hope that it will be useful,
816+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
817+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
818+ * GNU General Public License for more details.
819+ *
820+ * You should have received a copy of the GNU General Public License
821+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
822+ */
823+
824+#include <grub/dl.h>
825+#include <grub/disk.h>
826+#include <grub/mm.h>
827+#include <grub/err.h>
828+#include <grub/misc.h>
829+#include <grub/diskfilter.h>
830+#include <grub/gpt_partition.h>
831+#include <grub/i18n.h>
832+
833+#ifdef GRUB_UTIL
834+#include <grub/emu/misc.h>
835+#include <grub/emu/hostdisk.h>
836+#endif
837+
838+GRUB_MOD_LICENSE ("GPLv3+");
839+
840+#define LDM_GUID_STRLEN 64
841+#define LDM_NAME_STRLEN 32
842+
843+typedef grub_uint8_t *grub_ldm_id_t;
844+
845+enum { STRIPE = 1, SPANNED = 2, RAID5 = 3 };
846+
847+#define LDM_LABEL_SECTOR 6
848+struct grub_ldm_vblk {
849+ char magic[4];
850+ grub_uint8_t unused1[12];
851+ grub_uint16_t update_status;
852+ grub_uint8_t flags;
853+ grub_uint8_t type;
854+ grub_uint32_t unused2;
855+ grub_uint8_t dynamic[104];
856+} __attribute__ ((packed));
857+#define LDM_VBLK_MAGIC "VBLK"
858+
859+enum
860+ {
861+ STATUS_CONSISTENT = 0,
862+ STATUS_STILL_ACTIVE = 1,
863+ STATUS_NOT_ACTIVE_YET = 2
864+ };
865+
866+enum
867+ {
868+ ENTRY_COMPONENT = 0x32,
869+ ENTRY_PARTITION = 0x33,
870+ ENTRY_DISK = 0x34,
871+ ENTRY_VOLUME = 0x51,
872+ };
873+
874+struct grub_ldm_label
875+{
876+ char magic[8];
877+ grub_uint32_t unused1;
878+ grub_uint16_t ver_major;
879+ grub_uint16_t ver_minor;
880+ grub_uint8_t unused2[32];
881+ char disk_guid[LDM_GUID_STRLEN];
882+ char host_guid[LDM_GUID_STRLEN];
883+ char group_guid[LDM_GUID_STRLEN];
884+ char group_name[LDM_NAME_STRLEN];
885+ grub_uint8_t unused3[11];
886+ grub_uint64_t pv_start;
887+ grub_uint64_t pv_size;
888+ grub_uint64_t config_start;
889+ grub_uint64_t config_size;
890+} __attribute__ ((packed));
891+
892+
893+#define LDM_MAGIC "PRIVHEAD"
894+
895+
896
897+
898+static inline grub_uint64_t
899+read_int (grub_uint8_t *in, grub_size_t s)
900+{
901+ grub_uint8_t *ptr2;
902+ grub_uint64_t ret;
903+ ret = 0;
904+ for (ptr2 = in; ptr2 < in + s; ptr2++)
905+ {
906+ ret <<= 8;
907+ ret |= *ptr2;
908+ }
909+ return ret;
910+}
911+
912+static const grub_gpt_part_type_t ldm_type = GRUB_GPT_PARTITION_TYPE_LDM;
913+
914+static grub_disk_addr_t
915+gpt_ldm_sector (grub_disk_t dsk)
916+{
917+ grub_disk_addr_t sector = 0;
918+ grub_err_t err;
919+ auto int hook (grub_disk_t disk, const grub_partition_t p);
920+ int hook (grub_disk_t disk, const grub_partition_t p)
921+ {
922+ struct grub_gpt_partentry gptdata;
923+ grub_partition_t p2;
924+
925+ p2 = disk->partition;
926+ disk->partition = p->parent;
927+ if (grub_disk_read (disk, p->offset, p->index,
928+ sizeof (gptdata), &gptdata))
929+ {
930+ disk->partition = p2;
931+ return 0;
932+ }
933+ disk->partition = p2;
934+
935+ if (! grub_memcmp (&gptdata.type, &ldm_type, 16))
936+ {
937+ sector = p->start + p->len - 1;
938+ return 1;
939+ }
940+ return 0;
941+ }
942+ err = grub_gpt_partition_map_iterate (dsk, hook);
943+ if (err)
944+ {
945+ grub_errno = GRUB_ERR_NONE;
946+ return 0;
947+ }
948+ return sector;
949+}
950+
951+static struct grub_diskfilter_vg *
952+make_vg (grub_disk_t disk,
953+ const struct grub_ldm_label *label)
954+{
955+ grub_disk_addr_t startsec, endsec, cursec;
956+ struct grub_diskfilter_vg *vg;
957+ grub_err_t err;
958+
959+ /* First time we see this volume group. We've to create the
960+ whole volume group structure. */
961+ vg = grub_malloc (sizeof (*vg));
962+ if (! vg)
963+ return NULL;
964+ vg->extent_size = 1;
965+ vg->name = grub_malloc (LDM_NAME_STRLEN + 1);
966+ vg->uuid = grub_malloc (LDM_GUID_STRLEN + 1);
967+ if (! vg->uuid || !vg->name)
968+ {
969+ grub_free (vg->uuid);
970+ grub_free (vg->name);
971+ return NULL;
972+ }
973+ grub_memcpy (vg->uuid, label->group_guid, LDM_GUID_STRLEN);
974+ grub_memcpy (vg->name, label->group_name, LDM_NAME_STRLEN);
975+ vg->name[LDM_NAME_STRLEN] = 0;
976+ vg->uuid[LDM_GUID_STRLEN] = 0;
977+ vg->uuid_len = grub_strlen (vg->uuid);
978+
979+ vg->lvs = NULL;
980+ vg->pvs = NULL;
981+
982+ startsec = grub_be_to_cpu64 (label->config_start);
983+ endsec = startsec + grub_be_to_cpu64 (label->config_size);
984+
985+ /* First find disks. */
986+ for (cursec = startsec + 0x12; cursec < endsec; cursec++)
987+ {
988+ struct grub_ldm_vblk vblk[GRUB_DISK_SECTOR_SIZE
989+ / sizeof (struct grub_ldm_vblk)];
990+ unsigned i;
991+ err = grub_disk_read (disk, cursec, 0,
992+ sizeof(vblk), &vblk);
993+ if (err)
994+ goto fail2;
995+
996+ for (i = 0; i < ARRAY_SIZE (vblk); i++)
997+ {
998+ struct grub_diskfilter_pv *pv;
999+ grub_uint8_t *ptr;
1000+ if (grub_memcmp (vblk[i].magic, LDM_VBLK_MAGIC,
1001+ sizeof (vblk[i].magic)) != 0)
1002+ continue;
1003+ if (grub_be_to_cpu16 (vblk[i].update_status)
1004+ != STATUS_CONSISTENT
1005+ && grub_be_to_cpu16 (vblk[i].update_status)
1006+ != STATUS_STILL_ACTIVE)
1007+ continue;
1008+ if (vblk[i].type != ENTRY_DISK)
1009+ continue;
1010+ pv = grub_zalloc (sizeof (*pv));
1011+ if (!pv)
1012+ goto fail2;
1013+
1014+ pv->disk = 0;
1015+ ptr = vblk[i].dynamic;
1016+ if (ptr + *ptr + 1 >= vblk[i].dynamic
1017+ + sizeof (vblk[i].dynamic))
1018+ {
1019+ grub_free (pv);
1020+ goto fail2;
1021+ }
1022+ pv->internal_id = grub_malloc (ptr[0] + 2);
1023+ if (!pv->internal_id)
1024+ {
1025+ grub_free (pv);
1026+ goto fail2;
1027+ }
1028+ grub_memcpy (pv->internal_id, ptr, (grub_size_t) ptr[0] + 1);
1029+ pv->internal_id[(grub_size_t) ptr[0] + 1] = 0;
1030+
1031+ ptr += *ptr + 1;
1032+ if (ptr + *ptr + 1 >= vblk[i].dynamic
1033+ + sizeof (vblk[i].dynamic))
1034+ {
1035+ grub_free (pv);
1036+ goto fail2;
1037+ }
1038+ /* ptr = name. */
1039+ ptr += *ptr + 1;
1040+ if (ptr + *ptr + 1
1041+ >= vblk[i].dynamic + sizeof (vblk[i].dynamic))
1042+ {
1043+ grub_free (pv);
1044+ goto fail2;
1045+ }
1046+ pv->id.uuidlen = *ptr;
1047+ pv->id.uuid = grub_malloc (pv->id.uuidlen + 1);
1048+ grub_memcpy (pv->id.uuid, ptr + 1, pv->id.uuidlen);
1049+ pv->id.uuid[pv->id.uuidlen] = 0;
1050+
1051+ pv->next = vg->pvs;
1052+ vg->pvs = pv;
1053+ }
1054+ }
1055+
1056+ /* Then find LVs. */
1057+ for (cursec = startsec + 0x12; cursec < endsec; cursec++)
1058+ {
1059+ struct grub_ldm_vblk vblk[GRUB_DISK_SECTOR_SIZE
1060+ / sizeof (struct grub_ldm_vblk)];
1061+ unsigned i;
1062+ err = grub_disk_read (disk, cursec, 0,
1063+ sizeof(vblk), &vblk);
1064+ if (err)
1065+ goto fail2;
1066+
1067+ for (i = 0; i < ARRAY_SIZE (vblk); i++)
1068+ {
1069+ struct grub_diskfilter_lv *lv;
1070+ grub_uint8_t *ptr;
1071+ if (grub_memcmp (vblk[i].magic, LDM_VBLK_MAGIC,
1072+ sizeof (vblk[i].magic)) != 0)
1073+ continue;
1074+ if (grub_be_to_cpu16 (vblk[i].update_status)
1075+ != STATUS_CONSISTENT
1076+ && grub_be_to_cpu16 (vblk[i].update_status)
1077+ != STATUS_STILL_ACTIVE)
1078+ continue;
1079+ if (vblk[i].type != ENTRY_VOLUME)
1080+ continue;
1081+ lv = grub_zalloc (sizeof (*lv));
1082+ if (!lv)
1083+ goto fail2;
1084+
1085+ lv->vg = vg;
1086+ lv->segment_count = 1;
1087+ lv->segment_alloc = 1;
1088+ lv->visible = 1;
1089+ lv->segments = grub_zalloc (sizeof (*lv->segments));
1090+ if (!lv->segments)
1091+ goto fail2;
1092+ lv->segments->start_extent = 0;
1093+ lv->segments->type = GRUB_DISKFILTER_MIRROR;
1094+ lv->segments->node_count = 0;
1095+ lv->segments->node_alloc = 8;
1096+ lv->segments->nodes = grub_zalloc (sizeof (*lv->segments->nodes)
1097+ * lv->segments->node_alloc);
1098+ if (!lv->segments->nodes)
1099+ goto fail2;
1100+ ptr = vblk[i].dynamic;
1101+ if (ptr + *ptr + 1 >= vblk[i].dynamic
1102+ + sizeof (vblk[i].dynamic))
1103+ {
1104+ grub_free (lv);
1105+ goto fail2;
1106+ }
1107+ lv->internal_id = grub_malloc ((grub_size_t) ptr[0] + 2);
1108+ if (!lv->internal_id)
1109+ {
1110+ grub_free (lv);
1111+ goto fail2;
1112+ }
1113+ grub_memcpy (lv->internal_id, ptr, ptr[0] + 1);
1114+ lv->internal_id[ptr[0] + 1] = 0;
1115+
1116+ ptr += *ptr + 1;
1117+ if (ptr + *ptr + 1 >= vblk[i].dynamic
1118+ + sizeof (vblk[i].dynamic))
1119+ {
1120+ grub_free (lv);
1121+ goto fail2;
1122+ }
1123+ lv->name = grub_malloc (*ptr + 1);
1124+ if (!lv->name)
1125+ {
1126+ grub_free (lv->internal_id);
1127+ grub_free (lv);
1128+ goto fail2;
1129+ }
1130+ grub_memcpy (lv->name, ptr + 1, *ptr);
1131+ lv->name[*ptr] = 0;
1132+ lv->fullname = grub_xasprintf ("ldm/%s/%s",
1133+ vg->uuid, lv->name);
1134+ if (!lv->fullname)
1135+ {
1136+ grub_free (lv->internal_id);
1137+ grub_free (lv->name);
1138+ grub_free (lv);
1139+ goto fail2;
1140+ }
1141+ ptr += *ptr + 1;
1142+ if (ptr + *ptr + 1
1143+ >= vblk[i].dynamic + sizeof (vblk[i].dynamic))
1144+ {
1145+ grub_free (lv->internal_id);
1146+ grub_free (lv->name);
1147+ grub_free (lv);
1148+ goto fail2;
1149+ }
1150+ /* ptr = volume type. */
1151+ ptr += *ptr + 1;
1152+ if (ptr >= vblk[i].dynamic + sizeof (vblk[i].dynamic))
1153+ {
1154+ grub_free (lv->internal_id);
1155+ grub_free (lv->name);
1156+ grub_free (lv);
1157+ goto fail2;
1158+ }
1159+ /* ptr = flags. */
1160+ ptr += *ptr + 1;
1161+ if (ptr >= vblk[i].dynamic + sizeof (vblk[i].dynamic))
1162+ {
1163+ grub_free (lv->internal_id);
1164+ grub_free (lv->name);
1165+ grub_free (lv);
1166+ goto fail2;
1167+ }
1168+
1169+ /* Skip state, type, unknown, volume number, zeros, flags. */
1170+ ptr += 14 + 1 + 1 + 1 + 3 + 1;
1171+ /* ptr = number of children. */
1172+ if (ptr >= vblk[i].dynamic + sizeof (vblk[i].dynamic))
1173+ {
1174+ grub_free (lv->internal_id);
1175+ grub_free (lv->name);
1176+ grub_free (lv);
1177+ goto fail2;
1178+ }
1179+ ptr += *ptr + 1;
1180+ if (ptr >= vblk[i].dynamic + sizeof (vblk[i].dynamic))
1181+ {
1182+ grub_free (lv->internal_id);
1183+ grub_free (lv->name);
1184+ grub_free (lv);
1185+ goto fail2;
1186+ }
1187+
1188+ /* Skip 2 more fields. */
1189+ ptr += 8 + 8;
1190+ if (ptr >= vblk[i].dynamic + sizeof (vblk[i].dynamic)
1191+ || ptr + *ptr + 1>= vblk[i].dynamic
1192+ + sizeof (vblk[i].dynamic))
1193+ {
1194+ grub_free (lv->internal_id);
1195+ grub_free (lv->name);
1196+ grub_free (lv);
1197+ goto fail2;
1198+ }
1199+ lv->size = read_int (ptr + 1, *ptr);
1200+ lv->segments->extent_count = lv->size;
1201+
1202+ lv->next = vg->lvs;
1203+ vg->lvs = lv;
1204+ }
1205+ }
1206+
1207+ /* Now the components. */
1208+ for (cursec = startsec + 0x12; cursec < endsec; cursec++)
1209+ {
1210+ struct grub_ldm_vblk vblk[GRUB_DISK_SECTOR_SIZE
1211+ / sizeof (struct grub_ldm_vblk)];
1212+ unsigned i;
1213+ err = grub_disk_read (disk, cursec, 0,
1214+ sizeof(vblk), &vblk);
1215+ if (err)
1216+ goto fail2;
1217+
1218+ for (i = 0; i < ARRAY_SIZE (vblk); i++)
1219+ {
1220+ struct grub_diskfilter_lv *comp;
1221+ struct grub_diskfilter_lv *lv;
1222+ grub_uint8_t type;
1223+
1224+ grub_uint8_t *ptr;
1225+ if (grub_memcmp (vblk[i].magic, LDM_VBLK_MAGIC,
1226+ sizeof (vblk[i].magic)) != 0)
1227+ continue;
1228+ if (grub_be_to_cpu16 (vblk[i].update_status)
1229+ != STATUS_CONSISTENT
1230+ && grub_be_to_cpu16 (vblk[i].update_status)
1231+ != STATUS_STILL_ACTIVE)
1232+ continue;
1233+ if (vblk[i].type != ENTRY_COMPONENT)
1234+ continue;
1235+ comp = grub_zalloc (sizeof (*comp));
1236+ if (!comp)
1237+ goto fail2;
1238+ comp->visible = 0;
1239+ comp->name = 0;
1240+ comp->fullname = 0;
1241+
1242+ ptr = vblk[i].dynamic;
1243+ if (ptr + *ptr + 1 >= vblk[i].dynamic + sizeof (vblk[i].dynamic))
1244+ {
1245+ goto fail2;
1246+ }
1247+ comp->internal_id = grub_malloc ((grub_size_t) ptr[0] + 2);
1248+ if (!comp->internal_id)
1249+ {
1250+ grub_free (comp);
1251+ goto fail2;
1252+ }
1253+ grub_memcpy (comp->internal_id, ptr, ptr[0] + 1);
1254+ comp->internal_id[ptr[0] + 1] = 0;
1255+
1256+ ptr += *ptr + 1;
1257+ if (ptr + *ptr + 1 >= vblk[i].dynamic + sizeof (vblk[i].dynamic))
1258+ {
1259+ grub_free (comp->internal_id);
1260+ grub_free (comp);
1261+ goto fail2;
1262+ }
1263+ /* ptr = name. */
1264+ ptr += *ptr + 1;
1265+ if (ptr + *ptr + 1 >= vblk[i].dynamic + sizeof (vblk[i].dynamic))
1266+ {
1267+ grub_free (comp->internal_id);
1268+ grub_free (comp);
1269+ goto fail2;
1270+ }
1271+ /* ptr = state. */
1272+ ptr += *ptr + 1;
1273+ type = *ptr++;
1274+ /* skip zeros. */
1275+ ptr += 4;
1276+ if (ptr >= vblk[i].dynamic + sizeof (vblk[i].dynamic))
1277+ {
1278+ grub_free (comp->internal_id);
1279+ grub_free (comp);
1280+ goto fail2;
1281+ }
1282+
1283+ /* ptr = number of children. */
1284+ ptr += *ptr + 1;
1285+ if (ptr >= vblk[i].dynamic + sizeof (vblk[i].dynamic))
1286+ {
1287+ grub_free (comp->internal_id);
1288+ grub_free (comp);
1289+ goto fail2;
1290+ }
1291+ ptr += 8 + 8;
1292+ if (ptr + *ptr + 1 >= vblk[i].dynamic
1293+ + sizeof (vblk[i].dynamic))
1294+ {
1295+ grub_free (comp->internal_id);
1296+ grub_free (comp);
1297+ goto fail2;
1298+ }
1299+ for (lv = vg->lvs; lv; lv = lv->next)
1300+ {
1301+ if (lv->internal_id[0] == ptr[0]
1302+ && grub_memcmp (lv->internal_id + 1, ptr + 1, ptr[0]) == 0)
1303+ break;
1304+ }
1305+ if (!lv)
1306+ {
1307+ grub_free (comp->internal_id);
1308+ grub_free (comp);
1309+ continue;
1310+ }
1311+ comp->size = lv->size;
1312+ if (type == SPANNED)
1313+ {
1314+ comp->segment_alloc = 8;
1315+ comp->segment_count = 0;
1316+ comp->segments = grub_malloc (sizeof (*comp->segments)
1317+ * comp->segment_alloc);
1318+ if (!comp->segments)
1319+ goto fail2;
1320+ }
1321+ else
1322+ {
1323+ comp->segment_alloc = 1;
1324+ comp->segment_count = 1;
1325+ comp->segments = grub_malloc (sizeof (*comp->segments));
1326+ if (!comp->segments)
1327+ goto fail2;
1328+ comp->segments->start_extent = 0;
1329+ comp->segments->extent_count = lv->size;
1330+ comp->segments->layout = 0;
1331+ if (type == STRIPE)
1332+ comp->segments->type = GRUB_DISKFILTER_STRIPED;
1333+ else if (type == RAID5)
1334+ {
1335+ comp->segments->type = GRUB_DISKFILTER_RAID5;
1336+ comp->segments->layout = GRUB_RAID_LAYOUT_SYMMETRIC_MASK;
1337+ }
1338+ else
1339+ goto fail2;
1340+ ptr += *ptr + 1;
1341+ ptr++;
1342+ if (!(vblk[i].flags & 0x10))
1343+ goto fail2;
1344+ if (ptr >= vblk[i].dynamic + sizeof (vblk[i].dynamic)
1345+ || ptr + *ptr + 1 >= vblk[i].dynamic
1346+ + sizeof (vblk[i].dynamic))
1347+ {
1348+ grub_free (comp->internal_id);
1349+ grub_free (comp);
1350+ goto fail2;
1351+ }
1352+ comp->segments->stripe_size = read_int (ptr + 1, *ptr);
1353+ ptr += *ptr + 1;
1354+ if (ptr + *ptr + 1 >= vblk[i].dynamic
1355+ + sizeof (vblk[i].dynamic))
1356+ {
1357+ grub_free (comp->internal_id);
1358+ grub_free (comp);
1359+ goto fail2;
1360+ }
1361+ comp->segments->node_count = read_int (ptr + 1, *ptr);
1362+ comp->segments->node_alloc = comp->segments->node_count;
1363+ comp->segments->nodes = grub_zalloc (sizeof (*comp->segments->nodes)
1364+ * comp->segments->node_alloc);
1365+ if (!lv->segments->nodes)
1366+ goto fail2;
1367+ }
1368+
1369+ if (lv->segments->node_alloc == lv->segments->node_count)
1370+ {
1371+ void *t;
1372+ lv->segments->node_alloc *= 2;
1373+ t = grub_realloc (lv->segments->nodes,
1374+ sizeof (*lv->segments->nodes)
1375+ * lv->segments->node_alloc);
1376+ if (!t)
1377+ goto fail2;
1378+ lv->segments->nodes = t;
1379+ }
1380+ lv->segments->nodes[lv->segments->node_count].pv = 0;
1381+ lv->segments->nodes[lv->segments->node_count].start = 0;
1382+ lv->segments->nodes[lv->segments->node_count++].lv = comp;
1383+ comp->next = vg->lvs;
1384+ vg->lvs = comp;
1385+ }
1386+ }
1387+ /* Partitions. */
1388+ for (cursec = startsec + 0x12; cursec < endsec; cursec++)
1389+ {
1390+ struct grub_ldm_vblk vblk[GRUB_DISK_SECTOR_SIZE
1391+ / sizeof (struct grub_ldm_vblk)];
1392+ unsigned i;
1393+ err = grub_disk_read (disk, cursec, 0,
1394+ sizeof(vblk), &vblk);
1395+ if (err)
1396+ goto fail2;
1397+
1398+ for (i = 0; i < ARRAY_SIZE (vblk); i++)
1399+ {
1400+ struct grub_diskfilter_lv *comp;
1401+ struct grub_diskfilter_node part;
1402+ grub_disk_addr_t start, size;
1403+
1404+ grub_uint8_t *ptr;
1405+ part.name = 0;
1406+ if (grub_memcmp (vblk[i].magic, LDM_VBLK_MAGIC,
1407+ sizeof (vblk[i].magic)) != 0)
1408+ continue;
1409+ if (grub_be_to_cpu16 (vblk[i].update_status)
1410+ != STATUS_CONSISTENT
1411+ && grub_be_to_cpu16 (vblk[i].update_status)
1412+ != STATUS_STILL_ACTIVE)
1413+ continue;
1414+ if (vblk[i].type != ENTRY_PARTITION)
1415+ continue;
1416+ part.lv = 0;
1417+ part.pv = 0;
1418+
1419+ ptr = vblk[i].dynamic;
1420+ if (ptr + *ptr + 1 >= vblk[i].dynamic + sizeof (vblk[i].dynamic))
1421+ {
1422+ goto fail2;
1423+ }
1424+ /* ID */
1425+ ptr += *ptr + 1;
1426+ if (ptr >= vblk[i].dynamic + sizeof (vblk[i].dynamic))
1427+ {
1428+ goto fail2;
1429+ }
1430+ /* ptr = name. */
1431+ ptr += *ptr + 1;
1432+ if (ptr >= vblk[i].dynamic + sizeof (vblk[i].dynamic))
1433+ {
1434+ goto fail2;
1435+ }
1436+
1437+ /* skip zeros and logcommit id. */
1438+ ptr += 4 + 8;
1439+ if (ptr + 16 >= vblk[i].dynamic + sizeof (vblk[i].dynamic))
1440+ {
1441+ goto fail2;
1442+ }
1443+ part.start = read_int (ptr, 8);
1444+ start = read_int (ptr + 8, 8);
1445+ ptr += 16;
1446+ if (ptr >= vblk[i].dynamic + sizeof (vblk[i].dynamic)
1447+ || ptr + *ptr + 1 >= vblk[i].dynamic + sizeof (vblk[i].dynamic))
1448+ {
1449+ goto fail2;
1450+ }
1451+ size = read_int (ptr + 1, *ptr);
1452+ ptr += *ptr + 1;
1453+ if (ptr >= vblk[i].dynamic + sizeof (vblk[i].dynamic)
1454+ || ptr + *ptr + 1 >= vblk[i].dynamic + sizeof (vblk[i].dynamic))
1455+ {
1456+ goto fail2;
1457+ }
1458+
1459+ for (comp = vg->lvs; comp; comp = comp->next)
1460+ if (comp->internal_id[0] == ptr[0]
1461+ && grub_memcmp (ptr + 1, comp->internal_id + 1,
1462+ comp->internal_id[0]) == 0)
1463+ goto out;
1464+ continue;
1465+ out:
1466+ if (ptr >= vblk[i].dynamic + sizeof (vblk[i].dynamic)
1467+ || ptr + *ptr + 1 >= vblk[i].dynamic + sizeof (vblk[i].dynamic))
1468+ {
1469+ goto fail2;
1470+ }
1471+ ptr += *ptr + 1;
1472+ struct grub_diskfilter_pv *pv;
1473+ for (pv = vg->pvs; pv; pv = pv->next)
1474+ if (pv->internal_id[0] == ptr[0]
1475+ && grub_memcmp (pv->internal_id + 1, ptr + 1, ptr[0]) == 0)
1476+ part.pv = pv;
1477+
1478+ if (comp->segment_alloc == 1)
1479+ {
1480+ unsigned index;
1481+ ptr += *ptr + 1;
1482+ if (ptr + *ptr + 1 >= vblk[i].dynamic
1483+ + sizeof (vblk[i].dynamic))
1484+ {
1485+ goto fail2;
1486+ }
1487+ index = read_int (ptr + 1, *ptr);
1488+ if (index < comp->segments->node_count)
1489+ comp->segments->nodes[index] = part;
1490+ }
1491+ else
1492+ {
1493+ if (comp->segment_alloc == comp->segment_count)
1494+ {
1495+ void *t;
1496+ comp->segment_alloc *= 2;
1497+ t = grub_realloc (comp->segments,
1498+ comp->segment_alloc
1499+ * sizeof (*comp->segments));
1500+ if (!t)
1501+ goto fail2;
1502+ comp->segments = t;
1503+ }
1504+ comp->segments[comp->segment_count].start_extent = start;
1505+ comp->segments[comp->segment_count].extent_count = size;
1506+ comp->segments[comp->segment_count].type = GRUB_DISKFILTER_STRIPED;
1507+ comp->segments[comp->segment_count].node_count = 1;
1508+ comp->segments[comp->segment_count].node_alloc = 1;
1509+ comp->segments[comp->segment_count].nodes
1510+ = grub_malloc (sizeof (*comp->segments[comp->segment_count].nodes));
1511+ if (!comp->segments[comp->segment_count].nodes)
1512+ goto fail2;
1513+ comp->segments[comp->segment_count].nodes[0] = part;
1514+ comp->segment_count++;
1515+ }
1516+ }
1517+ }
1518+ if (grub_diskfilter_vg_register (vg))
1519+ goto fail2;
1520+ return vg;
1521+ fail2:
1522+ {
1523+ struct grub_diskfilter_lv *lv, *next_lv;
1524+ struct grub_diskfilter_pv *pv, *next_pv;
1525+ for (lv = vg->lvs; lv; lv = next_lv)
1526+ {
1527+ unsigned i;
1528+ for (i = 0; i < lv->segment_count; i++)
1529+ grub_free (lv->segments[i].nodes);
1530+
1531+ next_lv = lv->next;
1532+ grub_free (lv->segments);
1533+ grub_free (lv->internal_id);
1534+ grub_free (lv->name);
1535+ grub_free (lv->fullname);
1536+ grub_free (lv);
1537+ }
1538+ for (pv = vg->pvs; pv; pv = next_pv)
1539+ {
1540+ next_pv = pv->next;
1541+ grub_free (pv->id.uuid);
1542+ grub_free (pv);
1543+ }
1544+ }
1545+ grub_free (vg->uuid);
1546+ grub_free (vg);
1547+ return NULL;
1548+}
1549+
1550+static struct grub_diskfilter_vg *
1551+grub_ldm_detect (grub_disk_t disk,
1552+ struct grub_diskfilter_pv_id *id,
1553+ grub_disk_addr_t *start_sector)
1554+{
1555+ grub_err_t err;
1556+ struct grub_ldm_label label;
1557+ struct grub_diskfilter_vg *vg;
1558+
1559+#ifdef GRUB_UTIL
1560+ grub_util_info ("scanning %s for LDM", disk->name);
1561+#endif
1562+
1563+ {
1564+ int i;
1565+ for (i = 0; i < 3; i++)
1566+ {
1567+ grub_disk_addr_t sector = LDM_LABEL_SECTOR;
1568+ switch (i)
1569+ {
1570+ case 0:
1571+ sector = LDM_LABEL_SECTOR;
1572+ break;
1573+ case 1:
1574+ /* LDM is never inside a partition. */
1575+ if (disk->partition)
1576+ continue;
1577+ sector = grub_disk_get_size (disk);
1578+ if (sector == GRUB_DISK_SIZE_UNKNOWN)
1579+ continue;
1580+ sector--;
1581+ break;
1582+ /* FIXME: try the third copy. */
1583+ case 2:
1584+ sector = gpt_ldm_sector (disk);
1585+ if (!sector)
1586+ continue;
1587+ break;
1588+ }
1589+ err = grub_disk_read (disk, sector, 0,
1590+ sizeof(label), &label);
1591+ if (err)
1592+ return NULL;
1593+ if (grub_memcmp (label.magic, LDM_MAGIC, sizeof (label.magic)) == 0
1594+ && grub_be_to_cpu16 (label.ver_major) == 0x02
1595+ && grub_be_to_cpu16 (label.ver_minor) >= 0x0b
1596+ && grub_be_to_cpu16 (label.ver_minor) <= 0x0c)
1597+ break;
1598+ }
1599+
1600+ /* Return if we didn't find a label. */
1601+ if (i == 3)
1602+ {
1603+#ifdef GRUB_UTIL
1604+ grub_util_info ("no LDM signature found");
1605+#endif
1606+ return NULL;
1607+ }
1608+ }
1609+
1610+ id->uuid = grub_malloc (LDM_GUID_STRLEN + 1);
1611+ if (!id->uuid)
1612+ return NULL;
1613+ grub_memcpy (id->uuid, label.disk_guid, LDM_GUID_STRLEN);
1614+ id->uuid[LDM_GUID_STRLEN] = 0;
1615+ id->uuidlen = grub_strlen ((char *) id->uuid);
1616+ *start_sector = grub_be_to_cpu64 (label.pv_start);
1617+
1618+ {
1619+ grub_size_t s;
1620+ for (s = 0; s < LDM_GUID_STRLEN && label.group_guid[s]; s++);
1621+ vg = grub_diskfilter_get_vg_by_uuid (s, label.group_guid);
1622+ if (! vg)
1623+ vg = make_vg (disk, &label);
1624+ }
1625+
1626+ if (!vg)
1627+ {
1628+ grub_free (id->uuid);
1629+ return NULL;
1630+ }
1631+ return vg;
1632+}
1633+
1634+#ifdef GRUB_UTIL
1635+
1636+char *
1637+grub_util_get_ldm (grub_disk_t disk, grub_disk_addr_t start)
1638+{
1639+ struct grub_diskfilter_pv *pv = NULL;
1640+ struct grub_diskfilter_vg *vg = NULL;
1641+ struct grub_diskfilter_lv *res = 0, *lv, *res_lv = 0;
1642+
1643+ pv = grub_diskfilter_get_pv_from_disk (disk, &vg);
1644+
1645+ if (!pv)
1646+ return NULL;
1647+
1648+ for (lv = vg->lvs; lv; lv = lv->next)
1649+ if (lv->segment_count == 1 && lv->segments->node_count == 1
1650+ && lv->segments->type == GRUB_DISKFILTER_STRIPED
1651+ && lv->segments->nodes->pv == pv
1652+ && lv->segments->nodes->start + pv->start_sector == start)
1653+ {
1654+ res_lv = lv;
1655+ break;
1656+ }
1657+ if (!res_lv)
1658+ return NULL;
1659+ for (lv = vg->lvs; lv; lv = lv->next)
1660+ if (lv->segment_count == 1 && lv->segments->node_count == 1
1661+ && lv->segments->type == GRUB_DISKFILTER_MIRROR
1662+ && lv->segments->nodes->lv == res_lv)
1663+ {
1664+ res = lv;
1665+ break;
1666+ }
1667+ if (res && res->fullname)
1668+ return grub_strdup (res->fullname);
1669+ return NULL;
1670+}
1671+
1672+int
1673+grub_util_is_ldm (grub_disk_t disk)
1674+{
1675+ int i;
1676+ for (i = 0; i < 3; i++)
1677+ {
1678+ grub_disk_addr_t sector = LDM_LABEL_SECTOR;
1679+ grub_err_t err;
1680+ struct grub_ldm_label label;
1681+
1682+ switch (i)
1683+ {
1684+ case 0:
1685+ sector = LDM_LABEL_SECTOR;
1686+ break;
1687+ case 1:
1688+ /* LDM is never inside a partition. */
1689+ if (disk->partition)
1690+ continue;
1691+ sector = grub_disk_get_size (disk);
1692+ if (sector == GRUB_DISK_SIZE_UNKNOWN)
1693+ continue;
1694+ sector--;
1695+ break;
1696+ /* FIXME: try the third copy. */
1697+ case 2:
1698+ sector = gpt_ldm_sector (disk);
1699+ if (!sector)
1700+ continue;
1701+ break;
1702+ }
1703+ err = grub_disk_read (disk, sector, 0, sizeof(label), &label);
1704+ if (err)
1705+ {
1706+ grub_errno = GRUB_ERR_NONE;
1707+ return 0;
1708+ }
1709+ /* This check is more relaxed on purpose. */
1710+ if (grub_memcmp (label.magic, LDM_MAGIC, sizeof (label.magic)) == 0)
1711+ return 1;
1712+ }
1713+
1714+ return 0;
1715+}
1716+
1717+grub_err_t
1718+grub_util_ldm_embed (struct grub_disk *disk, unsigned int *nsectors,
1719+ unsigned int max_nsectors,
1720+ grub_embed_type_t embed_type,
1721+ grub_disk_addr_t **sectors)
1722+{
1723+ struct grub_diskfilter_pv *pv = NULL;
1724+ struct grub_diskfilter_vg *vg;
1725+ struct grub_diskfilter_lv *lv;
1726+ unsigned i;
1727+
1728+ if (embed_type != GRUB_EMBED_PCBIOS)
1729+ return grub_error (GRUB_ERR_NOT_IMPLEMENTED_YET,
1730+ "LDM curently supports only PC-BIOS embedding");
1731+ if (disk->partition)
1732+ return grub_error (GRUB_ERR_BUG, "disk isn't LDM");
1733+ pv = grub_diskfilter_get_pv_from_disk (disk, &vg);
1734+ if (!pv)
1735+ return grub_error (GRUB_ERR_BUG, "disk isn't LDM");
1736+ for (lv = vg->lvs; lv; lv = lv->next)
1737+ {
1738+ struct grub_diskfilter_lv *comp;
1739+
1740+ if (!lv->visible || !lv->fullname)
1741+ continue;
1742+
1743+ if (lv->segment_count != 1)
1744+ continue;
1745+ if (lv->segments->type != GRUB_DISKFILTER_MIRROR
1746+ || lv->segments->node_count != 1
1747+ || lv->segments->start_extent != 0
1748+ || lv->segments->extent_count != lv->size)
1749+ continue;
1750+
1751+ comp = lv->segments->nodes->lv;
1752+ if (!comp)
1753+ continue;
1754+
1755+ if (comp->segment_count != 1 || comp->size != lv->size)
1756+ continue;
1757+ if (comp->segments->type != GRUB_DISKFILTER_STRIPED
1758+ || comp->segments->node_count != 1
1759+ || comp->segments->start_extent != 0
1760+ || comp->segments->extent_count != lv->size)
1761+ continue;
1762+
1763+ /* How to implement proper check is to be discussed. */
1764+#if 1
1765+ if (1)
1766+ continue;
1767+#else
1768+ if (grub_strcmp (lv->name, "Volume5") != 0)
1769+ continue;
1770+#endif
1771+ if (lv->size < *nsectors)
1772+ return grub_error (GRUB_ERR_OUT_OF_RANGE,
1773+ /* TRANSLATORS: it's a partition for embedding,
1774+ not a partition embed into something. GRUB
1775+ install tools put core.img into a place
1776+ usable for bootloaders (called generically
1777+ "embedding zone") and this operation is
1778+ called "embedding". */
1779+ N_("your LDM embedding Partition is too small;"
1780+ " embedding won't be possible"));
1781+ *nsectors = lv->size;
1782+ if (*nsectors > max_nsectors)
1783+ *nsectors = max_nsectors;
1784+ *sectors = grub_malloc (*nsectors * sizeof (**sectors));
1785+ if (!*sectors)
1786+ return grub_errno;
1787+ for (i = 0; i < *nsectors; i++)
1788+ (*sectors)[i] = (lv->segments->nodes->start
1789+ + comp->segments->nodes->start
1790+ + comp->segments->nodes->pv->start_sector + i);
1791+ return GRUB_ERR_NONE;
1792+ }
1793+
1794+ return grub_error (GRUB_ERR_FILE_NOT_FOUND,
1795+ /* TRANSLATORS: it's a partition for embedding,
1796+ not a partition embed into something. */
1797+ N_("this LDM has no Embedding Partition;"
1798+ " embedding won't be possible"));
1799+}
1800+#endif
1801+
1802+static struct grub_diskfilter grub_ldm_dev = {
1803+ .name = "ldm",
1804+ .detect = grub_ldm_detect,
1805+ .next = 0
1806+};
1807+
1808+GRUB_MOD_INIT (ldm)
1809+{
1810+ grub_diskfilter_register_back (&grub_ldm_dev);
1811+}
1812+
1813+GRUB_MOD_FINI (ldm)
1814+{
1815+ grub_diskfilter_unregister (&grub_ldm_dev);
1816+}
1817
1818=== added directory '.pc/ldm-require-sfs-partition.patch/include'
1819=== added directory '.pc/ldm-require-sfs-partition.patch/include/grub'
1820=== added file '.pc/ldm-require-sfs-partition.patch/include/grub/msdos_partition.h'
1821--- .pc/ldm-require-sfs-partition.patch/include/grub/msdos_partition.h 1970-01-01 00:00:00 +0000
1822+++ .pc/ldm-require-sfs-partition.patch/include/grub/msdos_partition.h 2012-12-03 15:27:20 +0000
1823@@ -0,0 +1,126 @@
1824+/*
1825+ * GRUB -- GRand Unified Bootloader
1826+ * Copyright (C) 1999,2000,2001,2002,2004,2007 Free Software Foundation, Inc.
1827+ *
1828+ * GRUB is free software: you can redistribute it and/or modify
1829+ * it under the terms of the GNU General Public License as published by
1830+ * the Free Software Foundation, either version 3 of the License, or
1831+ * (at your option) any later version.
1832+ *
1833+ * GRUB is distributed in the hope that it will be useful,
1834+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
1835+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1836+ * GNU General Public License for more details.
1837+ *
1838+ * You should have received a copy of the GNU General Public License
1839+ * along with GRUB. If not, see <http://www.gnu.org/licenses/>.
1840+ */
1841+
1842+#ifndef GRUB_PC_PARTITION_HEADER
1843+#define GRUB_PC_PARTITION_HEADER 1
1844+
1845+#include <grub/symbol.h>
1846+#include <grub/types.h>
1847+#include <grub/err.h>
1848+#include <grub/disk.h>
1849+#include <grub/partition.h>
1850+
1851+/* The signature. */
1852+#define GRUB_PC_PARTITION_SIGNATURE 0xaa55
1853+
1854+/* This is not a flag actually, but used as if it were a flag. */
1855+#define GRUB_PC_PARTITION_TYPE_HIDDEN_FLAG 0x10
1856+
1857+/* DOS partition types. */
1858+#define GRUB_PC_PARTITION_TYPE_NONE 0
1859+#define GRUB_PC_PARTITION_TYPE_FAT12 1
1860+#define GRUB_PC_PARTITION_TYPE_FAT16_LT32M 4
1861+#define GRUB_PC_PARTITION_TYPE_EXTENDED 5
1862+#define GRUB_PC_PARTITION_TYPE_FAT16_GT32M 6
1863+#define GRUB_PC_PARTITION_TYPE_NTFS 7
1864+#define GRUB_PC_PARTITION_TYPE_FAT32 0xb
1865+#define GRUB_PC_PARTITION_TYPE_FAT32_LBA 0xc
1866+#define GRUB_PC_PARTITION_TYPE_FAT16_LBA 0xe
1867+#define GRUB_PC_PARTITION_TYPE_WIN95_EXTENDED 0xf
1868+#define GRUB_PC_PARTITION_TYPE_PLAN9 0x39
1869+#define GRUB_PC_PARTITION_TYPE_EZD 0x55
1870+#define GRUB_PC_PARTITION_TYPE_MINIX 0x80
1871+#define GRUB_PC_PARTITION_TYPE_LINUX_MINIX 0x81
1872+#define GRUB_PC_PARTITION_TYPE_LINUX_SWAP 0x82
1873+#define GRUB_PC_PARTITION_TYPE_EXT2FS 0x83
1874+#define GRUB_PC_PARTITION_TYPE_LINUX_EXTENDED 0x85
1875+#define GRUB_PC_PARTITION_TYPE_VSTAFS 0x9e
1876+#define GRUB_PC_PARTITION_TYPE_FREEBSD 0xa5
1877+#define GRUB_PC_PARTITION_TYPE_OPENBSD 0xa6
1878+#define GRUB_PC_PARTITION_TYPE_NETBSD 0xa9
1879+#define GRUB_PC_PARTITION_TYPE_HFS 0xaf
1880+#define GRUB_PC_PARTITION_TYPE_GPT_DISK 0xee
1881+#define GRUB_PC_PARTITION_TYPE_LINUX_RAID 0xfd
1882+
1883+/* The partition entry. */
1884+struct grub_msdos_partition_entry
1885+{
1886+ /* If active, 0x80, otherwise, 0x00. */
1887+ grub_uint8_t flag;
1888+
1889+ /* The head of the start. */
1890+ grub_uint8_t start_head;
1891+
1892+ /* (S | ((C >> 2) & 0xC0)) where S is the sector of the start and C
1893+ is the cylinder of the start. Note that S is counted from one. */
1894+ grub_uint8_t start_sector;
1895+
1896+ /* (C & 0xFF) where C is the cylinder of the start. */
1897+ grub_uint8_t start_cylinder;
1898+
1899+ /* The partition type. */
1900+ grub_uint8_t type;
1901+
1902+ /* The end versions of start_head, start_sector and start_cylinder,
1903+ respectively. */
1904+ grub_uint8_t end_head;
1905+ grub_uint8_t end_sector;
1906+ grub_uint8_t end_cylinder;
1907+
1908+ /* The start sector. Note that this is counted from zero. */
1909+ grub_uint32_t start;
1910+
1911+ /* The length in sector units. */
1912+ grub_uint32_t length;
1913+} __attribute__ ((packed));
1914+
1915+/* The structure of MBR. */
1916+struct grub_msdos_partition_mbr
1917+{
1918+ /* The code area (actually, including BPB). */
1919+ grub_uint8_t code[446];
1920+
1921+ /* Four partition entries. */
1922+ struct grub_msdos_partition_entry entries[4];
1923+
1924+ /* The signature 0xaa55. */
1925+ grub_uint16_t signature;
1926+} __attribute__ ((packed));
1927+
1928+
1929
1930+
1931+static inline int
1932+grub_msdos_partition_is_empty (int type)
1933+{
1934+ return (type == GRUB_PC_PARTITION_TYPE_NONE);
1935+}
1936+
1937+static inline int
1938+grub_msdos_partition_is_extended (int type)
1939+{
1940+ return (type == GRUB_PC_PARTITION_TYPE_EXTENDED
1941+ || type == GRUB_PC_PARTITION_TYPE_WIN95_EXTENDED
1942+ || type == GRUB_PC_PARTITION_TYPE_LINUX_EXTENDED);
1943+}
1944+
1945+grub_err_t
1946+grub_partition_msdos_iterate (grub_disk_t disk,
1947+ int (*hook) (grub_disk_t disk,
1948+ const grub_partition_t partition));
1949+
1950+#endif /* ! GRUB_PC_PARTITION_HEADER */
1951
1952=== modified file 'Makefile.util.def'
1953--- Makefile.util.def 2012-10-08 12:16:40 +0000
1954+++ Makefile.util.def 2012-12-03 15:27:20 +0000
1955@@ -32,6 +32,7 @@
1956 common = grub-core/disk/ldm.c;
1957 common = grub-core/disk/diskfilter.c;
1958 common = grub-core/partmap/gpt.c;
1959+ common = grub-core/partmap/msdos.c;
1960 };
1961
1962 library = {
1963@@ -109,7 +110,6 @@
1964 common = grub-core/partmap/acorn.c;
1965 common = grub-core/partmap/amiga.c;
1966 common = grub-core/partmap/apple.c;
1967- common = grub-core/partmap/msdos.c;
1968 common = grub-core/partmap/sun.c;
1969 common = grub-core/partmap/plan.c;
1970 common = grub-core/partmap/dvh.c;
1971
1972=== modified file 'debian/changelog'
1973--- debian/changelog 2012-10-14 09:30:55 +0000
1974+++ debian/changelog 2012-12-03 15:27:20 +0000
1975@@ -1,3 +1,10 @@
1976+grub2 (2.00-7ubuntu11.1) quantal; urgency=low
1977+
1978+ * debian/ldm-require-sfs-partition.patch: Only recognize ldm partition
1979+ table if there is an SFS partition listed in the DOS MBR (LP: #1061255)
1980+
1981+ -- Phillip Susi <psusi@ubuntu.com> Wed, 28 Nov 2012 15:04:02 -0500
1982+
1983 grub2 (2.00-7ubuntu11) quantal-proposed; urgency=low
1984
1985 * Fix incorrect initrd minimum address calculation (LP: #1055686).
1986
1987=== added file 'debian/patches/ldm-require-sfs-partition.patch'
1988--- debian/patches/ldm-require-sfs-partition.patch 1970-01-01 00:00:00 +0000
1989+++ debian/patches/ldm-require-sfs-partition.patch 2012-12-03 15:27:20 +0000
1990@@ -0,0 +1,136 @@
1991+Author: Andrey Borzenkov <arvidjaar@gmail.com>
1992+Origin: grub-devel@gnu.org
1993+Bug-Ubuntu: https://bugs.launchpad.net/bugs/1061255
1994+Description: There are multiple reports of GRUB2 refusing to install on
1995+ disk which was used for LDM in the past. Example is:
1996+ https://bugs.launchpad.net/ubuntu/+source/grub2/+bug/1061255
1997+
1998+ I tested behavior of Windows and Linux on a disk with valid LDM
1999+ signature but manually modified partition table. Both ignore LDM labels
2000+ if disk does not contain SFS partition (0x42) and treat is as pure MBR
2001+ disk. This differs from GRUB2 behavior which always checks for LDM
2002+ label whether SFS partition exists or not.
2003+
2004+ Would the following be appropriate? It adds additional check for
2005+ partition 0x42 before checking for LDM labels.
2006+
2007+ -andrey
2008+
2009+--- a/grub-core/disk/ldm.c
2010++++ b/grub-core/disk/ldm.c
2011+@@ -22,6 +22,7 @@
2012+ #include <grub/err.h>
2013+ #include <grub/misc.h>
2014+ #include <grub/diskfilter.h>
2015++#include <grub/msdos_partition.h>
2016+ #include <grub/gpt_partition.h>
2017+ #include <grub/i18n.h>
2018+
2019+@@ -103,6 +104,34 @@
2020+ return ret;
2021+ }
2022+
2023++static int
2024++msdos_has_ldm_partition (grub_disk_t dsk)
2025++{
2026++ grub_err_t err;
2027++ int has_sfs = 0;
2028++ auto int hook (grub_disk_t disk, const grub_partition_t p);
2029++ int hook (grub_disk_t disk __attribute__ ((unused)), const grub_partition_t p)
2030++ {
2031++ if (p->number >= 4)
2032++ return 1;
2033++ if (p->msdostype == GRUB_PC_PARTITION_TYPE_SFS)
2034++ {
2035++ has_sfs = 1;
2036++ return 1;
2037++ }
2038++ return 0;
2039++ }
2040++
2041++ err = grub_partition_msdos_iterate (dsk, hook);
2042++ if (err)
2043++ {
2044++ grub_errno = GRUB_ERR_NONE;
2045++ return 0;
2046++ }
2047++
2048++ return has_sfs;
2049++}
2050++
2051+ static const grub_gpt_part_type_t ldm_type = GRUB_GPT_PARTITION_TYPE_LDM;
2052+
2053+ static grub_disk_addr_t
2054+@@ -756,17 +785,20 @@
2055+
2056+ {
2057+ int i;
2058++ int has_sfs = msdos_has_ldm_partition (disk);
2059+ for (i = 0; i < 3; i++)
2060+ {
2061+ grub_disk_addr_t sector = LDM_LABEL_SECTOR;
2062+ switch (i)
2063+ {
2064+ case 0:
2065++ if (!has_sfs)
2066++ continue;
2067+ sector = LDM_LABEL_SECTOR;
2068+ break;
2069+ case 1:
2070+ /* LDM is never inside a partition. */
2071+- if (disk->partition)
2072++ if (!has_sfs || disk->partition)
2073+ continue;
2074+ sector = grub_disk_get_size (disk);
2075+ if (sector == GRUB_DISK_SIZE_UNKNOWN)
2076+@@ -867,6 +899,7 @@
2077+ grub_util_is_ldm (grub_disk_t disk)
2078+ {
2079+ int i;
2080++ int has_sfs = msdos_has_ldm_partition (disk);
2081+ for (i = 0; i < 3; i++)
2082+ {
2083+ grub_disk_addr_t sector = LDM_LABEL_SECTOR;
2084+@@ -876,11 +909,13 @@
2085+ switch (i)
2086+ {
2087+ case 0:
2088++ if (!has_sfs)
2089++ continue;
2090+ sector = LDM_LABEL_SECTOR;
2091+ break;
2092+ case 1:
2093+ /* LDM is never inside a partition. */
2094+- if (disk->partition)
2095++ if (!has_sfs || disk->partition)
2096+ continue;
2097+ sector = grub_disk_get_size (disk);
2098+ if (sector == GRUB_DISK_SIZE_UNKNOWN)
2099+--- a/include/grub/msdos_partition.h
2100++++ b/include/grub/msdos_partition.h
2101+@@ -43,6 +43,7 @@
2102+ #define GRUB_PC_PARTITION_TYPE_FAT16_LBA 0xe
2103+ #define GRUB_PC_PARTITION_TYPE_WIN95_EXTENDED 0xf
2104+ #define GRUB_PC_PARTITION_TYPE_PLAN9 0x39
2105++#define GRUB_PC_PARTITION_TYPE_SFS 0x42
2106+ #define GRUB_PC_PARTITION_TYPE_EZD 0x55
2107+ #define GRUB_PC_PARTITION_TYPE_MINIX 0x80
2108+ #define GRUB_PC_PARTITION_TYPE_LINUX_MINIX 0x81
2109+--- a/Makefile.util.def
2110++++ b/Makefile.util.def
2111+@@ -32,6 +32,7 @@
2112+ common = grub-core/disk/ldm.c;
2113+ common = grub-core/disk/diskfilter.c;
2114+ common = grub-core/partmap/gpt.c;
2115++ common = grub-core/partmap/msdos.c;
2116+ };
2117+
2118+ library = {
2119+@@ -109,7 +110,6 @@
2120+ common = grub-core/partmap/acorn.c;
2121+ common = grub-core/partmap/amiga.c;
2122+ common = grub-core/partmap/apple.c;
2123+- common = grub-core/partmap/msdos.c;
2124+ common = grub-core/partmap/sun.c;
2125+ common = grub-core/partmap/plan.c;
2126+ common = grub-core/partmap/dvh.c;
2127
2128=== modified file 'debian/patches/series'
2129--- debian/patches/series 2012-10-14 09:30:55 +0000
2130+++ debian/patches/series 2012-12-03 15:27:20 +0000
2131@@ -55,3 +55,4 @@
2132 ubuntu_linuxefi_debug.patch
2133 ubuntu_mount_readdir_symlink_failures.patch
2134 ubuntu_initrd_addr_min.patch
2135+ldm-require-sfs-partition.patch
2136
2137=== modified file 'grub-core/disk/ldm.c'
2138--- grub-core/disk/ldm.c 2012-09-13 18:02:04 +0000
2139+++ grub-core/disk/ldm.c 2012-12-03 15:27:20 +0000
2140@@ -22,6 +22,7 @@
2141 #include <grub/err.h>
2142 #include <grub/misc.h>
2143 #include <grub/diskfilter.h>
2144+#include <grub/msdos_partition.h>
2145 #include <grub/gpt_partition.h>
2146 #include <grub/i18n.h>
2147
2148@@ -103,6 +104,34 @@
2149 return ret;
2150 }
2151
2152+static int
2153+msdos_has_ldm_partition (grub_disk_t dsk)
2154+{
2155+ grub_err_t err;
2156+ int has_sfs = 0;
2157+ auto int hook (grub_disk_t disk, const grub_partition_t p);
2158+ int hook (grub_disk_t disk __attribute__ ((unused)), const grub_partition_t p)
2159+ {
2160+ if (p->number >= 4)
2161+ return 1;
2162+ if (p->msdostype == GRUB_PC_PARTITION_TYPE_SFS)
2163+ {
2164+ has_sfs = 1;
2165+ return 1;
2166+ }
2167+ return 0;
2168+ }
2169+
2170+ err = grub_partition_msdos_iterate (dsk, hook);
2171+ if (err)
2172+ {
2173+ grub_errno = GRUB_ERR_NONE;
2174+ return 0;
2175+ }
2176+
2177+ return has_sfs;
2178+}
2179+
2180 static const grub_gpt_part_type_t ldm_type = GRUB_GPT_PARTITION_TYPE_LDM;
2181
2182 static grub_disk_addr_t
2183@@ -756,17 +785,20 @@
2184
2185 {
2186 int i;
2187+ int has_sfs = msdos_has_ldm_partition (disk);
2188 for (i = 0; i < 3; i++)
2189 {
2190 grub_disk_addr_t sector = LDM_LABEL_SECTOR;
2191 switch (i)
2192 {
2193 case 0:
2194+ if (!has_sfs)
2195+ continue;
2196 sector = LDM_LABEL_SECTOR;
2197 break;
2198 case 1:
2199 /* LDM is never inside a partition. */
2200- if (disk->partition)
2201+ if (!has_sfs || disk->partition)
2202 continue;
2203 sector = grub_disk_get_size (disk);
2204 if (sector == GRUB_DISK_SIZE_UNKNOWN)
2205@@ -867,6 +899,7 @@
2206 grub_util_is_ldm (grub_disk_t disk)
2207 {
2208 int i;
2209+ int has_sfs = msdos_has_ldm_partition (disk);
2210 for (i = 0; i < 3; i++)
2211 {
2212 grub_disk_addr_t sector = LDM_LABEL_SECTOR;
2213@@ -876,11 +909,13 @@
2214 switch (i)
2215 {
2216 case 0:
2217+ if (!has_sfs)
2218+ continue;
2219 sector = LDM_LABEL_SECTOR;
2220 break;
2221 case 1:
2222 /* LDM is never inside a partition. */
2223- if (disk->partition)
2224+ if (!has_sfs || disk->partition)
2225 continue;
2226 sector = grub_disk_get_size (disk);
2227 if (sector == GRUB_DISK_SIZE_UNKNOWN)
2228
2229=== modified file 'include/grub/msdos_partition.h'
2230--- include/grub/msdos_partition.h 2012-09-13 18:02:04 +0000
2231+++ include/grub/msdos_partition.h 2012-12-03 15:27:20 +0000
2232@@ -43,6 +43,7 @@
2233 #define GRUB_PC_PARTITION_TYPE_FAT16_LBA 0xe
2234 #define GRUB_PC_PARTITION_TYPE_WIN95_EXTENDED 0xf
2235 #define GRUB_PC_PARTITION_TYPE_PLAN9 0x39
2236+#define GRUB_PC_PARTITION_TYPE_SFS 0x42
2237 #define GRUB_PC_PARTITION_TYPE_EZD 0x55
2238 #define GRUB_PC_PARTITION_TYPE_MINIX 0x80
2239 #define GRUB_PC_PARTITION_TYPE_LINUX_MINIX 0x81

Subscribers

People subscribed via source and target branches

to all changes: