summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Teigland <teigland@redhat.com>2017-08-08 14:22:36 -0500
committerDavid Teigland <teigland@redhat.com>2017-10-18 10:03:57 -0500
commit4dd60927c9cf37ea157be25b2d59c69c158e7cd1 (patch)
treeb93d3fc7017e96c53f8a9f8ca7c32048c6258968
parent06b2df0de0636978cce34d01d5e80a6bf1c0cd0a (diff)
downloadlvm2-4dd60927c9cf37ea157be25b2d59c69c158e7cd1.tar.gz
pvscan: use new label_scan data
'pvscan --cache' for scanning all devices now uses label_scan_async and can reuse data like other commands. 'pvscan --cache dev' can't do a label_scan because it's only allowed to read the single dev. A label_read on that single dev is added prior to reading the VG from it.
-rw-r--r--lib/cache/lvmetad.c23
-rw-r--r--lib/commands/toolcontext.h1
-rw-r--r--lib/format_text/format-text.c9
-rw-r--r--lib/format_text/import.c4
-rw-r--r--lib/format_text/import_vsn1.c18
-rw-r--r--tools/lvmcmdline.c2
-rw-r--r--tools/pvscan.c16
7 files changed, 56 insertions, 17 deletions
diff --git a/lib/cache/lvmetad.c b/lib/cache/lvmetad.c
index 86a2caced..73243a6ba 100644
--- a/lib/cache/lvmetad.c
+++ b/lib/cache/lvmetad.c
@@ -1756,6 +1756,7 @@ int lvmetad_pv_gone_by_dev(struct device *dev)
*/
struct _lvmetad_pvscan_baton {
+ struct cmd_context *cmd;
struct volume_group *vg;
struct format_instance *fid;
};
@@ -1763,10 +1764,14 @@ struct _lvmetad_pvscan_baton {
static int _lvmetad_pvscan_single(struct metadata_area *mda, void *baton)
{
struct _lvmetad_pvscan_baton *b = baton;
+ struct device *mda_dev = mda_get_device(mda);
+ struct label_read_data *ld;
struct volume_group *vg;
+ ld = get_label_read_data(b->cmd, mda_dev);
+
if (mda_is_ignored(mda) ||
- !(vg = mda->ops->vg_read(b->fid, "", mda, NULL, NULL, NULL)))
+ !(vg = mda->ops->vg_read(b->fid, "", mda, ld, NULL, NULL)))
return 1;
/* FIXME Also ensure contents match etc. */
@@ -1860,6 +1865,7 @@ scan_more:
info = (struct lvmcache_info *) label->info;
+ baton.cmd = cmd;
baton.vg = NULL;
baton.fid = lvmcache_fmt(info)->ops->create_instance(lvmcache_fmt(info), &fic);
if (!baton.fid)
@@ -2087,15 +2093,21 @@ int lvmetad_pvscan_single(struct cmd_context *cmd, struct device *dev,
return 1;
}
- if (!label_read(dev, &label, 0)) {
- log_print_unless_silent("No PV label found on %s.", dev_name(dev));
+ if (!(info = lvmcache_info_from_pvid(dev->pvid, dev, 0))) {
+ log_print_unless_silent("No PV info found on %s for PVID %s.", dev_name(dev), dev->pvid);
if (!lvmetad_pv_gone_by_dev(dev))
goto_bad;
return 1;
}
- info = (struct lvmcache_info *) label->info;
+ if (!(label = lvmcache_get_label(info))) {
+ log_print_unless_silent("No PV label found for %s.", dev_name(dev));
+ if (!lvmetad_pv_gone_by_dev(dev))
+ goto_bad;
+ return 1;
+ }
+ baton.cmd = cmd;
baton.vg = NULL;
baton.fid = lvmcache_fmt(info)->ops->create_instance(lvmcache_fmt(info), &fic);
@@ -2185,6 +2197,9 @@ int lvmetad_pvscan_all_devs(struct cmd_context *cmd, int do_wait)
replacing_other_update = 1;
}
+ if (!cmd->use_aio || !label_scan_async(cmd))
+ label_scan_sync(cmd);
+
log_verbose("Scanning all devices to update lvmetad.");
if (!(iter = dev_iter_create(cmd->lvmetad_filter, 1))) {
diff --git a/lib/commands/toolcontext.h b/lib/commands/toolcontext.h
index b7a521be4..6180f9fd7 100644
--- a/lib/commands/toolcontext.h
+++ b/lib/commands/toolcontext.h
@@ -164,6 +164,7 @@ struct cmd_context {
unsigned lv_notify:1;
unsigned pv_notify:1;
unsigned use_aio:1;
+ unsigned pvscan_cache_single:1;
/*
* Filtering.
diff --git a/lib/format_text/format-text.c b/lib/format_text/format-text.c
index ac70947c2..8bf0fca77 100644
--- a/lib/format_text/format-text.c
+++ b/lib/format_text/format-text.c
@@ -1784,15 +1784,18 @@ static struct metadata_area_ops _metadata_text_raw_ops = {
.mda_import_text = _mda_import_text_raw
};
+/* used only for sending info to lvmetad */
+
static int _mda_export_text_raw(struct metadata_area *mda,
struct dm_config_tree *cft,
struct dm_config_node *parent)
{
struct mda_context *mdc = (struct mda_context *) mda->metadata_locn;
- char mdah[MDA_HEADER_SIZE]; /* temporary */
- if (!mdc || !_raw_read_mda_header((struct mda_header *)mdah, &mdc->area, NULL))
+ if (!mdc) {
+ log_error(INTERNAL_ERROR "mda_export_text_raw no mdc");
return 1; /* pretend the MDA does not exist */
+ }
return config_make_nodes(cft, parent, NULL,
"ignore = %" PRId64, (int64_t) mda_is_ignored(mda),
@@ -1802,6 +1805,8 @@ static int _mda_export_text_raw(struct metadata_area *mda,
NULL) ? 1 : 0;
}
+/* used only for receiving info from lvmetad */
+
static int _mda_import_text_raw(struct lvmcache_info *info, const struct dm_config_node *cn)
{
struct device *device;
diff --git a/lib/format_text/import.c b/lib/format_text/import.c
index 7dac1b86e..088207448 100644
--- a/lib/format_text/import.c
+++ b/lib/format_text/import.c
@@ -256,7 +256,7 @@ struct volume_group *text_read_metadata_file(struct format_instance *fid,
static struct volume_group *_import_vg_from_config_tree(const struct dm_config_tree *cft,
struct format_instance *fid,
- unsigned allow_lvmetad_extensions)
+ unsigned for_lvmetad)
{
struct volume_group *vg = NULL;
struct text_vg_version_ops **vsn;
@@ -271,7 +271,7 @@ static struct volume_group *_import_vg_from_config_tree(const struct dm_config_t
* The only path to this point uses cached vgmetadata,
* so it can use cached PV state too.
*/
- if (!(vg = (*vsn)->read_vg(fid, cft, allow_lvmetad_extensions)))
+ if (!(vg = (*vsn)->read_vg(fid, cft, for_lvmetad)))
stack;
else if ((vg_missing = vg_missing_pv_count(vg))) {
log_verbose("There are %d physical volumes missing.",
diff --git a/lib/format_text/import_vsn1.c b/lib/format_text/import_vsn1.c
index b41d83c8f..af69cfc3a 100644
--- a/lib/format_text/import_vsn1.c
+++ b/lib/format_text/import_vsn1.c
@@ -216,12 +216,16 @@ static int _read_pv(struct format_instance *fid,
/*
* Convert the uuid into a device.
*/
- if (!(pv->dev = lvmcache_device_from_pvid(fid->fmt->cmd, &pv->id, &pv->label_sector))) {
- char buffer[64] __attribute__((aligned(8)));
+ if (fid->fmt->cmd && !fid->fmt->cmd->pvscan_cache_single) {
+ if (!(pv->dev = lvmcache_device_from_pvid(fid->fmt->cmd, &pv->id, &pv->label_sector))) {
+ char buffer[64] __attribute__((aligned(8)));
- if (!id_write_format(&pv->id, buffer, sizeof(buffer)))
- buffer[0] = '\0';
- log_error_once("Couldn't find device with uuid %s.", buffer);
+ if (!id_write_format(&pv->id, buffer, sizeof(buffer)))
+ buffer[0] = '\0';
+ log_error_once("Couldn't find device with uuid %s.", buffer);
+ }
+ } else {
+ log_debug_metadata("Skip metadata pvid to device lookup for lvmetad pvscan.");
}
if (!(pv->vg_name = dm_pool_strdup(mem, vg->name)))
@@ -984,7 +988,7 @@ static int _read_sections(struct format_instance *fid,
static struct volume_group *_read_vg(struct format_instance *fid,
const struct dm_config_tree *cft,
- unsigned allow_lvmetad_extensions)
+ unsigned for_lvmetad)
{
const struct dm_config_node *vgn;
const struct dm_config_value *cv;
@@ -1151,7 +1155,7 @@ static struct volume_group *_read_vg(struct format_instance *fid,
goto bad;
}
- if (allow_lvmetad_extensions)
+ if (for_lvmetad)
_read_sections(fid, "outdated_pvs", _read_pv, vg,
vgn, pv_hash, lv_hash, 1);
else if (dm_config_has_node(vgn, "outdated_pvs"))
diff --git a/tools/lvmcmdline.c b/tools/lvmcmdline.c
index ba7ff768e..de22af414 100644
--- a/tools/lvmcmdline.c
+++ b/tools/lvmcmdline.c
@@ -2797,7 +2797,7 @@ int lvm_run_command(struct cmd_context *cmd, int argc, char **argv)
cmd->position_argv = argv;
set_cmd_name(cmd->name);
-
+
if (arg_is_set(cmd, backgroundfork_ARG)) {
if (!become_daemon(cmd, 1)) {
/* parent - quit immediately */
diff --git a/tools/pvscan.c b/tools/pvscan.c
index 6581990f8..396e6a4ce 100644
--- a/tools/pvscan.c
+++ b/tools/pvscan.c
@@ -434,8 +434,10 @@ static int _pvscan_cache(struct cmd_context *cmd, int argc, char **argv)
* to drop any devices that have left.)
*/
- if (argc || devno_args)
+ if (argc || devno_args) {
log_verbose("Scanning devices on command line.");
+ cmd->pvscan_cache_single = 1;
+ }
while (argc--) {
pv_name = *argv++;
@@ -453,6 +455,12 @@ static int _pvscan_cache(struct cmd_context *cmd, int argc, char **argv)
} else {
/* Add device path to lvmetad. */
log_debug("Scanning dev %s for lvmetad cache.", pv_name);
+
+ /* FIXME: add a label read async for single dev to use here */
+ if (!label_read(dev, NULL, 0)) {
+ add_errors++;
+ continue;
+ }
if (!lvmetad_pvscan_single(cmd, dev, &found_vgnames, &pp.changed_vgnames))
add_errors++;
}
@@ -471,6 +479,12 @@ static int _pvscan_cache(struct cmd_context *cmd, int argc, char **argv)
} else {
/* Add major:minor to lvmetad. */
log_debug("Scanning dev %d:%d for lvmetad cache.", major, minor);
+
+ /* FIXME: add a label read async for single dev to use here */
+ if (!label_read(dev, NULL, 0)) {
+ add_errors++;
+ continue;
+ }
if (!lvmetad_pvscan_single(cmd, dev, &found_vgnames, &pp.changed_vgnames))
add_errors++;
}