[lvm-devel] master - lvmcache: update lvmcache with alternate device
David Teigland
teigland at fedoraproject.org
Fri May 8 16:49:51 UTC 2015
Gitweb: http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=1dfedcc179b6f7caee1069974ab34ddd111ef01d
Commit: 1dfedcc179b6f7caee1069974ab34ddd111ef01d
Parent: cbdf514bbc3f22453c2c72c913e9161935a22bd8
Author: David Teigland <teigland at redhat.com>
AuthorDate: Tue May 5 14:02:43 2015 -0500
Committer: David Teigland <teigland at redhat.com>
CommitterDate: Fri May 8 11:28:59 2015 -0500
lvmcache: update lvmcache with alternate device
When there are duplicate PVs, and one device
replaces another in lvmcache, use label_read
to update lvmcache for the new device.
---
lib/cache/lvmetad.c | 32 +++++++++++++++++++-------------
1 files changed, 19 insertions(+), 13 deletions(-)
diff --git a/lib/cache/lvmetad.c b/lib/cache/lvmetad.c
index 470a7b3..00a84b5 100644
--- a/lib/cache/lvmetad.c
+++ b/lib/cache/lvmetad.c
@@ -269,7 +269,8 @@ static struct lvmcache_info *_pv_populate_lvmcache(struct cmd_context *cmd,
struct dm_config_node *cn,
struct format_type *fmt, dev_t fallback)
{
- struct device *dev, *dev_alternate;
+ struct device *dev, *dev_alternate, *dev_alternate_cache = NULL;
+ struct label *label;
struct id pvid, vgid;
char mda_id[32];
char da_id[32];
@@ -278,7 +279,7 @@ static struct lvmcache_info *_pv_populate_lvmcache(struct cmd_context *cmd,
struct dm_config_node *alt_devices = dm_config_find_node(cn->child, "devices_alternate");
struct dm_config_value *alt_device = NULL;
uint64_t offset, size;
- struct lvmcache_info *info;
+ struct lvmcache_info *info, *info_alternate;
const char *pvid_txt = dm_config_find_str(cn->child, "id", NULL),
*vgid_txt = dm_config_find_str(cn->child, "vgid", NULL),
*vgname = dm_config_find_str(cn->child, "vgname", NULL),
@@ -367,23 +368,28 @@ static struct lvmcache_info *_pv_populate_lvmcache(struct cmd_context *cmd,
while (alt_device) {
dev_alternate = dev_cache_get_by_devt(alt_device->v.i, cmd->filter);
if (dev_alternate) {
- if ((info = lvmcache_add(fmt->labeller, (const char *)&pvid, dev_alternate,
- vgname, (const char *)&vgid, 0))) {
- /*
- * FIXME: when lvmcache_add returns non-NULL,
- * it means that it has made dev_alternate
- * the preferred device in lvmcache.
- * I think that means it should be followed
- * by the same steps done above?
- */
- log_warn("lvmcache only partially updated for alternate device %s", dev_name(dev));
+ if ((info_alternate = lvmcache_add(fmt->labeller, (const char *)&pvid, dev_alternate,
+ vgname, (const char *)&vgid, 0))) {
+ dev_alternate_cache = dev_alternate;
+ info = info_alternate;
}
- } else
+ } else {
log_warn("Duplicate of PV %s dev %s exists on unknown device %"PRId64 ":%" PRId64,
pvid_txt, dev_name(dev), MAJOR(alt_device->v.i), MINOR(alt_device->v.i));
+ }
alt_device = alt_device->next;
}
+ /*
+ * Update lvmcache with the info about the alternate device by
+ * reading its label, which should update lvmcache.
+ */
+ if (dev_alternate_cache) {
+ if (!label_read(dev_alternate_cache, &label, 0)) {
+ log_warn("No PV label found on duplicate device %s.", dev_name(dev_alternate_cache));
+ }
+ }
+
return info;
}
More information about the lvm-devel
mailing list