lib/cache/lvmetad.c | 44 ++++++++++++++++++++++++-------------------- tools/pvscan.c | 9 ++++----- 2 files changed, 28 insertions(+), 25 deletions(-) diff --git a/lib/cache/lvmetad.c b/lib/cache/lvmetad.c index 2a2d7ea..da8c027 100644 --- a/lib/cache/lvmetad.c +++ b/lib/cache/lvmetad.c @@ -312,6 +312,7 @@ retry: * The caller should do a disk scan to populate lvmetad. */ if (!strcmp(daemon_token, "none")) { + log_debug_lvmetad("lvmetad initialization needed."); ret = 0; goto out; } @@ -323,10 +324,16 @@ retry: * our global filter. */ if (strcmp(daemon_token, _lvmetad_token)) { + log_debug_lvmetad("lvmetad initialization needed for different filter."); ret = 0; goto out; } + if (wait_start) + log_debug_lvmetad("lvmetad initialized during wait."); + else + log_debug_lvmetad("lvmetad initialized previously."); + out: daemon_reply_destroy(reply); return ret; @@ -2362,28 +2369,11 @@ int lvmetad_pvscan_all_devs(struct cmd_context *cmd, int do_wait) replacing_other_update = 1; } - label_scan(cmd); - - lvmcache_pvscan_duplicate_check(cmd); - - if (lvmcache_found_duplicate_pvs()) { - log_warn("WARNING: Scan found duplicate PVs."); - return 0; - } - - log_verbose("Scanning all devices to update lvmetad."); - - if (!(iter = dev_iter_create(cmd->lvmetad_filter, 1))) { - log_error("dev_iter creation failed"); - return 0; - } - future_token = _lvmetad_token; _lvmetad_token = (char *) LVMETAD_TOKEN_UPDATE_IN_PROGRESS; if (!_token_update(&replaced_update)) { - log_error("Failed to update lvmetad which had an update in progress."); - dev_iter_destroy(iter); + log_error("Failed to start lvmetad update."); _lvmetad_token = future_token; return 0; } @@ -2399,16 +2389,18 @@ int lvmetad_pvscan_all_devs(struct cmd_context *cmd, int do_wait) if (do_wait && !retries) { retries = 1; log_warn("WARNING: lvmetad update in progress, retrying update."); - dev_iter_destroy(iter); _lvmetad_token = future_token; goto retry; } log_warn("WARNING: lvmetad update in progress, skipping update."); - dev_iter_destroy(iter); _lvmetad_token = future_token; return 0; } + log_verbose("Scanning all devices to initialize lvmetad."); + + label_scan(cmd); + log_debug_lvmetad("Telling lvmetad to clear its cache"); reply = _lvmetad_send(cmd, "pv_clear_all", NULL); if (!_lvmetad_handle_reply(reply, "pv_clear_all", "", NULL)) @@ -2418,6 +2410,11 @@ int lvmetad_pvscan_all_devs(struct cmd_context *cmd, int do_wait) was_silent = silent_mode(); init_silent(1); + if (!(iter = dev_iter_create(cmd->lvmetad_filter, 1))) { + log_error("dev_iter creation failed"); + return 0; + } + while ((dev = dev_iter_get(iter))) { if (sigint_caught()) { ret = 0; @@ -2453,6 +2450,13 @@ int lvmetad_pvscan_all_devs(struct cmd_context *cmd, int do_wait) return 0; } + /* This will disable lvmetad if label scan found duplicates. */ + lvmcache_pvscan_duplicate_check(cmd); + if (lvmcache_found_duplicate_pvs()) { + log_warn("WARNING: Scan found duplicate PVs."); + return 0; + } + /* * If lvmetad is disabled, and no lvm1 metadata was seen and no * duplicate PVs were seen, then re-enable lvmetad. diff --git a/tools/pvscan.c b/tools/pvscan.c index cdccfb5..a5e01b3 100644 --- a/tools/pvscan.c +++ b/tools/pvscan.c @@ -381,7 +381,7 @@ static int _pvscan_cache(struct cmd_context *cmd, int argc, char **argv) all_vgs = 1; goto activate; } - + /* * FIXME: when specific devs are named, we generally don't want to scan * any other devs, but if lvmetad is not yet populated, the first @@ -390,11 +390,10 @@ static int _pvscan_cache(struct cmd_context *cmd, int argc, char **argv) * never scan any devices other than those specified. */ if (!lvmetad_token_matches(cmd)) { - log_verbose("Scanning all devices to initialize lvmetad."); - if (lvmetad_used() && !lvmetad_pvscan_all_devs(cmd, 0)) { - log_warn("WARNING: Not using lvmetad because cache update failed."); - lvmetad_make_unused(cmd); + log_warn("WARNING: Not updating lvmetad because cache update failed."); + ret = ECMD_FAILED; + goto out; } if (lvmetad_used() && lvmetad_is_disabled(cmd, &reason)) { log_warn("WARNING: Not using lvmetad because %s.", reason);