1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-21 13:34:40 +03:00

metadata: use radix_tree for find_lv_in_vg

Since there is a group of commands that need to access 'lv_list'
while still need to search for LV by its name, make the whole
struct lv_list a member of logical_volume structure.
This makes it easy to return also 'lv_list' this list this LV
within VG.
Also the patch should not use more memory, since we were allocating
lv_list for each LV anyway when linkin LV to VG.

Since find_lv_by_name() is now using radix_tree(),
use the same 'search for /' in LV in name for both
find_lv() & find_lv_in_vg().

TODO: Possibly refactor code and use only dm_list
instead of lv_list and dereference LV with container_of()
(thus saving pointer within struct logical_volume) - but
we use 'lv_list' currently in many places...
This commit is contained in:
Zdenek Kabelac 2024-10-26 22:18:19 +02:00
parent 0e5beb92c5
commit db0f1b799f
4 changed files with 17 additions and 14 deletions

View File

@ -21,7 +21,14 @@ union lvid;
struct lv_segment; struct lv_segment;
enum activation_change; enum activation_change;
struct lv_list {
struct dm_list list;
struct logical_volume *lv;
};
struct logical_volume { struct logical_volume {
/* NOTE: lvid must be the first structure member as it's used for
* offsetof() calculation in report.c with columns.h */
union lvid lvid; union lvid lvid;
const char *name; const char *name;
@ -41,6 +48,7 @@ struct logical_volume {
struct dm_list snapshot_segs; struct dm_list snapshot_segs;
struct lv_segment *snapshot; struct lv_segment *snapshot;
struct lv_list lvl;
struct dm_list segments; struct dm_list segments;
struct dm_list tags; struct dm_list tags;
struct dm_list segs_using_this_lv; struct dm_list segs_using_this_lv;

View File

@ -573,11 +573,6 @@ struct pv_list {
struct dm_list *pe_ranges; /* Ranges of PEs e.g. for allocation */ struct dm_list *pe_ranges; /* Ranges of PEs e.g. for allocation */
}; };
struct lv_list {
struct dm_list list;
struct logical_volume *lv;
};
struct glv_list { struct glv_list {
struct dm_list list; struct dm_list list;
struct generic_logical_volume *glv; struct generic_logical_volume *glv;

View File

@ -1637,6 +1637,7 @@ struct pv_list *find_pv_in_vg_by_uuid(const struct volume_group *vg,
struct lv_list *find_lv_in_vg(const struct volume_group *vg, struct lv_list *find_lv_in_vg(const struct volume_group *vg,
const char *lv_name) const char *lv_name)
{ {
struct logical_volume *lv;
struct lv_list *lvl; struct lv_list *lvl;
const char *ptr; const char *ptr;
@ -1646,6 +1647,11 @@ struct lv_list *find_lv_in_vg(const struct volume_group *vg,
else else
ptr = lv_name; ptr = lv_name;
if (vg->lv_names) {
lv = radix_tree_lookup_ptr(vg->lv_names, ptr, strlen(ptr));
return (lv) ? &lv->lvl : NULL;
}
dm_list_iterate_items(lvl, &vg->lvs) dm_list_iterate_items(lvl, &vg->lvs)
if (!strcmp(lvl->lv->name, ptr)) if (!strcmp(lvl->lv->name, ptr))
return lvl; return lvl;
@ -1671,12 +1677,8 @@ struct logical_volume *find_lv_in_vg_by_lvid(const struct volume_group *vg,
struct logical_volume *find_lv(const struct volume_group *vg, struct logical_volume *find_lv(const struct volume_group *vg,
const char *lv_name) const char *lv_name)
{ {
if (!vg->lv_names) {
struct lv_list *lvl = find_lv_in_vg(vg, lv_name); struct lv_list *lvl = find_lv_in_vg(vg, lv_name);
return lvl ? lvl->lv : NULL; return lvl ? lvl->lv : NULL;
}
return radix_tree_lookup_ptr(vg->lv_names, lv_name, strlen(lv_name));
} }
struct generic_logical_volume *find_historical_glv(const struct volume_group *vg, struct generic_logical_volume *find_historical_glv(const struct volume_group *vg,

View File

@ -116,9 +116,7 @@ int link_lv_to_vg(struct volume_group *vg, struct logical_volume *lv)
if (vg_max_lv_reached(vg)) if (vg_max_lv_reached(vg))
stack; stack;
if (!(lvl = dm_pool_zalloc(vg->vgmem, sizeof(*lvl)))) lvl = &lv->lvl;
return_0;
lvl->lv = lv; lvl->lv = lv;
lv->vg = vg; lv->vg = vg;
dm_list_add(&vg->lvs, &lvl->list); dm_list_add(&vg->lvs, &lvl->list);