grub-devel.gnu.org archive mirror
 help / color / mirror / Atom feed
From: Patrick Plenefisch <simonpatp@gmail.com>
To: The development of GNU GRUB <grub-devel@gnu.org>
Subject: [PATCH 1/2 v2] LVM Cachevol and Integrity volumes break entire LVM VG
Date: Fri, 26 Apr 2024 20:59:21 -0400	[thread overview]
Message-ID: <CAOCpoWcpGzR6EdWkaSq0bQoS=hUnNfjdOxSR4F2C7Dfa3LTbrw@mail.gmail.com> (raw)

From 42252f253ac685bbc7cea1f5c89146eeeaa364f0 Mon Sep 17 00:00:00 2001
From: Patrick Plenefisch <simonpatp@gmail.com>
Date: Sun, 18 Feb 2024 18:29:43 -0500
Subject: [PATCH 1/2] disk/lvm: Make cache_lv more generic as
 ignored_feature_lv

Signed-off-by: Patrick Plenefisch <simonpatp@gmail.com>
---
 grub-core/disk/lvm.c | 179 +++++++++++++++++++------------------------
 1 file changed, 77 insertions(+), 102 deletions(-)

diff --git a/grub-core/disk/lvm.c b/grub-core/disk/lvm.c
index 794248540..10bc965a4 100644
--- a/grub-core/disk/lvm.c
+++ b/grub-core/disk/lvm.c
@@ -34,12 +34,11 @@

 GRUB_MOD_LICENSE ("GPLv3+");

-struct cache_lv
+struct ignored_feature_lv
 {
   struct grub_diskfilter_lv *lv;
-  char *cache_pool;
   char *origin;
-  struct cache_lv *next;
+  struct ignored_feature_lv *next;
 };


@@ -105,30 +104,29 @@ grub_lvm_check_flag (const char *p, const char
*str, const char *flag)
 }

 static void
-grub_lvm_free_cache_lvs (struct cache_lv *cache_lvs)
+grub_lvm_free_ignored_feature_lvs (struct ignored_feature_lv
*ignored_feature_lvs)
 {
-  struct cache_lv *cache;
+  struct ignored_feature_lv *ignored_feature;

-  while ((cache = cache_lvs))
+  while ((ignored_feature = ignored_feature_lvs))
     {
-      cache_lvs = cache_lvs->next;
+      ignored_feature_lvs = ignored_feature_lvs->next;

-      if (cache->lv)
+      if (ignored_feature->lv)
  {
   unsigned int i;

-  for (i = 0; i < cache->lv->segment_count; ++i)
-    if (cache->lv->segments)
-      grub_free (cache->lv->segments[i].nodes);
-  grub_free (cache->lv->segments);
-  grub_free (cache->lv->fullname);
-  grub_free (cache->lv->idname);
-  grub_free (cache->lv->name);
+  for (i = 0; i < ignored_feature->lv->segment_count; ++i)
+    if (ignored_feature->lv->segments)
+      grub_free (ignored_feature->lv->segments[i].nodes);
+  grub_free (ignored_feature->lv->segments);
+  grub_free (ignored_feature->lv->fullname);
+  grub_free (ignored_feature->lv->idname);
+  grub_free (ignored_feature->lv->name);
  }
-      grub_free (cache->lv);
-      grub_free (cache->origin);
-      grub_free (cache->cache_pool);
-      grub_free (cache);
+      grub_free (ignored_feature->lv);
+      grub_free (ignored_feature->origin);
+      grub_free (ignored_feature);
     }
 }

