diff options
author | Petr Rockai <prockai@redhat.com> | 2012-02-10 01:28:27 +0000 |
---|---|---|
committer | Petr Rockai <prockai@redhat.com> | 2012-02-10 01:28:27 +0000 |
commit | 8e5f7cf3dc1d75d0a370729326522bcac29b489d (patch) | |
tree | a8e7130afabb199942ac06ac6298b13ce4988266 /lib/metadata/pv.c | |
parent | 5fa417a9c0aa2d7ea80e1087e0d2943536fc5b9d (diff) | |
download | lvm2-8e5f7cf3dc1d75d0a370729326522bcac29b489d.tar.gz lvm2-8e5f7cf3dc1d75d0a370729326522bcac29b489d.tar.xz lvm2-8e5f7cf3dc1d75d0a370729326522bcac29b489d.zip |
Move lvmcache data structures behind an API (making the structures private to
lvmcache.c). No functional change.
Diffstat (limited to 'lib/metadata/pv.c')
-rw-r--r-- | lib/metadata/pv.c | 114 |
1 files changed, 70 insertions, 44 deletions
diff --git a/lib/metadata/pv.c b/lib/metadata/pv.c index f6c32b90..09b869b7 100644 --- a/lib/metadata/pv.c +++ b/lib/metadata/pv.c @@ -143,23 +143,27 @@ uint32_t pv_mda_count(const struct physical_volume *pv) { struct lvmcache_info *info; - info = info_from_pvid((const char *)&pv->id.uuid, 0); - return info ? dm_list_size(&info->mdas) : UINT64_C(0); + info = lvmcache_info_from_pvid((const char *)&pv->id.uuid, 0); + return info ? lvmcache_mda_count(info) : UINT64_C(0); +} + +static int _count_unignored(struct metadata_area *mda, void *baton) +{ + uint32_t *count = baton; + if (!mda_is_ignored(mda)) + (*count) ++; + return 1; } uint32_t pv_mda_used_count(const struct physical_volume *pv) { struct lvmcache_info *info; - struct metadata_area *mda; uint32_t used_count=0; - info = info_from_pvid((const char *)&pv->id.uuid, 0); + info = lvmcache_info_from_pvid((const char *)&pv->id.uuid, 0); if (!info) return 0; - dm_list_iterate_items(mda, &info->mdas) { - if (!mda_is_ignored(mda)) - used_count++; - } + lvmcache_foreach_mda(info, _count_unignored, &used_count); return used_count; } @@ -209,29 +213,36 @@ uint64_t pv_mda_size(const struct physical_volume *pv) const char *pvid = (const char *)(&pv->id.uuid); /* PVs could have 2 mdas of different sizes (rounding effect) */ - if ((info = info_from_pvid(pvid, 0))) - min_mda_size = find_min_mda_size(&info->mdas); + if ((info = lvmcache_info_from_pvid(pvid, 0))) + min_mda_size = lvmcache_smallest_mda_size(info); return min_mda_size; } +static int _pv_mda_free(struct metadata_area *mda, void *baton) { + uint64_t mda_free; + uint64_t *freespace = baton; + + if (!mda->ops->mda_free_sectors) + return 1; + + mda_free = mda->ops->mda_free_sectors(mda); + if (mda_free < *freespace) + *freespace = mda_free; + return 1; +} + uint64_t pv_mda_free(const struct physical_volume *pv) { struct lvmcache_info *info; - uint64_t freespace = UINT64_MAX, mda_free; + uint64_t freespace = UINT64_MAX; const char *pvid = (const char *)&pv->id.uuid; - struct metadata_area *mda; - if ((info = info_from_pvid(pvid, 0))) - dm_list_iterate_items(mda, &info->mdas) { - if (!mda->ops->mda_free_sectors) - continue; - mda_free = mda->ops->mda_free_sectors(mda); - if (mda_free < freespace) - freespace = mda_free; - } + if ((info = lvmcache_info_from_pvid(pvid, 0))) + lvmcache_foreach_mda(info, _pv_mda_free, &freespace); if (freespace == UINT64_MAX) freespace = UINT64_C(0); + return freespace; } @@ -246,22 +257,51 @@ uint64_t pv_used(const struct physical_volume *pv) return used; } +struct _pv_mda_set_ignored_baton { + unsigned mda_ignored; + struct dm_list *mdas_in_use, *mdas_ignored, *mdas_to_change; +}; + +static int _pv_mda_set_ignored_one(struct metadata_area *mda, void *baton) +{ + struct _pv_mda_set_ignored_baton *b = baton; + struct metadata_area *vg_mda, *tmda; + + if (mda_is_ignored(mda) && !b->mda_ignored) { + /* Changing an ignored mda to one in_use requires moving it */ + dm_list_iterate_items_safe(vg_mda, tmda, b->mdas_ignored) + if (mda_locns_match(mda, vg_mda)) { + mda_set_ignored(vg_mda, b->mda_ignored); + dm_list_move(b->mdas_in_use, &vg_mda->list); + } + } + + dm_list_iterate_items_safe(vg_mda, tmda, b->mdas_in_use) + if (mda_locns_match(mda, vg_mda)) + /* Don't move mda: needs writing to disk. */ + mda_set_ignored(vg_mda, b->mda_ignored); + + mda_set_ignored(mda, b->mda_ignored); + return 1; +} + unsigned pv_mda_set_ignored(const struct physical_volume *pv, unsigned mda_ignored) { struct lvmcache_info *info; - struct metadata_area *mda, *vg_mda, *tmda; - struct dm_list *mdas_in_use, *mdas_ignored, *mdas_to_change; + struct _pv_mda_set_ignored_baton baton; + struct metadata_area *mda; - if (!(info = info_from_pvid((const char *)&pv->id.uuid, 0))) + if (!(info = lvmcache_info_from_pvid((const char *)&pv->id.uuid, 0))) return_0; - mdas_in_use = &pv->fid->metadata_areas_in_use; - mdas_ignored = &pv->fid->metadata_areas_ignored; - mdas_to_change = mda_ignored ? mdas_in_use : mdas_ignored; + baton.mda_ignored = mda_ignored; + baton.mdas_in_use = &pv->fid->metadata_areas_in_use; + baton.mdas_ignored = &pv->fid->metadata_areas_ignored; + baton.mdas_to_change = baton.mda_ignored ? baton.mdas_in_use : baton.mdas_ignored; if (is_orphan(pv)) { - dm_list_iterate_items(mda, mdas_to_change) - mda_set_ignored(mda, mda_ignored); + dm_list_iterate_items(mda, baton.mdas_to_change) + mda_set_ignored(mda, baton.mda_ignored); return 1; } @@ -288,22 +328,8 @@ unsigned pv_mda_set_ignored(const struct physical_volume *pv, unsigned mda_ignor /* FIXME: Try not to update the cache here! Also, try to iterate over * PV mdas only using the format instance's index somehow * (i.e. try to avoid using mda_locn_match call). */ - dm_list_iterate_items(mda, &info->mdas) { - if (mda_is_ignored(mda) && !mda_ignored) - /* Changing an ignored mda to one in_use requires moving it */ - dm_list_iterate_items_safe(vg_mda, tmda, mdas_ignored) - if (mda_locns_match(mda, vg_mda)) { - mda_set_ignored(vg_mda, mda_ignored); - dm_list_move(mdas_in_use, &vg_mda->list); - } - - dm_list_iterate_items_safe(vg_mda, tmda, mdas_in_use) - if (mda_locns_match(mda, vg_mda)) - /* Don't move mda: needs writing to disk. */ - mda_set_ignored(vg_mda, mda_ignored); - - mda_set_ignored(mda, mda_ignored); - } + + lvmcache_foreach_mda(info, _pv_mda_set_ignored_one, &baton); return 1; } |