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);