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

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.
This commit is contained in:
David Teigland 2015-05-05 14:02:43 -05:00
parent cbdf514bbc
commit 1dfedcc179

32
lib/cache/lvmetad.c vendored
View File

@ -269,7 +269,8 @@ static struct lvmcache_info *_pv_populate_lvmcache(struct cmd_context *cmd,
struct dm_config_node *cn, struct dm_config_node *cn,
struct format_type *fmt, dev_t fallback) 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; struct id pvid, vgid;
char mda_id[32]; char mda_id[32];
char da_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_node *alt_devices = dm_config_find_node(cn->child, "devices_alternate");
struct dm_config_value *alt_device = NULL; struct dm_config_value *alt_device = NULL;
uint64_t offset, size; 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), const char *pvid_txt = dm_config_find_str(cn->child, "id", NULL),
*vgid_txt = dm_config_find_str(cn->child, "vgid", NULL), *vgid_txt = dm_config_find_str(cn->child, "vgid", NULL),
*vgname = dm_config_find_str(cn->child, "vgname", 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) { while (alt_device) {
dev_alternate = dev_cache_get_by_devt(alt_device->v.i, cmd->filter); dev_alternate = dev_cache_get_by_devt(alt_device->v.i, cmd->filter);
if (dev_alternate) { if (dev_alternate) {
if ((info = lvmcache_add(fmt->labeller, (const char *)&pvid, dev_alternate, if ((info_alternate = lvmcache_add(fmt->labeller, (const char *)&pvid, dev_alternate,
vgname, (const char *)&vgid, 0))) { vgname, (const char *)&vgid, 0))) {
/* dev_alternate_cache = dev_alternate;
* FIXME: when lvmcache_add returns non-NULL, info = info_alternate;
* 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));
} }
} else } else {
log_warn("Duplicate of PV %s dev %s exists on unknown device %"PRId64 ":%" PRId64, 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)); pvid_txt, dev_name(dev), MAJOR(alt_device->v.i), MINOR(alt_device->v.i));
}
alt_device = alt_device->next; 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; return info;
} }