@@ -325,7 +323,7 @@ grub_lvm_detect (grub_disk_t disk,

   if (! vg)
     {
-      struct cache_lv *cache_lvs = NULL;
+      struct ignored_feature_lv *ignored_feature_lvs = NULL;

       /* First time we see this volume group. We've to create the
  whole volume group structure. */
@@ -810,105 +808,82 @@ grub_lvm_detect (grub_disk_t disk,
   else if (grub_memcmp (p, "cache\"",
    sizeof ("cache\"") - 1) == 0)
     {
-      struct cache_lv *cache = NULL;
+      struct ignored_feature_lv *ignored_feature = NULL;

       char *p2, *p3;
       grub_size_t sz;

-      cache = grub_zalloc (sizeof (*cache));
-      if (!cache)
- goto cache_lv_fail;
-      cache->lv = grub_zalloc (sizeof (*cache->lv));
-      if (!cache->lv)
- goto cache_lv_fail;
-      grub_memcpy (cache->lv, lv, sizeof (*cache->lv));
+      ignored_feature = grub_zalloc (sizeof (*ignored_feature));
+      if (!ignored_feature)
+ goto ignored_feature_lv_fail;
+      ignored_feature->lv = grub_zalloc (sizeof (*ignored_feature->lv));
+      if (!ignored_feature->lv)
+ goto ignored_feature_lv_fail;
+      grub_memcpy (ignored_feature->lv, lv, sizeof (*ignored_feature->lv));

       if (lv->fullname)
  {
-  cache->lv->fullname = grub_strdup (lv->fullname);
-  if (!cache->lv->fullname)
-    goto cache_lv_fail;
+  ignored_feature->lv->fullname = grub_strdup (lv->fullname);
+  if (!ignored_feature->lv->fullname)
+    goto ignored_feature_lv_fail;
  }
       if (lv->idname)
  {
-  cache->lv->idname = grub_strdup (lv->idname);
-  if (!cache->lv->idname)
-    goto cache_lv_fail;
+  ignored_feature->lv->idname = grub_strdup (lv->idname);
+  if (!ignored_feature->lv->idname)
+    goto ignored_feature_lv_fail;
  }
       if (lv->name)
  {
-  cache->lv->name = grub_strdup (lv->name);
-  if (!cache->lv->name)
-    goto cache_lv_fail;
+  ignored_feature->lv->name = grub_strdup (lv->name);
+  if (!ignored_feature->lv->name)
+    goto ignored_feature_lv_fail;
  }

       skip_lv = 1;

-      p2 = grub_strstr (p, "cache_pool = \"");
-      if (!p2)
- goto cache_lv_fail;
-
-      p2 = grub_strchr (p2, '"');
-      if (!p2)
- goto cache_lv_fail;
-
-      p3 = ++p2;
-      if (p3 == mda_end)
- goto cache_lv_fail;
-      p3 = grub_strchr (p3, '"');
-      if (!p3)
- goto cache_lv_fail;
-
-      sz = p3 - p2;
-
-      cache->cache_pool = grub_malloc (sz + 1);
-      if (!cache->cache_pool)
- goto cache_lv_fail;
-      grub_memcpy (cache->cache_pool, p2, sz);
-      cache->cache_pool[sz] = '\0';

       p2 = grub_strstr (p, "origin = \"");
       if (!p2)
- goto cache_lv_fail;
+ goto ignored_feature_lv_fail;

       p2 = grub_strchr (p2, '"');
       if (!p2)
- goto cache_lv_fail;
+ goto ignored_feature_lv_fail;

       p3 = ++p2;
       if (p3 == mda_end)
- goto cache_lv_fail;
+ goto ignored_feature_lv_fail;
       p3 = grub_strchr (p3, '"');
       if (!p3)
- goto cache_lv_fail;
+ goto ignored_feature_lv_fail;

       sz = p3 - p2;

-      cache->origin = grub_malloc (sz + 1);
-      if (!cache->origin)
- goto cache_lv_fail;
-      grub_memcpy (cache->origin, p2, sz);
-      cache->origin[sz] = '\0';
+      ignored_feature->origin = grub_malloc (sz + 1);
+      if (!ignored_feature->origin)
+ goto ignored_feature_lv_fail;
+      grub_memcpy (ignored_feature->origin, p2, sz);
+      ignored_feature->origin[sz] = '\0';

-      cache->next = cache_lvs;
-      cache_lvs = cache;
+      ignored_feature->next = ignored_feature_lvs;
+      ignored_feature_lvs = ignored_feature;
       break;

-    cache_lv_fail:
-      if (cache)
+    ignored_feature_lv_fail:
+      if (ignored_feature)
  {
-  grub_free (cache->origin);
-  grub_free (cache->cache_pool);
-  if (cache->lv)
+  grub_free (ignored_feature->origin);
+  if (ignored_feature->lv)
     {
-      grub_free (cache->lv->fullname);
-      grub_free (cache->lv->idname);
-      grub_free (cache->lv->name);
+      grub_free (ignored_feature->lv->fullname);
+      grub_free (ignored_feature->lv->idname);
+      grub_free (ignored_feature->lv->name);
     }
-  grub_free (cache->lv);
-  grub_free (cache);
+  grub_free (ignored_feature->lv);
+  grub_free (ignored_feature);
  }
-      grub_lvm_free_cache_lvs (cache_lvs);
+      grub_lvm_free_ignored_feature_lvs (ignored_feature_lvs);
       goto fail4;
     }
   else
@@ -993,56 +968,56 @@ grub_lvm_detect (grub_disk_t disk,
       }

       {
- struct cache_lv *cache;
+ struct ignored_feature_lv *ignored_feature;

- for (cache = cache_lvs; cache; cache = cache->next)
+ for (ignored_feature = ignored_feature_lvs; ignored_feature;
ignored_feature = ignored_feature->next)
   {
     struct grub_diskfilter_lv *lv;

     for (lv = vg->lvs; lv; lv = lv->next)
-      if (grub_strcmp (lv->name, cache->origin) == 0)
+      if (grub_strcmp (lv->name, ignored_feature->origin) == 0)
  break;
     if (lv)
       {
- cache->lv->segments = grub_calloc (lv->segment_count, sizeof (*lv->segments));
- if (!cache->lv->segments)
+ ignored_feature->lv->segments = grub_calloc (lv->segment_count,
sizeof (*lv->segments));
+ if (!ignored_feature->lv->segments)
   {
-    grub_lvm_free_cache_lvs (cache_lvs);
+    grub_lvm_free_ignored_feature_lvs (ignored_feature_lvs);
     goto fail4;
   }
- grub_memcpy (cache->lv->segments, lv->segments, lv->segment_count *
sizeof (*lv->segments));
+ grub_memcpy (ignored_feature->lv->segments, lv->segments,
lv->segment_count * sizeof (*lv->segments));

  for (i = 0; i < lv->segment_count; ++i)
   {
     struct grub_diskfilter_node *nodes = lv->segments[i].nodes;
     grub_size_t node_count = lv->segments[i].node_count;

-    cache->lv->segments[i].nodes = grub_calloc (node_count, sizeof (*nodes));
-    if (!cache->lv->segments[i].nodes)
+    ignored_feature->lv->segments[i].nodes = grub_calloc (node_count,
sizeof (*nodes));
+    if (!ignored_feature->lv->segments[i].nodes)
       {
  for (j = 0; j < i; ++j)
-  grub_free (cache->lv->segments[j].nodes);
- grub_free (cache->lv->segments);
- cache->lv->segments = NULL;
- grub_lvm_free_cache_lvs (cache_lvs);
+  grub_free (ignored_feature->lv->segments[j].nodes);
+ grub_free (ignored_feature->lv->segments);
+ ignored_feature->lv->segments = NULL;
+ grub_lvm_free_ignored_feature_lvs (ignored_feature_lvs);
  goto fail4;
       }
-    grub_memcpy (cache->lv->segments[i].nodes, nodes, node_count *
sizeof (*nodes));
+    grub_memcpy (ignored_feature->lv->segments[i].nodes, nodes,
node_count * sizeof (*nodes));
   }

- if (cache->lv->segments)
+ if (ignored_feature->lv->segments)
   {
-    cache->lv->segment_count = lv->segment_count;
-    cache->lv->vg = vg;
-    cache->lv->next = vg->lvs;
-    vg->lvs = cache->lv;
-    cache->lv = NULL;
+    ignored_feature->lv->segment_count = lv->segment_count;
+    ignored_feature->lv->vg = vg;
+    ignored_feature->lv->next = vg->lvs;
+    vg->lvs = ignored_feature->lv;
+    ignored_feature->lv = NULL;
   }
       }
   }
       }

-      grub_lvm_free_cache_lvs (cache_lvs);
+  grub_lvm_free_ignored_feature_lvs (ignored_feature_lvs);
       if (grub_diskfilter_vg_register (vg))
  goto fail4;
     }
-- 
2.39.2

_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

             reply	other threads:[~2024-04-27  1:00 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-04-27  0:59 Patrick Plenefisch [this message]
2024-05-22 13:42 ` [PATCH 1/2 v2] LVM Cachevol and Integrity volumes break entire LVM VG Daniel Kiper

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAOCpoWcpGzR6EdWkaSq0bQoS=hUnNfjdOxSR4F2C7Dfa3LTbrw@mail.gmail.com' \
    --to=simonpatp@gmail.com \
    --cc=grub-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).