diff options
author | Petr Rockai <prockai@redhat.com> | 2015-04-23 01:39:39 +0200 |
---|---|---|
committer | Petr Rockai <me@mornfall.net> | 2015-04-29 13:23:23 +0200 |
commit | 4946c64092a04d6a5a7a09a31f7c74c193d3484f (patch) | |
tree | eb7be21e019b19736c51a657c35e2e29d3f37bb5 | |
parent | 3be3eb2995f83ab73a2a1419b1db5f1098fcb5a8 (diff) | |
download | lvm2-4946c64092a04d6a5a7a09a31f7c74c193d3484f.tar.gz |
lvmetad: Avoid duplicate entries in the list of alternate devices.
-rw-r--r-- | daemons/lvmetad/lvmetad-core.c | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/daemons/lvmetad/lvmetad-core.c b/daemons/lvmetad/lvmetad-core.c index 1a2ce44f2..e3394ab4c 100644 --- a/daemons/lvmetad/lvmetad-core.c +++ b/daemons/lvmetad/lvmetad-core.c @@ -936,12 +936,29 @@ static response pv_found(lvmetad_state *s, request r) altdev = dm_config_clone_node(cft, altdev, 0); chain_node(altdev, cft->root, 0); } else - altdev = make_config_node(cft, "devices_alternate", cft->root, 0); - if (!altdev || !(altdev_v = dm_config_create_value(cft))) - goto out_of_mem; - altdev_v->next = altdev->v; - altdev->v = altdev_v; - altdev->v->v.i = device_old_pvid; + if (!(altdev = make_config_node(cft, "devices_alternate", cft->root, 0))) + goto out_of_mem; + altdev_v = altdev->v; + while (1) { + if (altdev_v && altdev_v->v.i == device_old_pvid) + break; + if (altdev_v) + altdev_v = altdev_v->next; + if (!altdev_v) { + if (!(altdev_v = dm_config_create_value(cft))) + goto out_of_mem; + altdev_v->next = altdev->v; + altdev->v = altdev_v; + altdev->v->v.i = device_old_pvid; + break; + } + }; + altdev_v = altdev->v; + while (altdev_v) { + if (altdev_v->next && altdev_v->next->v.i == device) + altdev_v->next = altdev_v->next->next; + altdev_v = altdev_v->next; + } changed |= 1; } |