From: Alasdair Kergon Date: Thu, 31 Jul 2008 10:50:18 +0000 (+0000) Subject: Refactor _text_pv_read and always return mda list if requested. X-Git-Tag: v2_02_91~3513 X-Git-Url: https://sourceware.org/git/?a=commitdiff_plain;h=29f7cbdabfaf5ffd661ada959c01dee78fb1c478;p=lvm2.git Refactor _text_pv_read and always return mda list if requested. --- diff --git a/WHATS_NEW b/WHATS_NEW index 9c723e078..0a209d2b9 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,5 +1,6 @@ Version 2.02.40 - ================================ + Refactor _text_pv_read and always return mda list if requested. Fix configure to work w/o readline unless --enable-readline used. (2.02.39) Remove is_lvm_partition template which has not yet been coded. Refactor pvcreate to separate parameter parsing from validation logic. diff --git a/lib/format_text/format-text.c b/lib/format_text/format-text.c index 7f645ca4e..24188526f 100644 --- a/lib/format_text/format-text.c +++ b/lib/format_text/format-text.c @@ -1396,43 +1396,33 @@ static int _add_raw(struct list *raw_list, struct device_area *dev_area) return 1; } -static int _text_pv_read(const struct format_type *fmt, const char *pv_name, - struct physical_volume *pv, struct list *mdas) +static int _get_pv_if_in_vg(struct lvmcache_info *info, + struct physical_volume *pv) { - struct label *label; - struct device *dev; - struct lvmcache_info *info; - struct metadata_area *mda, *mda_new; - struct mda_context *mdac, *mdac_new; - struct data_area_list *da; + if (info->vginfo && info->vginfo->vgname && + !is_orphan_vg(info->vginfo->vgname) && + get_pv_from_vg_by_id(info->fmt, info->vginfo->vgname, + info->vginfo->vgid, info->dev->pvid, pv)) + return 1; - if (!(dev = dev_cache_get(pv_name, fmt->cmd->filter))) - return_0; + return 0; +} - /* FIXME Optimise out repeated reading when cache lock held */ - if (!(label_read(dev, &label, UINT64_C(0)))) - return_0; - info = (struct lvmcache_info *) label->info; +static int _populate_pv_fields(struct lvmcache_info *info, + struct physical_volume *pv) +{ + struct data_area_list *da; /* Have we already cached vgname? */ - if (info->vginfo && info->vginfo->vgname && - !is_orphan_vg(info->vginfo->vgname) && - get_pv_from_vg_by_id(info->fmt, info->vginfo->vgname, - info->vginfo->vgid, info->dev->pvid, pv)) { + if (_get_pv_if_in_vg(info, pv)) return 1; - } /* Perform full scan (just the first time) and try again */ if (!memlock() && !full_scan_done()) { - lvmcache_label_scan(fmt->cmd, 2); + lvmcache_label_scan(info->fmt->cmd, 2); - if (info->vginfo && info->vginfo->vgname && - !is_orphan_vg(info->vginfo->vgname) && - get_pv_from_vg_by_id(info->fmt, info->vginfo->vgname, - info->vginfo->vgid, - info->dev->pvid, pv)) { + if (_get_pv_if_in_vg(info, pv)) return 1; - } } /* Orphan */ @@ -1445,13 +1435,35 @@ static int _text_pv_read(const struct format_type *fmt, const char *pv_name, /* Currently only support exactly one data area */ if (list_size(&info->das) != 1) { log_error("Must be exactly one data area (found %d) on PV %s", - list_size(&info->das), dev_name(dev)); + list_size(&info->das), dev_name(info->dev)); return 0; } list_iterate_items(da, &info->das) pv->pe_start = da->disk_locn.offset >> SECTOR_SHIFT; + return 1; +} + +static int _text_pv_read(const struct format_type *fmt, const char *pv_name, + struct physical_volume *pv, struct list *mdas) +{ + struct label *label; + struct device *dev; + struct lvmcache_info *info; + struct metadata_area *mda, *mda_new; + struct mda_context *mdac, *mdac_new; + + if (!(dev = dev_cache_get(pv_name, fmt->cmd->filter))) + return_0; + + if (!(label_read(dev, &label, UINT64_C(0)))) + return_0; + info = (struct lvmcache_info *) label->info; + + if (!_populate_pv_fields(info, pv)) + return 0; + if (!mdas) return 1;