Bug#574863: [PATCH] Updated fix for Debian Bug#574863: boot failure with lvm2 and snapshot volumes
sean finney
seanius at debian.org
Thu Jun 3 18:41:03 UTC 2010
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 at 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;
>
--
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 574863.patch.4.diff
Type: text/x-diff
Size: 3013 bytes
Desc: not available
URL: <http://lists.alioth.debian.org/pipermail/pkg-grub-devel/attachments/20100603/191b01e3/attachment.diff>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 190 bytes
Desc: Digital signature
URL: <http://lists.alioth.debian.org/pipermail/pkg-grub-devel/attachments/20100603/191b01e3/attachment.pgp>
More information about the Pkg-grub-devel
mailing list