diff options
author | David Teigland <teigland@redhat.com> | 2022-01-06 10:15:16 -0600 |
---|---|---|
committer | David Teigland <teigland@redhat.com> | 2022-01-06 10:15:16 -0600 |
commit | bd2baeaaa67da3885df9f06700565dc201c82861 (patch) | |
tree | ec0b17c3ac73ceb3de69bbc82ec6814640e2ad24 /lib/cache | |
parent | 42a16aa6f34d801bfea169b4f6d1fef5d89961f6 (diff) | |
download | lvm2-bd2baeaaa67da3885df9f06700565dc201c82861.tar.gz |
handle duplicate vgids
The approach to duplicate VGIDs has been that it is not possible
or not allowed, so the behavior has been undefined. The actual
result was unpredictable and/or broken, and generally unhelpful.
Improve this by recognizing the problem, displaying the VGs,
and printing a warning to fix the problem. Beyond this,
using VGs with duplicate VGIDs remains undefined, but should
work well enough to correct the problem with vgchange -u.
It's possible to create this condition without too much difficulty
by cloning PVs, followed by an incomplete attempt at making the two
VGs unique (vgrename and pvchange -u, but missing vgchange -u.)
Diffstat (limited to 'lib/cache')
-rw-r--r-- | lib/cache/lvmcache.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/lib/cache/lvmcache.c b/lib/cache/lvmcache.c index c5359f3c5..9c1619b7e 100644 --- a/lib/cache/lvmcache.c +++ b/lib/cache/lvmcache.c @@ -354,9 +354,11 @@ static struct lvmcache_vginfo *_vginfo_lookup(const char *vgname, const char *vg if (vgid_arg) { if ((vginfo = dm_hash_lookup(_vgid_hash, vgid))) { if (vgname && strcmp(vginfo->vgname, vgname)) { - /* should never happen */ - log_error(INTERNAL_ERROR "vginfo_lookup vgid %s has two names %s %s", - vgid, vginfo->vgname, vgname); + log_warn("WARNING: lookup found duplicate VGID %s for VGs %s and %s.", vgid, vginfo->vgname, vgname); + if ((vginfo = dm_hash_lookup(_vgname_hash, vgname))) { + if (!memcmp(vginfo->vgid, vgid, ID_LEN)) + return vginfo; + } return NULL; } return vginfo; @@ -1884,7 +1886,17 @@ static int _lvmcache_update_vgname(struct cmd_context *cmd, _drop_vginfo(info, info->vginfo); - if (!(vginfo = lvmcache_vginfo_from_vgid(vgid))) { + vginfo = lvmcache_vginfo_from_vgid(vgid); + if (vginfo && strcmp(vginfo->vgname, vgname)) { + log_warn("WARNING: fix duplicate VGID %s for VGs %s and %s (see vgchange -u).", vgid_dashed, vgname, vginfo->vgname); + vginfo = lvmcache_vginfo_from_vgname(vgname, NULL); + if (vginfo && memcmp(vginfo->vgid, vgid, ID_LEN)) { + log_error("Ignoring %s with conflicting VG info %s %s.", dev_name(info->dev), vgid_dashed, vgname); + return_0; + } + } + + if (!vginfo) { /* * Create a vginfo struct for this VG and put the vginfo * into the hash table. |