diff options
author | Petr Rockai <prockai@redhat.com> | 2013-02-19 02:32:25 +0100 |
---|---|---|
committer | Petr Rockai <prockai@redhat.com> | 2013-08-28 14:54:32 +0200 |
commit | 8c742f38e1ef31bf4cf943b2434a7b6a5948d390 (patch) | |
tree | e6ec77ce93209101b77adcb8f97cc5ed06b24d13 | |
parent | 0b77ac4b43712ffa366d5955946109deece64352 (diff) | |
download | lvm2-8c742f38e1ef31bf4cf943b2434a7b6a5948d390.tar.gz |
metadata: Avoid pv_read in find_pv_by_name.
-rw-r--r-- | lib/metadata/metadata.c | 34 |
1 files changed, 20 insertions, 14 deletions
diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c index 632e78a64..fb45b3cc9 100644 --- a/lib/metadata/metadata.c +++ b/lib/metadata/metadata.c @@ -1330,7 +1330,7 @@ static int pvcreate_check(struct cmd_context *cmd, const char *name, /* FIXME Check partition type is LVM unless --force is given */ /* Is there a pv here already? */ - if (!(pv = pv_read(cmd, name, 0, 0))) + if (!(pv = find_pv_by_name(cmd, name, 1))) stack; /* @@ -1824,23 +1824,29 @@ struct physical_volume *find_pv_by_name(struct cmd_context *cmd, const char *pv_name, int allow_orphan) { - struct physical_volume *pv; + struct device *dev; + struct pv_list *pvl; + struct dm_list *pvslist; + struct physical_volume *pv = NULL; + + lvmcache_seed_infos_from_lvmetad(cmd); - if (!(pv = _pv_read(cmd, cmd->mem, pv_name, NULL, 1, 0))) { + if (!(dev = dev_cache_get(pv_name, cmd->filter))) { log_error("Physical volume %s not found", pv_name); - goto bad; + return_NULL; } - if (is_orphan_vg(pv->vg_name) && dm_list_empty(&pv->fid->metadata_areas_in_use)) { - /* If a PV has no MDAs - need to search all VGs for it */ - if (!scan_vgs_for_pvs(cmd, 1)) - goto_bad; - free_pv_fid(pv); - if (!(pv = _pv_read(cmd, cmd->mem, pv_name, NULL, 1, 0))) { - log_error("Physical volume %s not found", pv_name); - goto bad; - } - } + if (!(pvslist = get_pvs(cmd))) + return_NULL; + + dm_list_iterate_items(pvl, pvslist) + if (pvl->pv->dev == dev) + pv = pvl->pv; + else + free_pv_fid(pvl->pv); + + if (!pv) + log_error("Physical volume %s not found", pv_name); if (pv && !allow_orphan && is_orphan_vg(pv->vg_name)) { log_error("Physical volume %s not in a volume group", pv_name); |