Package: grub-pc; Maintainer for grub-pc is GRUB Maintainers <pkg-grub-devel@lists.alioth.debian.org>; Source for grub-pc is src:grub2 (PTS, buildd, popcon).
Reported by: Vaidyanathan Srinivasan <svaidy@gmail.com>
Date: Sun, 21 Mar 2010 19:03:02 UTC
Severity: grave
Tags: d-i, patch, upstream
Found in version grub2/1.98-1
Fixed in version grub2/1.98+20100702-1
Done: Colin Watson <cjwatson@debian.org>
Bug is archived. No further changes may be made.
View this report as an mbox folder, status mbox, maintainer mbox
Report forwarded
to debian-bugs-dist@lists.debian.org, svaidy@gmail.com, GRUB Maintainers <pkg-grub-devel@lists.alioth.debian.org>:
Bug#574863; Package grub-pc.
(Sun, 21 Mar 2010 19:03:05 GMT) (full text, mbox, link).
Acknowledgement sent
to Vaidyanathan Srinivasan <svaidy@gmail.com>:
New Bug report received and forwarded. Copy sent to svaidy@gmail.com, GRUB Maintainers <pkg-grub-devel@lists.alioth.debian.org>.
(Sun, 21 Mar 2010 19:03:05 GMT) (full text, mbox, link).
Message #5 received at submit@bugs.debian.org (full text, mbox, reply):
Package: grub-pc
Version: 1.98-1
Severity: important
Tags: d-i patch upstream
-- Package-specific info:
*********************** BEGIN /proc/mounts
/dev/mapper/sagarikavg-sidux / reiserfs rw,noatime 0 0
/dev/mapper/sagarikavg-svwork /home/sv ext4 rw,noatime,barrier=1,data=ordered 0 0
/dev/mapper/sagarikavg-photoslv /home/photos reiserfs rw,noatime 0 0
/dev/mapper/sagarikavg-videos /home/videos reiserfs rw,noatime 0 0
/dev/mapper/sagarikavg-audiolv /home/audios reiserfs rw,noatime 0 0
/dev/sdb1 /mnt vfat rw,relatime,fmask=0022,dmask=0022,codepage=cp437,iocharset=utf8,shortname=mixed,utf8,errors=remount-ro 0 0
*********************** END /proc/mounts
*********************** BEGIN /boot/grub/device.map
(hd0) /dev/sda
(hd1) /dev/sdb
*********************** END /boot/grub/device.map
*********************** BEGIN /boot/grub/grub.cfg
#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by /usr/sbin/grub-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#
### BEGIN /etc/grub.d/00_header ###
insmod lvm
if [ -s $prefix/grubenv ]; then
load_env
fi
set default="0"
if [ ${prev_saved_entry} ]; then
set saved_entry=${prev_saved_entry}
save_env saved_entry
set prev_saved_entry=
save_env prev_saved_entry
set boot_once=true
fi
function savedefault {
if [ -z ${boot_once} ]; then
saved_entry=${chosen}
save_env saved_entry
fi
}
insmod lvm
insmod reiserfs
set root='(sagarikavg-sidux)'
search --no-floppy --fs-uuid --set 5bb8940f-c54d-436a-86c6-f1eaf627f89d
if loadfont /usr/share/grub/unicode.pf2 ; then
set gfxmode=640x480
insmod gfxterm
insmod vbe
if terminal_output gfxterm ; then true ; else
# For backward compatibility with versions of terminal.mod that don't
# understand terminal_output
terminal gfxterm
fi
fi
insmod lvm
insmod reiserfs
set root='(sagarikavg-sidux)'
search --no-floppy --fs-uuid --set 5bb8940f-c54d-436a-86c6-f1eaf627f89d
set locale_dir=($root)/boot/grub/locale
set lang=en
insmod gettext
set timeout=5
### END /etc/grub.d/00_header ###
### BEGIN /etc/grub.d/05_debian_theme ###
set menu_color_normal=cyan/blue
set menu_color_highlight=white/blue
### END /etc/grub.d/05_debian_theme ###
### BEGIN /etc/grub.d/10_linux ###
menuentry "Debian GNU/Linux, with Linux 2.6.33-1.slh.3-sidux-amd64" --class debian --class gnu-linux --class gnu --class os {
insmod lvm
insmod reiserfs
set root='(sagarikavg-sidux)'
search --no-floppy --fs-uuid --set 5bb8940f-c54d-436a-86c6-f1eaf627f89d
echo Loading Linux 2.6.33-1.slh.3-sidux-amd64 ...
linux /boot/vmlinuz-2.6.33-1.slh.3-sidux-amd64 root=/dev/mapper/sagarikavg-sidux ro quiet quiet
echo Loading initial ramdisk ...
initrd /boot/initrd.img-2.6.33-1.slh.3-sidux-amd64
}
### END /etc/grub.d/10_linux ###
### BEGIN /etc/grub.d/20_memtest86+ ###
menuentry "Memory test (memtest86+)" {
insmod lvm
insmod reiserfs
set root='(sagarikavg-sidux)'
search --no-floppy --fs-uuid --set 5bb8940f-c54d-436a-86c6-f1eaf627f89d
multiboot /boot/memtest86+_multiboot.bin
}
menuentry "Memory test (memtest86+, serial console 115200)" {
insmod lvm
insmod reiserfs
set root='(sagarikavg-sidux)'
search --no-floppy --fs-uuid --set 5bb8940f-c54d-436a-86c6-f1eaf627f89d
multiboot /boot/memtest86+_multiboot.bin console=ttyS0,115200n8
}
### END /etc/grub.d/20_memtest86+ ###
### BEGIN /etc/grub.d/30_os-prober ###
menuentry "Debian GNU/Linux, with Linux 2.6.32-2.slh.4-sidux-amd64 (on /dev/mapper/sagarikavg-sidux2)" {
insmod lvm
insmod ext2
set root='(sagarikavg-sidux2)'
search --no-floppy --fs-uuid --set 98e7755e-d101-479a-b13c-d8eb807fa383
linux /boot/vmlinuz-2.6.32-2.slh.4-sidux-amd64 root=/dev/mapper/sagarikavg-sidux2 ro vga=791 quiet
initrd /boot/initrd.img-2.6.32-2.slh.4-sidux-amd64
}
menuentry "Debian GNU/Linux, with Linux 2.6.32-2.slh.4-sidux-amd64 (recovery mode) (on /dev/mapper/sagarikavg-sidux2)" {
insmod lvm
insmod ext2
set root='(sagarikavg-sidux2)'
search --no-floppy --fs-uuid --set 98e7755e-d101-479a-b13c-d8eb807fa383
linux /boot/vmlinuz-2.6.32-2.slh.4-sidux-amd64 root=/dev/mapper/sagarikavg-sidux2 ro single vga=791
initrd /boot/initrd.img-2.6.32-2.slh.4-sidux-amd64
}
menuentry "Debian GNU/Linux, with Linux 2.6.31-rc4-sv (on /dev/mapper/sagarikavg-squeeze2)" {
insmod lvm
insmod ext2
set root='(sagarikavg-squeeze2)'
search --no-floppy --fs-uuid --set 78f67108-7883-4a8e-8289-63c40f938610
linux /boot/vmlinuz-2.6.31-rc4-sv root=/dev/mapper/sagarikavg-squeeze2 ro quiet
initrd /boot/initrd.img-2.6.31-rc4-sv
}
menuentry "Debian GNU/Linux, with Linux 2.6.31-rc4-sv (recovery mode) (on /dev/mapper/sagarikavg-squeeze2)" {
insmod lvm
insmod ext2
set root='(sagarikavg-squeeze2)'
search --no-floppy --fs-uuid --set 78f67108-7883-4a8e-8289-63c40f938610
linux /boot/vmlinuz-2.6.31-rc4-sv root=/dev/mapper/sagarikavg-squeeze2 ro single quiet
initrd /boot/initrd.img-2.6.31-rc4-sv
}
menuentry "Debian GNU/Linux, with Linux 2.6.30-2-amd64 (on /dev/mapper/sagarikavg-squeeze2)" {
insmod lvm
insmod ext2
set root='(sagarikavg-squeeze2)'
search --no-floppy --fs-uuid --set 78f67108-7883-4a8e-8289-63c40f938610
linux /boot/vmlinuz-2.6.30-2-amd64 root=/dev/mapper/sagarikavg-squeeze2 ro quiet
initrd /boot/initrd.img-2.6.30-2-amd64
}
menuentry "Debian GNU/Linux, with Linux 2.6.30-2-amd64 (recovery mode) (on /dev/mapper/sagarikavg-squeeze2)" {
insmod lvm
insmod ext2
set root='(sagarikavg-squeeze2)'
search --no-floppy --fs-uuid --set 78f67108-7883-4a8e-8289-63c40f938610
linux /boot/vmlinuz-2.6.30-2-amd64 root=/dev/mapper/sagarikavg-squeeze2 ro single quiet
initrd /boot/initrd.img-2.6.30-2-amd64
}
menuentry "Debian GNU/Linux, with Linux 2.6.30-1-amd64 (on /dev/mapper/sagarikavg-squeeze2)" {
insmod lvm
insmod ext2
set root='(sagarikavg-squeeze2)'
search --no-floppy --fs-uuid --set 78f67108-7883-4a8e-8289-63c40f938610
linux /boot/vmlinuz-2.6.30-1-amd64 root=/dev/mapper/sagarikavg-squeeze2 ro quiet
initrd /boot/initrd.img-2.6.30-1-amd64
}
menuentry "Debian GNU/Linux, with Linux 2.6.30-1-amd64 (recovery mode) (on /dev/mapper/sagarikavg-squeeze2)" {
insmod lvm
insmod ext2
set root='(sagarikavg-squeeze2)'
search --no-floppy --fs-uuid --set 78f67108-7883-4a8e-8289-63c40f938610
linux /boot/vmlinuz-2.6.30-1-amd64 root=/dev/mapper/sagarikavg-squeeze2 ro single quiet
initrd /boot/initrd.img-2.6.30-1-amd64
}
menuentry "Debian GNU/Linux, linux 2.6.30-1-amd64 (on /dev/mapper/sagarikavg-squeezylv)" {
insmod lvm
insmod ext2
set root='(sagarikavg-squeezylv)'
search --no-floppy --fs-uuid --set 2a542bbf-2ef1-4a6b-a155-6c71106b767b
linux /boot/vmlinuz-2.6.30-1-amd64 root=/dev/mapper/sagarikavg-squeezylv ro quiet
initrd /boot/initrd.img-2.6.30-1-amd64
}
menuentry "Debian GNU/Linux, linux 2.6.30-1-amd64 (recovery mode) (on /dev/mapper/sagarikavg-squeezylv)" {
insmod lvm
insmod ext2
set root='(sagarikavg-squeezylv)'
search --no-floppy --fs-uuid --set 2a542bbf-2ef1-4a6b-a155-6c71106b767b
linux /boot/vmlinuz-2.6.30-1-amd64 root=/dev/mapper/sagarikavg-squeezylv ro single quiet
initrd /boot/initrd.img-2.6.30-1-amd64
}
### END /etc/grub.d/30_os-prober ###
### BEGIN /etc/grub.d/40_custom ###
# This file provides an easy way to add custom menu entries. Simply type the
# menu entries you want to add after this comment. Be careful not to change
# the 'exec tail' line above.
### END /etc/grub.d/40_custom ###
*********************** END /boot/grub/grub.cfg
-- System Information:
Debian Release: squeeze/sid
APT prefers unstable
APT policy: (500, 'unstable')
Architecture: amd64 (x86_64)
Kernel: Linux 2.6.33-1.slh.3-sidux-amd64 (SMP w/4 CPU cores; PREEMPT)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Versions of packages grub-pc depends on:
ii debconf [debconf-2.0] 1.5.28 Debian configuration management sy
ii grub-common 1.98-1 GRand Unified Bootloader, version
ii libc6 2.10.2-6 Embedded GNU C Library: Shared lib
ii ucf 3.0025 Update Configuration File: preserv
grub-pc recommends no packages.
Versions of packages grub-pc suggests:
pn desktop-base <none> (no description available)
-- debconf information:
grub2/kfreebsd_cmdline:
* grub2/linux_cmdline: quiet
* grub-pc/chainload_from_menu.lst: false
grub-pc/kopt_extracted: true
* grub-pc/install_devices: /dev/sda
grub-pc/postrm_purge_boot_grub: false
grub2/kfreebsd_cmdline_default: quiet
* grub2/linux_cmdline_default: quiet
------------------------------------------
Problem Description:
Creation of a snapshot logical volume makes grup-pc complete skip the volume
group and makes the system not bootable. (/boot is in an LVM). The problem is
in the code in lvm.c:grub_lvm_scan_device()
Whenever there is a snapshot logical volume, there is a special LV of
"type = snapshot" that is created to handle the snapshot operation.
This LV is hidden and is part of the LVM metadata but not listed in lvdisplay.
This special LV will not have the "stripe_count = xxx" property. The actual
stripe_count will be same as the source LV 'origin = ' property.
However in the code any LV not having a stripe_count property is treated as a
fatal error and control jumps to lvs_segment_fail: and further fail4: and
ultimately skips the entire VG. None of the LVs are populated in the vg_list
leading to grub-probe failure and further issues that completely breaks grub-pc
installation and updation.
Bug:
root@sagarika:~# grub-probe -t abstraction /
grub-probe: error: no mapping exists for `sagarikavg-sidux'.
With attached fix:
root@sagarika:/root/patch-grub/grub2-1.98# ./grub-probe -t abstraction /
lvm
Signed-off-by: Vaidyanathan Srinivasan <svaidy@gmail.com>
Index: grub2-1.98/disk/lvm.c
===================================================================
--- grub2-1.98.orig/disk/lvm.c 2010-03-22 00:09:03.000000000 +0530
+++ grub2-1.98/disk/lvm.c 2010-03-22 00:11:55.000000000 +0530
@@ -413,7 +413,7 @@
/* And add all the lvs to the volume group. */
while (1)
{
- int s;
+ int s, skip_lv;
struct grub_lvm_lv *lv;
struct grub_lvm_segment *seg;
@@ -424,6 +424,7 @@
break;
lv = grub_malloc (sizeof (*lv));
+ skip_lv = 0; /*Flag to skip snapshots */
q = p;
while (*q != ' ')
@@ -458,6 +459,13 @@
seg->extent_count = grub_lvm_getvalue (&p, "extent_count = ");
if (p == NULL)
goto lvs_segment_fail;
+ seg->extent_count = grub_lvm_getvalue (&p, "type = ");
+ if (p == NULL)
+ goto lvs_segment_fail;
+ if (!grub_strncmp(p, "\"snapshot\"", 10)) {
+ skip_lv=1; /* Found a snapshot LV */
+ break;
+ }
seg->stripe_count = grub_lvm_getvalue (&p, "stripe_count = ");
if (p == NULL)
goto lvs_segment_fail;
@@ -530,6 +538,12 @@
goto lvs_fail;
p += 3;
+ if (skip_lv) {
+ grub_free (lv->name);
+ grub_free (lv);
+ continue;
+ }
+
lv->number = lv_count++;
lv->vg = vg;
lv->next = vg->lvs;
---
This fix is not complete and sufficient to make grub-pc work in the presence of
lvm snapshots. There seem to be more issues in the presence of a snapshot LV.
I am hitting a filesystem detection problem right after fixing this issue.
# ./grub-probe /
../grub-probe: error: unknown filesystem.
Atleast this fix will make grub-probe recognise the VG and discover the LVs.
Please not that _ALL_ these issues disappear once all snapshot LVs are deleted.
I create snapshot LV with the following command:
lvcreate -L 1g -n sidux-snap-10313 -s /dev/sagarikavg/sidux
Thanks for your attention to this problem. I will post an update when I find
more fixes.
--Vaidy
Information forwarded
to debian-bugs-dist@lists.debian.org, GRUB Maintainers <pkg-grub-devel@lists.alioth.debian.org>:
Bug#574863; Package grub-pc.
(Thu, 06 May 2010 22:51:03 GMT) (full text, mbox, link).
Acknowledgement sent
to sean finney <seanius@debian.org>:
Extra info received and forwarded to list. Copy sent to GRUB Maintainers <pkg-grub-devel@lists.alioth.debian.org>.
(Thu, 06 May 2010 22:51:03 GMT) (full text, mbox, link).
Message #10 received at 574863@bugs.debian.org (full text, mbox, reply):
[Message part 1 (text/plain, inline)]
severity 574863 grave thanks I am raising the severity because it breaks the entire system. My system crashed while an lvm snapshot was active, and was not able to boot after that point. grub freaks out and drops the user to a useless "rescue>" prompt, and worse it can not be fixed as long as the snapshot is present, even from a rescue cd. the user will be given errors about not being able to map the root lvm device or otherwise devices not existing or being invalid, even though it has nothing to do with the error, for reasons that the OP has illustrated. sean
[signature.asc (application/pgp-signature, inline)]
Severity set to 'grave' from 'important'
Request was from sean finney <seanius@debian.org>
to control@bugs.debian.org.
(Thu, 06 May 2010 22:51:04 GMT) (full text, mbox, link).
Information forwarded
to debian-bugs-dist@lists.debian.org, GRUB Maintainers <pkg-grub-devel@lists.alioth.debian.org>:
Bug#574863; Package grub-pc.
(Sun, 09 May 2010 21:45:06 GMT) (full text, mbox, link).
Acknowledgement sent
to sean finney <seanius@debian.org>:
Extra info received and forwarded to list. Copy sent to GRUB Maintainers <pkg-grub-devel@lists.alioth.debian.org>.
(Sun, 09 May 2010 21:45:06 GMT) (full text, mbox, link).
Message #17 received at 574863@bugs.debian.org (full text, mbox, reply):
[Message part 1 (text/plain, inline)]
here's an updated, but still incomplete patch. the main problem with the previous patch was that the extent_count variable was being overwritten when fetching the type option value. simply removing that fixed that problem. there were further problems with the lv's though, as it seems (i'm not an lvm guru by any means) that a snapshot consists of two entries, one named "snapshot0" (this was the one the previous patch would skip), and another one with the snapshot name, which is notably different from the others in that the "status" field does not contain "VISIBLE" like the others. i updated the patch to also skip such lv entries, which cleared further problems. after these two steps, running update-grub/grub-install/grub-probe all work without reporting errors. *HOWEVER*, the system still doesn't boot. after reinstalling grub and regenerating /boot/grub/grub.cfg, the user is greeted with the error: error: no such disk error: physical volume pv0 not found Entering rescue mode... grub rescue> so it looks like there is yet another failure in grub_lvm_read causing this. honestly the code is so full of spaghetti i'm having trouble making it much further. i have a test setup running under kvm so if anyone has something they want me to try please let me know. otherwise i'll continue to hack at it but i'm not too optomistic. sean --
[574863.patch.2.diff (text/x-diff, attachment)]
[signature.asc (application/pgp-signature, inline)]
Information forwarded
to debian-bugs-dist@lists.debian.org, GRUB Maintainers <pkg-grub-devel@lists.alioth.debian.org>:
Bug#574863; Package grub-pc.
(Wed, 02 Jun 2010 22:45:03 GMT) (full text, mbox, link).
Acknowledgement sent
to sean finney <seanius@debian.org>:
Extra info received and forwarded to list. Copy sent to GRUB Maintainers <pkg-grub-devel@lists.alioth.debian.org>.
(Wed, 02 Jun 2010 22:45:03 GMT) (full text, mbox, link).
Message #22 received at 574863@bugs.debian.org (full text, mbox, reply):
[Message part 1 (text/plain, inline)]
okay, I think the attached patch should fix the problem. I haven't tested it thoroughly, though my system does boot. It seems there may be a seperate issue with os-prober that results in some junk entries being added to grub.conf if the snapshot volumes happen to be root filesystems, but that probably needs to be taken up seperately and the critical aspect of the bug is fixed anyway. sean
[574863.patch.3.diff (text/x-diff, attachment)]
[signature.asc (application/pgp-signature, inline)]
Information forwarded
to debian-bugs-dist@lists.debian.org, GRUB Maintainers <pkg-grub-devel@lists.alioth.debian.org>:
Bug#574863; Package grub-pc.
(Thu, 03 Jun 2010 18:45:15 GMT) (full text, mbox, link).
Acknowledgement sent
to sean finney <seanius@debian.org>:
Extra info received and forwarded to list. Copy sent to GRUB Maintainers <pkg-grub-devel@lists.alioth.debian.org>.
(Thu, 03 Jun 2010 18:45:15 GMT) (full text, mbox, link).
Message #27 received at 574863@bugs.debian.org (full text, mbox, reply):
[Message part 1 (text/plain, inline)]
and here is a slightly updated patch. there is no functional change in the
code, i have only reformatted the whitespace etc so that the code matches
with the style of the surrounding code.
i have also tested this now on my primary testing system and haven't
noticed any problems.
sean
On Thu, Jun 03, 2010 at 12:41:32AM +0200, sean finney wrote:
> okay, I think the attached patch should fix the problem.
>
> I haven't tested it thoroughly, though my system does boot. It seems
> there may be a seperate issue with os-prober that results in some junk
> entries being added to grub.conf if the snapshot volumes happen to be
> root filesystems, but that probably needs to be taken up seperately and
> the critical aspect of the bug is fixed anyway.
>
>
> sean
> Author: Sean Finney <seanius@debian.org>
> Description: Fix for lvm2 parsing failures with snapshot logical volumes
>
> This patch prevents the lvm2 parsing code from prematurely aborting
> when encountering LV and segment metadata related to snapshot volumes.
> Instead, the parser will now skip over these as if it never saw them,
> which is probably the safest thing to do without a major injection of
> lvm2 support code.
>
> Bug-Debian: #574863
> --- disk/lvm.c 2010-04-27 15:25:12 +0000
> +++ disk/lvm.c 2010-06-02 22:12:58 +0000
> @@ -420,9 +420,11 @@
> /* And add all the lvs to the volume group. */
> while (1)
> {
> - int s;
> + int s, skip_lv = 0, status_visible = 0;
> struct grub_lvm_lv *lv;
> struct grub_lvm_segment *seg;
> + char *status = NULL, *status_end = NULL;
> + grub_size_t status_len = 0;
>
> while (grub_isspace (*p))
> p++;
> @@ -431,6 +433,8 @@
> break;
>
> lv = grub_malloc (sizeof (*lv));
> + skip_lv = 0; /*Flag to skip snapshots */
> + status_visible = 0; /*Flag to skip non-visible LV's */
>
> q = p;
> while (*q != ' ')
> @@ -445,6 +449,25 @@
>
> lv->size = 0;
>
> + /* read LV status and ignore ones not listed as "VISIBLE" */
> + p = grub_strstr (p, "status = ");
> + if (p == NULL)
> + goto lvs_fail;
> + status_end = grub_strchr(p, ']');
> + if (status_end == NULL)
> + goto lvs_fail;
> + status_len = (status_end - p) + 1;
> + status = grub_malloc(status_len + 1);
> + if (status == NULL)
> + goto lvs_fail;
> + grub_memcpy(status, p, status_len);
> + status[status_len] = '\0';
> + if (grub_strstr(status, "VISIBLE") != NULL)
> + status_visible = 1;
> + grub_free(status);
> + if (!status_visible)
> + goto lv_parsed; /* don't bother parsing this one */
> +
> lv->segment_count = grub_lvm_getvalue (&p, "segment_count = ");
> if (p == NULL)
> goto lvs_fail;
> @@ -465,6 +488,18 @@
> seg->extent_count = grub_lvm_getvalue (&p, "extent_count = ");
> if (p == NULL)
> goto lvs_segment_fail;
> +
> + /* Skip LV's that have snapshot segments */
> + p = grub_strstr (p, "type = ");
> + if (p == NULL)
> + goto lvs_segment_fail;
> + p += sizeof("type = ") - 1;
> + if (!grub_strncmp(p, "\"snapshot\"", 10)) {
> + /* Found a snapshot, give up and move on */
> + skip_lv=1;
> + break;
> + }
> +
> seg->stripe_count = grub_lvm_getvalue (&p, "stripe_count = ");
> if (p == NULL)
> goto lvs_segment_fail;
> @@ -531,12 +566,19 @@
> goto fail4;
> }
>
> + lv_parsed: /* all done with parsing this LV, seek to the end */
> if (p != NULL)
> p = grub_strchr (p, '}');
> if (p == NULL)
> goto lvs_fail;
> p += 3;
>
> + if (skip_lv || ! status_visible) {
> + grub_free (lv->name);
> + grub_free (lv);
> + continue;
> + }
> +
> lv->number = lv_count++;
> lv->vg = vg;
> lv->next = vg->lvs;
>
--
[574863.patch.4.diff (text/x-diff, attachment)]
[signature.asc (application/pgp-signature, inline)]
Information forwarded
to debian-bugs-dist@lists.debian.org, GRUB Maintainers <pkg-grub-devel@lists.alioth.debian.org>:
Bug#574863; Package grub-pc.
(Wed, 23 Jun 2010 17:45:03 GMT) (full text, mbox, link).
Acknowledgement sent
to sean finney <seanius@debian.org>:
Extra info received and forwarded to list. Copy sent to GRUB Maintainers <pkg-grub-devel@lists.alioth.debian.org>.
(Wed, 23 Jun 2010 17:45:03 GMT) (full text, mbox, link).
Message #32 received at 574863@bugs.debian.org (full text, mbox, reply):
[Message part 1 (text/plain, inline)]
hiya, is there anything preventing this patch from being accepted? sean
[signature.asc (application/pgp-signature, inline)]
Information forwarded
to debian-bugs-dist@lists.debian.org, GRUB Maintainers <pkg-grub-devel@lists.alioth.debian.org>:
Bug#574863; Package grub-pc.
(Tue, 29 Jun 2010 06:27:10 GMT) (full text, mbox, link).
Acknowledgement sent
to Vladimir 'φ-coder/phcoder' Serbinenko <phcoder@gmail.com>:
Extra info received and forwarded to list. Copy sent to GRUB Maintainers <pkg-grub-devel@lists.alioth.debian.org>.
(Tue, 29 Jun 2010 06:27:10 GMT) (full text, mbox, link).
Message #37 received at 574863@bugs.debian.org (full text, mbox, reply):
[Message part 1 (text/plain, inline)]
On 06/03/2010 08:41 PM, sean finney wrote:
> and here is a slightly updated patch. there is no functional change in the
> code, i have only reformatted the whitespace etc so that the code matches
> with the style of the surrounding code.
>
> i have also tested this now on my primary testing system and haven't
> noticed any problems.
>
>
I've cleaned up your patch using my more generic string parsing
functions. Could you test attached patch?
> sean
>
> On Thu, Jun 03, 2010 at 12:41:32AM +0200, sean finney wrote:
>
>> okay, I think the attached patch should fix the problem.
>>
>> I haven't tested it thoroughly, though my system does boot. It seems
>> there may be a seperate issue with os-prober that results in some junk
>> entries being added to grub.conf if the snapshot volumes happen to be
>> root filesystems, but that probably needs to be taken up seperately and
>> the critical aspect of the bug is fixed anyway.
>>
>>
>> sean
>>
>
>> Author: Sean Finney <seanius@debian.org>
>> Description: Fix for lvm2 parsing failures with snapshot logical volumes
>>
>> This patch prevents the lvm2 parsing code from prematurely aborting
>> when encountering LV and segment metadata related to snapshot volumes.
>> Instead, the parser will now skip over these as if it never saw them,
>> which is probably the safest thing to do without a major injection of
>> lvm2 support code.
>>
>> Bug-Debian: #574863
>> --- disk/lvm.c 2010-04-27 15:25:12 +0000
>> +++ disk/lvm.c 2010-06-02 22:12:58 +0000
>> @@ -420,9 +420,11 @@
>> /* And add all the lvs to the volume group. */
>> while (1)
>> {
>> - int s;
>> + int s, skip_lv = 0, status_visible = 0;
>> struct grub_lvm_lv *lv;
>> struct grub_lvm_segment *seg;
>> + char *status = NULL, *status_end = NULL;
>> + grub_size_t status_len = 0;
>>
>> while (grub_isspace (*p))
>> p++;
>> @@ -431,6 +433,8 @@
>> break;
>>
>> lv = grub_malloc (sizeof (*lv));
>> + skip_lv = 0; /*Flag to skip snapshots */
>> + status_visible = 0; /*Flag to skip non-visible LV's */
>>
>> q = p;
>> while (*q != ' ')
>> @@ -445,6 +449,25 @@
>>
>> lv->size = 0;
>>
>> + /* read LV status and ignore ones not listed as "VISIBLE" */
>> + p = grub_strstr (p, "status = ");
>> + if (p == NULL)
>> + goto lvs_fail;
>> + status_end = grub_strchr(p, ']');
>> + if (status_end == NULL)
>> + goto lvs_fail;
>> + status_len = (status_end - p) + 1;
>> + status = grub_malloc(status_len + 1);
>> + if (status == NULL)
>> + goto lvs_fail;
>> + grub_memcpy(status, p, status_len);
>> + status[status_len] = '\0';
>> + if (grub_strstr(status, "VISIBLE") != NULL)
>> + status_visible = 1;
>> + grub_free(status);
>> + if (!status_visible)
>> + goto lv_parsed; /* don't bother parsing this one */
>> +
>> lv->segment_count = grub_lvm_getvalue (&p, "segment_count = ");
>> if (p == NULL)
>> goto lvs_fail;
>> @@ -465,6 +488,18 @@
>> seg->extent_count = grub_lvm_getvalue (&p, "extent_count = ");
>> if (p == NULL)
>> goto lvs_segment_fail;
>> +
>> + /* Skip LV's that have snapshot segments */
>> + p = grub_strstr (p, "type = ");
>> + if (p == NULL)
>> + goto lvs_segment_fail;
>> + p += sizeof("type = ") - 1;
>> + if (!grub_strncmp(p, "\"snapshot\"", 10)) {
>> + /* Found a snapshot, give up and move on */
>> + skip_lv=1;
>> + break;
>> + }
>> +
>> seg->stripe_count = grub_lvm_getvalue (&p, "stripe_count = ");
>> if (p == NULL)
>> goto lvs_segment_fail;
>> @@ -531,12 +566,19 @@
>> goto fail4;
>> }
>>
>> + lv_parsed: /* all done with parsing this LV, seek to the end */
>> if (p != NULL)
>> p = grub_strchr (p, '}');
>> if (p == NULL)
>> goto lvs_fail;
>> p += 3;
>>
>> + if (skip_lv || ! status_visible) {
>> + grub_free (lv->name);
>> + grub_free (lv);
>> + continue;
>> + }
>> +
>> lv->number = lv_count++;
>> lv->vg = vg;
>> lv->next = vg->lvs;
>>
>>
>
>
>
>
>
>
> _______________________________________________
> Grub-devel mailing list
> Grub-devel@gnu.org
> http://lists.gnu.org/mailman/listinfo/grub-devel
>
--
Regards
Vladimir 'φ-coder/phcoder' Serbinenko
[lvm.diff (text/x-diff, attachment)]
[signature.asc (application/pgp-signature, attachment)]
Information forwarded
to debian-bugs-dist@lists.debian.org, GRUB Maintainers <pkg-grub-devel@lists.alioth.debian.org>:
Bug#574863; Package grub-pc.
(Wed, 30 Jun 2010 23:03:02 GMT) (full text, mbox, link).
Acknowledgement sent
to sean finney <seanius@seanius.net>:
Extra info received and forwarded to list. Copy sent to GRUB Maintainers <pkg-grub-devel@lists.alioth.debian.org>.
(Wed, 30 Jun 2010 23:03:03 GMT) (full text, mbox, link).
Message #42 received at 574863@bugs.debian.org (full text, mbox, reply):
[Message part 1 (text/plain, inline)]
hi there, On Tue, Jun 29, 2010 at 07:30:57AM +0200, Vladimir 'φ-coder/phcoder' Serbinenko wrote: > I've cleaned up your patch using my more generic string parsing > functions. Could you test attached patch? i read over the patch and it looks good. i've just tested the patch and grub-install, grub-mkconfig, and all the underlying calls to grub-probe work without problem, and the system happily boots with active lvm snapshots. so i think the patch is good from a testing perspective too. sean
[signature.asc (application/pgp-signature, inline)]
Added tag(s) pending.
Request was from Colin Watson <cjwatson@debian.org>
to control@bugs.debian.org.
(Thu, 01 Jul 2010 23:55:42 GMT) (full text, mbox, link).
Reply sent
to Colin Watson <cjwatson@debian.org>:
You have taken responsibility.
(Fri, 02 Jul 2010 17:51:28 GMT) (full text, mbox, link).
Notification sent
to Vaidyanathan Srinivasan <svaidy@gmail.com>:
Bug acknowledged by developer.
(Fri, 02 Jul 2010 17:51:28 GMT) (full text, mbox, link).
Message #49 received at 574863-close@bugs.debian.org (full text, mbox, reply):
Source: grub2
Source-Version: 1.98+20100702-1
We believe that the bug you reported is fixed in the latest version of
grub2, which is due to be installed in the Debian FTP archive:
grub-common_1.98+20100702-1_i386.deb
to main/g/grub2/grub-common_1.98+20100702-1_i386.deb
grub-coreboot_1.98+20100702-1_i386.deb
to main/g/grub2/grub-coreboot_1.98+20100702-1_i386.deb
grub-efi-amd64_1.98+20100702-1_i386.deb
to main/g/grub2/grub-efi-amd64_1.98+20100702-1_i386.deb
grub-efi-ia32_1.98+20100702-1_i386.deb
to main/g/grub2/grub-efi-ia32_1.98+20100702-1_i386.deb
grub-efi_1.98+20100702-1_i386.deb
to main/g/grub2/grub-efi_1.98+20100702-1_i386.deb
grub-emu_1.98+20100702-1_i386.deb
to main/g/grub2/grub-emu_1.98+20100702-1_i386.deb
grub-firmware-qemu_1.98+20100702-1_i386.deb
to main/g/grub2/grub-firmware-qemu_1.98+20100702-1_i386.deb
grub-ieee1275_1.98+20100702-1_i386.deb
to main/g/grub2/grub-ieee1275_1.98+20100702-1_i386.deb
grub-linuxbios_1.98+20100702-1_i386.deb
to main/g/grub2/grub-linuxbios_1.98+20100702-1_i386.deb
grub-pc_1.98+20100702-1_i386.deb
to main/g/grub2/grub-pc_1.98+20100702-1_i386.deb
grub-rescue-pc_1.98+20100702-1_i386.deb
to main/g/grub2/grub-rescue-pc_1.98+20100702-1_i386.deb
grub2_1.98+20100702-1.diff.gz
to main/g/grub2/grub2_1.98+20100702-1.diff.gz
grub2_1.98+20100702-1.dsc
to main/g/grub2/grub2_1.98+20100702-1.dsc
grub2_1.98+20100702-1_i386.deb
to main/g/grub2/grub2_1.98+20100702-1_i386.deb
grub2_1.98+20100702.orig.tar.gz
to main/g/grub2/grub2_1.98+20100702.orig.tar.gz
A summary of the changes between this version and the previous one is
attached.
Thank you for reporting the bug, which will now be closed. If you
have further comments please address them to 574863@bugs.debian.org,
and the maintainer will reopen the bug report if appropriate.
Debian distribution maintenance software
pp.
Colin Watson <cjwatson@debian.org> (supplier of updated grub2 package)
(This message was generated automatically at their request; if you
believe that there is a problem with it please contact the archive
administrators by mailing ftpmaster@debian.org)
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
Format: 1.8
Date: Fri, 02 Jul 2010 17:42:56 +0100
Source: grub2
Binary: grub2 grub-linuxbios grub-efi grub-common grub-emu grub-pc grub-rescue-pc grub-coreboot grub-efi-ia32 grub-efi-amd64 grub-ieee1275 grub-firmware-qemu grub-yeeloong
Architecture: source i386
Version: 1.98+20100702-1
Distribution: unstable
Urgency: low
Maintainer: GRUB Maintainers <pkg-grub-devel@lists.alioth.debian.org>
Changed-By: Colin Watson <cjwatson@debian.org>
Description:
grub-common - GRand Unified Bootloader, version 2 (common files)
grub-coreboot - GRand Unified Bootloader, version 2 (Coreboot version)
grub-efi - GRand Unified Bootloader, version 2 (dummy package)
grub-efi-amd64 - GRand Unified Bootloader, version 2 (EFI-AMD64 version)
grub-efi-ia32 - GRand Unified Bootloader, version 2 (EFI-IA32 version)
grub-emu - GRand Unified Bootloader, version 2 (emulated version)
grub-firmware-qemu - GRUB firmware image for QEMU
grub-ieee1275 - GRand Unified Bootloader, version 2 (Open Firmware version)
grub-linuxbios - GRand Unified Bootloader, version 2 (dummy package)
grub-pc - GRand Unified Bootloader, version 2 (PC/BIOS version)
grub-rescue-pc - GRUB bootable rescue images, version 2 (PC/BIOS version)
grub-yeeloong - GRand Unified Bootloader, version 2 (Yeeloong version)
grub2 - GRand Unified Bootloader, version 2 (dummy package)
Closes: 505517 553460 554790 565576 574863 583271 584846 586358 586462 586463 586526 586611 586799 586827 587085 587383 587790 587796
Changes:
grub2 (1.98+20100702-1) unstable; urgency=low
.
* New Bazaar snapshot.
- Use video functions in Linux loader rather than hardcoding UGA; load
all available video backends (closes: #565576, probably).
- Add support for initrd images on Fedora 13.
- Output grub.cfg stanzas for Xen (closes: #505517).
- Add 'cat --dos' option to treat DOS-style "\r\n" line endings as
simple newlines (closes: #586358).
- Change grub-mkdevicemap to emit /dev/disk/by-id/ names where possible
on Linux.
- Return CF correctly in mmap e820/e801 int15 hook (closes: #584846).
- The info documentation now has no broken references, although of
course it could still use more work (closes: #553460).
- Support GRUB_BADRAM in grub-mkconfig.
- Skip LVM snapshots (closes: #574863).
.
[ Colin Watson ]
* Mention grub-rescue-usb.img in grub-rescue-pc description (closes:
#586462).
* Add instructions for using grub-rescue-usb.img (closes: #586463).
* Remove /usr/lib/grub/mips-* from grub-common rather than the incorrect
/usr/lib/grub/mipsel-*, so that it stops clashing with grub-yeeloong;
add a versioned Replaces to grub-yeeloong just in case (closes:
#586526).
* Remove qemu-system build-dependency on hurd-i386, where it doesn't seem
to exist. Disable tests if qemu-system-i386 isn't available.
* Mark "upgrade-from-grub-legacy" paragraph in
grub-pc/chainload_from_menu.lst as untranslatable.
* Update Homepage field (thanks, Sedat Dilek).
* On Linux, if /boot/grub/device.map exists on upgrade to this version,
regenerate it to use stable device names in /dev/disk/by-id/. If it had
more than one entry, then display a critical-priority debconf note
(sorry, but it's better than silently breaking boot menu entries)
advising people to check custom boot menu entries and update them if
necessary (closes: #583271).
* Use 'set -e' rather than '#! /bin/sh -e' or '#! /bin/bash -e', to avoid
accidents when debugging with 'sh -x'.
* Store grub-pc/install_devices as persistent device names under
/dev/disk/by-id/ (closes: #554790). Migrate previous device names to
that, with explicit confirmation in non-trivial cases to make sure we
got the right ones. If the devices we were told to install to ever go
away, ask again. (This is based on the implementation in Ubuntu.)
* If grub-install fails during upgrade-from-grub-legacy, allow the user to
try again with a different device, but failing that cancel the upgrade
(closes: #587790).
* Remove numbering from patch files. The order is now explicit in a quilt
series file, and renumbering from time to time is tedious.
.
[ Updated translations ]
* Ukrainian (uk.po) by Yatsenko Alexandr / Borys Yanovych (closes:
#586611).
* Indonesian (id.po) by Arief S Fitrianto (closes: #586799).
* Swedish (sv.po) by Martin Bagge (closes: #586827).
* Persian (fa.po) by Behrad Eslamifar (closes: #587085).
* French (fr.po) by Christian Perrier (closes: #587383).
* Galician (gl.po) by Jorge Barreiro (closes: #587796).
.
[ Robert Millan ]
* Add commented GRUB_BADRAM example in debian/default/grub.
Checksums-Sha1:
a9dc715aaf2597d2c96b983b9518fa866c9b3d4a 2798 grub2_1.98+20100702-1.dsc
c99c02a953e9fd654749d9b624a0923f222a6061 1854113 grub2_1.98+20100702.orig.tar.gz
99a7bdb6200db938df8874c5515dddacf8ceda98 409664 grub2_1.98+20100702-1.diff.gz
6437039da938410d1aad870c567af2f37b1196a4 269618 grub2_1.98+20100702-1_i386.deb
f34ffe3b47930fbfcc25045d7435907503f38279 268338 grub-linuxbios_1.98+20100702-1_i386.deb
ce7e23de113acf063f7d615fa904bc29d3ee65c2 268338 grub-efi_1.98+20100702-1_i386.deb
9d05cd632de7aee8870f714574a83a4be2e3375b 1627780 grub-common_1.98+20100702-1_i386.deb
f582e5f70778fdbc23092312a4ccdcdce4321a2a 2621952 grub-emu_1.98+20100702-1_i386.deb
fb09b4073e4ae00b420612bd54468014929aa2a5 935766 grub-pc_1.98+20100702-1_i386.deb
970026ba19c56bf295dfbe7050b58fece7e5a456 1411276 grub-rescue-pc_1.98+20100702-1_i386.deb
3c80276e069fc796ffeb85c8e0f1aa85b383016d 736360 grub-coreboot_1.98+20100702-1_i386.deb
7fc5d2c69708d614a3052c4ae3671eda04d933d7 770320 grub-efi-ia32_1.98+20100702-1_i386.deb
525901e6a24763a6530fb1d81c229a84b7015ec8 844574 grub-efi-amd64_1.98+20100702-1_i386.deb
819988d940605e0db10ded6b09cc8d487f164ce4 729672 grub-ieee1275_1.98+20100702-1_i386.deb
40a9eed01090f2e73d4e880817f94bc8500b9dbd 677442 grub-firmware-qemu_1.98+20100702-1_i386.deb
Checksums-Sha256:
335eb6f34ea8078aa492b4a3201a4f17aa47fb483eece8cb87fcb334a09dac70 2798 grub2_1.98+20100702-1.dsc
2fdd87fe2a1dc0836b8562b91af76d0ceea7434c7672fefe850c01aeffc6a44b 1854113 grub2_1.98+20100702.orig.tar.gz
e1e702b4787b0bf91eff5233096e65bd5a16191511dece5991c3822a32cbf6b5 409664 grub2_1.98+20100702-1.diff.gz
213f42a276a389f5752007991738be5231993c131fd91cccfe3a58f6e83e0ab8 269618 grub2_1.98+20100702-1_i386.deb
fdcb133b5cb8f2595da583196027e0c331a8823efda54cc7196b10619e26084c 268338 grub-linuxbios_1.98+20100702-1_i386.deb
3ad0fbc9fefb742f4ef8ac994dfc667ff962eafdd32ee9b7e6cb33a7bf08d6c4 268338 grub-efi_1.98+20100702-1_i386.deb
e69d110fb734a97e9142bc0a643a51a30d0defc1c2b38510988c74845c17a15a 1627780 grub-common_1.98+20100702-1_i386.deb
dd230b47564130393b567d7f4581475cdcc6dc860fdf407e887cb33ba4573264 2621952 grub-emu_1.98+20100702-1_i386.deb
ca8749062a7bbe2a386eb7ccc15bf2750805ea4bdca2141ef0d4a15be7d946da 935766 grub-pc_1.98+20100702-1_i386.deb
43a9df026300ba07ca78c91cc990da67aa70d938ae3a52c789f454f87e6c41f2 1411276 grub-rescue-pc_1.98+20100702-1_i386.deb
6ea6eec662d88d45e828b94002ffd8d180bc95214f5685a3004fded6a802e354 736360 grub-coreboot_1.98+20100702-1_i386.deb
77043d716b619e2b08f38b33d90e48d540129d6f86c00b33d4806b08ef2aa896 770320 grub-efi-ia32_1.98+20100702-1_i386.deb
3016a35f2443b6b12c262be2fa52bf2338d6ead3dba3ed50ca3edc3f4ac584b8 844574 grub-efi-amd64_1.98+20100702-1_i386.deb
5e0af214dadf43ab85f8af0d264f2ab35d9fa871e5ebacf8ee84446b5c321be5 729672 grub-ieee1275_1.98+20100702-1_i386.deb
8603ee17f234fb1d15a3f55cfd0d83c4bad97224041f19d1b101d458984d4abe 677442 grub-firmware-qemu_1.98+20100702-1_i386.deb
Files:
9cb9436773f73a03731bd1fd56f2d8e2 2798 admin extra grub2_1.98+20100702-1.dsc
d02a7d6dec3c78a663be24e2b4ddf796 1854113 admin extra grub2_1.98+20100702.orig.tar.gz
583eaf1b003a3f1412a5b7ce1301011b 409664 admin extra grub2_1.98+20100702-1.diff.gz
26ab89ef28d08b1d72aeda6a922327a0 269618 admin extra grub2_1.98+20100702-1_i386.deb
275c80b24e128c830d0886a5bdd0a1cf 268338 admin extra grub-linuxbios_1.98+20100702-1_i386.deb
35df9fb0fd5268d08a9ee68ffee168ce 268338 admin extra grub-efi_1.98+20100702-1_i386.deb
e4b10aeaf2d088e3ba0dc0d90271e13e 1627780 admin extra grub-common_1.98+20100702-1_i386.deb
76273b3d35e845e5a920227b2bd2d9bc 2621952 admin extra grub-emu_1.98+20100702-1_i386.deb
b0432db77a11b42cb7ad2b8584ca1537 935766 admin extra grub-pc_1.98+20100702-1_i386.deb
2e450cc78e845ac5ca1b00c53004e5ba 1411276 admin extra grub-rescue-pc_1.98+20100702-1_i386.deb
6689cd9853829351e15cee5ae8d1c6fe 736360 admin extra grub-coreboot_1.98+20100702-1_i386.deb
ed6aa5960e4ada8ece330fc9ae24d331 770320 admin extra grub-efi-ia32_1.98+20100702-1_i386.deb
4388d3ed37b9180609076d8e67642773 844574 admin extra grub-efi-amd64_1.98+20100702-1_i386.deb
ed3c512fb23190bc9e971e4d8aa64337 729672 admin extra grub-ieee1275_1.98+20100702-1_i386.deb
477fc165ec280b044a7579ba6af87232 677442 admin extra grub-firmware-qemu_1.98+20100702-1_i386.deb
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)
Comment: Colin Watson <cjwatson@debian.org> -- Debian developer
iQIVAwUBTC4gLDk1h9l9hlALAQiWDA//dQGvFvnPMI+JL0YoFKx5cj4aV3z8bFa8
PqlYI2lShuSJVwRYWdYgwRdpLccW34adXZCYa4wEigB5MIrQHnY7dxq+gaPj7jI/
LbLLFl+RT4IruD2RfThKIfF0hbWd4N60DwK/rGFEzJ/h/hTlrp9EiZp0+xKLE0VB
61UNNMiPGJtFpzGmhbqEhdEgCfLtZg+yxxPoD0wFsVF4eVKu+7JDbqgOU8ipALuM
qTsLobtLmQN09Ijc3jqDjT+fFGZ90FcwuJMPGEfS3/iiRNvIvL9J5yJMqwgzUCN/
NNbEgYkIh2pNPFiQIZHt0M53A7IGjPacHQOkwxkjIXCXETe9qeQQAr0VyzF1PMh2
/tB+4Yetw90FyNMoynfv8hFyxXpxgT6H2NaM+V56UKg/2J1w7NPdP2tsRHSkVMUd
QzM8G3JXu0gEIb5udEkzcZyYOMEPr9y4MGE3gN2kmq8CeFHkEYfWx5Zu8S8cDTDJ
8KWrhUJPJi/fu00vviyyWCRv/cP6Gk6NSv2q/Y077+nSjZSM0sOmyeoIWQ+ek16b
CyfRJIXmYZRxbU+Clpuj6fPfOQum0bKJh8WccF+IYNGwoWx5mMWmWClNj1I+SHC+
NdECr8EJ0WZ/t33tt5uyL/eFCIWv2J4JmYoiHfn5TD1Pp55cydvo+TczgpsGzbCc
OdgxftYJeEo=
=tAuc
-----END PGP SIGNATURE-----
Bug archived.
Request was from Debbugs Internal Request <owner@bugs.debian.org>
to internal_control@bugs.debian.org.
(Mon, 02 Aug 2010 07:37:56 GMT) (full text, mbox, link).
Send a report that this bug log contains spam.
Debbugs is free software and licensed under the terms of the GNU Public License version 2. The current version can be obtained from https://bugs.debian.org/debbugs-source/.
Copyright © 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson, 2005-2017 Don Armstrong, and many other contributors.