1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-22 17:35:59 +03:00

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 <dwysocha@redhat.com>
This commit is contained in:
Dave Wysochanski 2010-04-08 15:18:35 +00:00
parent 491ef790c2
commit 34573cf6a5

View File

@ -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;
}