disk/lvm: Make cache_lv more generic as ignored_feature_lv

This patch isn't necessary by itself, but when combined with subsequent
patches it enhances readability as ignored_features_lv is then used for
multiple types of extra LV's, not just cache LV's.

Signed-off-by: Patrick Plenefisch <simonpatp@gmail.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
This commit is contained in:
Patrick Plenefisch 2024-08-13 20:40:02 -04:00 committed by Daniel Kiper
parent 488ac8bda9
commit 90848a1f7c

View File

@ -34,12 +34,12 @@
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 +105,30 @@ 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->cache_pool);
grub_free (ignored_feature);
}
}
@ -325,7 +325,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. */
@ -822,105 +822,105 @@ 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;
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->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';
ignored_feature->cache_pool = grub_malloc (sz + 1);
if (!ignored_feature->cache_pool)
goto ignored_feature_lv_fail;
grub_memcpy (ignored_feature->cache_pool, p2, sz);
ignored_feature->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);
grub_free (ignored_feature->cache_pool);
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
@ -1005,56 +1005,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;
}