diff --git a/WHATS_NEW b/WHATS_NEW index 563eb95e8..0741ebe27 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,6 @@ Version 2.02.63 - ================================ + Optimise PV segments search for the most last segment search case. Remove vg_validate call when parsing cached metadata. Use hash table of LVs to speed up parsing of text metadata with many LVs. Fix two messages, add a whitespace and parentheses diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c index 58dd144d1..f958bc9f1 100644 --- a/lib/metadata/metadata.c +++ b/lib/metadata/metadata.c @@ -1799,18 +1799,6 @@ struct lv_segment *first_seg(const struct logical_volume *lv) return NULL; } -/* Find segment at a given physical extent in a PV */ -struct pv_segment *find_peg_by_pe(const struct physical_volume *pv, uint32_t pe) -{ - struct pv_segment *peg; - - dm_list_iterate_items(peg, &pv->segments) - if (pe >= peg->pe && pe < peg->pe + peg->len) - return peg; - - return NULL; -} - int vg_remove_mdas(struct volume_group *vg) { struct metadata_area *mda; diff --git a/lib/metadata/metadata.h b/lib/metadata/metadata.h index 542be6e0c..782d30017 100644 --- a/lib/metadata/metadata.h +++ b/lib/metadata/metadata.h @@ -308,9 +308,6 @@ struct pv_list *find_pv_in_pv_list(const struct dm_list *pl, /* Find LV segment containing given LE */ struct lv_segment *find_seg_by_le(const struct logical_volume *lv, uint32_t le); -/* Find PV segment containing given LE */ -struct pv_segment *find_peg_by_pe(const struct physical_volume *pv, uint32_t pe); - /* * Remove a dev_dir if present. */ diff --git a/lib/metadata/pv_manip.c b/lib/metadata/pv_manip.c index 1b0a45710..6c902c00e 100644 --- a/lib/metadata/pv_manip.c +++ b/lib/metadata/pv_manip.c @@ -78,6 +78,20 @@ int peg_dup(struct dm_pool *mem, struct dm_list *peg_new, struct dm_list *peg_ol return 1; } +/* Find segment at a given physical extent in a PV */ +static struct pv_segment *find_peg_by_pe(const struct physical_volume *pv, + uint32_t pe) +{ + struct pv_segment *pvseg; + + /* search backwards to optimise mostly used last segment split */ + dm_list_iterate_back_items(pvseg, &pv->segments) + if (pe >= pvseg->pe && pe < pvseg->pe + pvseg->len) + return pvseg; + + return NULL; +} + /* * Split peg at given extent. * Second part is always deallocated.