diff options
author | Petr Rockai <prockai@redhat.com> | 2013-02-19 02:32:25 +0100 |
---|---|---|
committer | Petr Rockai <prockai@redhat.com> | 2013-07-29 16:18:33 +0200 |
commit | 4ee6e91fb53b9a60f7fe2399f69e928b2850769d (patch) | |
tree | f21ed6dd808e8b22700ae0a2b44938e078cf8a40 | |
parent | fabf8f97565aaf60b6aa62b0e4a7faa9aaea5877 (diff) | |
download | lvm2-4ee6e91fb53b9a60f7fe2399f69e928b2850769d.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); |