summaryrefslogtreecommitdiff
path: root/tools/toollib.c
diff options
context:
space:
mode:
authorAlasdair G Kergon <agk@redhat.com>2013-10-01 21:20:10 +0100
committerAlasdair G Kergon <agk@redhat.com>2013-10-01 21:20:10 +0100
commitbaf95bbff70bdd1474b678f37b840025295903ae (patch)
tree5f70af42e2b82a97a37c26ede8b586486e17e12f /tools/toollib.c
parent23ce3352d7e6ad122b3b173ffb739848bec6a7bd (diff)
downloadlvm2-baf95bbff70bdd1474b678f37b840025295903ae.tar.gz
cmdline: Add --ignoreskippedcluster.
Accept --ignoreskippedcluster with pvs, vgs, lvs, pvdisplay, vgdisplay, lvdisplay, vgchange and lvchange to avoid the 'Skipping clustered VG' errors when requesting information about a clustered VG without using clustered locking and still exit with success. The messages can still be seen with -v.
Diffstat (limited to 'tools/toollib.c')
-rw-r--r--tools/toollib.c53
1 files changed, 36 insertions, 17 deletions
diff --git a/tools/toollib.c b/tools/toollib.c
index 9b3e84262..bc8b33ce9 100644
--- a/tools/toollib.c
+++ b/tools/toollib.c
@@ -156,6 +156,29 @@ const char *skip_dev_dir(struct cmd_context *cmd, const char *vg_name,
}
/*
+ * Returns 1 if VG should be ignored.
+ */
+int ignore_vg(struct volume_group *vg, const char *vg_name, int allow_inconsistent, int *ret)
+{
+ uint32_t read_error = vg_read_error(vg);
+
+ if (!read_error)
+ return 0;
+
+ if ((read_error == FAILED_INCONSISTENT) && allow_inconsistent)
+ return 0;
+
+ if (read_error == FAILED_CLUSTERED && vg->cmd->ignore_clustered_vgs)
+ log_verbose("Skipping volume group %s", vg_name);
+ else {
+ log_error("Skipping volume group %s", vg_name);
+ *ret = ECMD_FAILED;
+ }
+
+ return 1;
+}
+
+/*
* Metadata iteration functions
*/
int process_each_lv_in_vg(struct cmd_context *cmd,
@@ -404,12 +427,10 @@ int process_each_lv(struct cmd_context *cmd, int argc, char **argv,
return_ECMD_FAILED;
if (!cmd_vg_read(cmd, &cmd_vgs)) {
- free_cmd_vgs(&cmd_vgs);
- if (ret_max < ECMD_FAILED) {
- log_error("Skipping volume group %s", vgname);
- ret_max = ECMD_FAILED;
- } else
+ if (ignore_vg(cvl_vg->vg, vgname, 0, &ret_max))
stack;
+
+ free_cmd_vgs(&cmd_vgs);
continue;
}
@@ -489,10 +510,10 @@ int process_each_segment_in_pv(struct cmd_context *cmd,
vg_name = pv_vg_name(pv);
vg = vg_read(cmd, vg_name, NULL, 0);
- if (vg_read_error(vg)) {
+ if (ignore_vg(vg, vg_name, 0, &ret)) {
release_vg(vg);
- log_error("Skipping volume group %s", vg_name);
- return ECMD_FAILED;
+ stack;
+ return ret;
}
/*
@@ -561,13 +582,13 @@ static int _process_one_vg(struct cmd_context *cmd, const char *vg_name,
{
struct dm_list cmd_vgs;
struct cmd_vg *cvl_vg;
- int ret = 0;
+ int ret = ECMD_PROCESSED;
log_verbose("Finding volume group \"%s\"", vg_name);
dm_list_init(&cmd_vgs);
if (!(cvl_vg = cmd_vg_add(cmd->mem, &cmd_vgs, vg_name, vgid, flags)))
- return_0;
+ return_ECMD_FAILED;
for (;;) {
if (sigint_caught()) {
@@ -575,15 +596,14 @@ static int _process_one_vg(struct cmd_context *cmd, const char *vg_name,
stack;
break;
}
- if (!cmd_vg_read(cmd, &cmd_vgs))
+
+ if (!cmd_vg_read(cmd, &cmd_vgs)) {
/* Allow FAILED_INCONSISTENT through only for vgcfgrestore */
- if (vg_read_error(cvl_vg->vg) &&
- (!((flags & READ_ALLOW_INCONSISTENT) &&
- (vg_read_error(cvl_vg->vg) == FAILED_INCONSISTENT)))) {
- ret = ECMD_FAILED;
+ if (ignore_vg(cvl_vg->vg, vg_name, flags & READ_ALLOW_INCONSISTENT, &ret)) {
stack;
break;
}
+ }
if (!dm_list_empty(tags) &&
/* Only process if a tag matches or it's on arg_vgnames */
@@ -889,8 +909,7 @@ int process_each_pv(struct cmd_context *cmd, int argc, char **argv,
goto_out;
}
vg = vg_read(cmd, sll->str, NULL, flags);
- if (vg_read_error(vg)) {
- ret_max = ECMD_FAILED;
+ if (ignore_vg(vg, sll->str, 0, &ret_max)) {
release_vg(vg);
stack;
continue;