diff options
author | David Teigland <teigland@redhat.com> | 2017-08-08 14:22:36 -0500 |
---|---|---|
committer | David Teigland <teigland@redhat.com> | 2017-10-18 10:03:57 -0500 |
commit | 4dd60927c9cf37ea157be25b2d59c69c158e7cd1 (patch) | |
tree | b93d3fc7017e96c53f8a9f8ca7c32048c6258968 | |
parent | 06b2df0de0636978cce34d01d5e80a6bf1c0cd0a (diff) | |
download | lvm2-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.c | 23 | ||||
-rw-r--r-- | lib/commands/toolcontext.h | 1 | ||||
-rw-r--r-- | lib/format_text/format-text.c | 9 | ||||
-rw-r--r-- | lib/format_text/import.c | 4 | ||||
-rw-r--r-- | lib/format_text/import_vsn1.c | 18 | ||||
-rw-r--r-- | tools/lvmcmdline.c | 2 | ||||
-rw-r--r-- | tools/pvscan.c | 16 |
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++; } |