From 34573cf6a5ec5162322fb6088435c07eed6e0da7 Mon Sep 17 00:00:00 2001 From: Dave Wysochanski Date: Thu, 8 Apr 2010 15:18:35 +0000 Subject: [PATCH] Check for duplicate paths (pvids) on the commandline of vgcreate. A user specifying duplicate paths on the cmdline of vgcreate will get a message similar to the following: vgcreate vgtest2 /dev/loop3 /dev/loop5 Found duplicate PV jk1lXsKzwyOKlXq6bhaFFKMQQ06oPgu8: using /dev/loop5 not /dev/loop3 Found duplicate PV jk1lXsKzwyOKlXq6bhaFFKMQQ06oPgu8: using /dev/loop3 not /dev/loop5 Internal error: Duplicate PV id jk1lXs-Kzwy-OKlX-q6bh-aFFK-MQQ0-6oPgu8 detected for /dev/loop3 in vgtest2. This is caught by vg_validate(), but it would be good to find this condition earlier in the vgcreate code. add_pv_to_vg() currently checks by pvname, but does not look for duplcate pvids. This patch adds the check for duplicate pvids and results in new error output as follows: vgcreate vgtest2 /dev/loop3 /dev/loop5 Found duplicate PV jk1lXsKzwyOKlXq6bhaFFKMQQ06oPgu8: using /dev/loop5 not /dev/loop3 Found duplicate PV jk1lXsKzwyOKlXq6bhaFFKMQQ06oPgu8: using /dev/loop3 not /dev/loop5 Physical volume '/dev/loop5 (jk1lXs-Kzwy-OKlX-q6bh-aFFK-MQQ0-6oPgu8)' listed more than once. Unable to add physical volume '/dev/loop5' to volume group 'vgtest2'. Signed-off-by: Dave Wysochanski --- lib/metadata/metadata.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c index 6ceb793fb..a4f1948da 100644 --- a/lib/metadata/metadata.c +++ b/lib/metadata/metadata.c @@ -52,6 +52,9 @@ static struct physical_volume *_find_pv_by_name(struct cmd_context *cmd, static struct pv_list *_find_pv_in_vg(const struct volume_group *vg, const char *pv_name); +static struct pv_list *_find_pv_in_vg_by_uuid(const struct volume_group *vg, + const struct id *id); + static uint32_t _vg_bad_status_bits(const struct volume_group *vg, uint64_t status); @@ -160,6 +163,7 @@ int add_pv_to_vg(struct volume_group *vg, const char *pv_name, struct pv_list *pvl; struct format_instance *fid = vg->fid; struct dm_pool *mem = vg->vgmem; + char uuid[64] __attribute((aligned(8))); log_verbose("Adding physical volume '%s' to volume group '%s'", pv_name, vg->name); @@ -211,9 +215,14 @@ int add_pv_to_vg(struct volume_group *vg, const char *pv_name, return 0; } - if (_find_pv_in_vg(vg, pv_name)) { - log_error("Physical volume '%s' listed more than once.", - pv_name); + if (_find_pv_in_vg(vg, pv_name) || + _find_pv_in_vg_by_uuid(vg, &pv->id)) { + if (!id_write_format(&pv->id, uuid, sizeof(uuid))) { + stack; + uuid[0] = '\0'; + } + log_error("Physical volume '%s (%s)' listed more than once.", + pv_name, uuid); return 0; }