summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPetr Rockai <prockai@redhat.com>2013-07-29 18:51:27 +0200
committerPetr Rockai <prockai@redhat.com>2013-07-29 19:16:27 +0200
commitcc9a4dd046c3f53e2547b975859495094e211e5d (patch)
tree1ede1f3c475b7c2ba35d8bf866c6401f31319d28
parenta62f702d6e43f550d6eebaf612d92021becece2f (diff)
downloadlvm2-cc9a4dd046c3f53e2547b975859495094e211e5d.tar.gz
toollib: Implement process_each_label.
-rw-r--r--tools/toollib.c59
-rw-r--r--tools/toollib.h6
2 files changed, 65 insertions, 0 deletions
diff --git a/tools/toollib.c b/tools/toollib.c
index 24d8cbf2f..e6785fba5 100644
--- a/tools/toollib.c
+++ b/tools/toollib.c
@@ -1703,3 +1703,62 @@ int change_tag(struct cmd_context *cmd, struct volume_group *vg,
return 1;
}
+int process_each_label(struct cmd_context *cmd, int argc, char **argv, void *handle,
+ process_single_label_fn_t process_single_label)
+{
+ struct label *label;
+ struct dev_iter *iter;
+ struct device *dev;
+
+ int ret_max = ECMD_PROCESSED;
+ int ret = 0;
+ int opt = 0;
+
+ if (argc) {
+ for (; opt < argc; opt++) {
+ if (!(dev = dev_cache_get(argv[opt], cmd->filter))) {
+ log_error("Failed to find device "
+ "\"%s\"", argv[opt]);
+ ret_max = ECMD_FAILED;
+ continue;
+ }
+
+ if (!label_read(dev, &label, 0))
+ continue;
+
+ ret = process_single_label(cmd, label, handle);
+
+ if (ret > ret_max)
+ ret_max = ret;
+
+ if (sigint_caught())
+ break;
+ }
+
+ return ret_max;
+ }
+
+ if (!(iter = dev_iter_create(cmd->filter, 1))) {
+ log_error("dev_iter creation failed");
+ return ECMD_FAILED;
+ }
+
+ while ((dev = dev_iter_get(iter)))
+ {
+ if (!label_read(dev, &label, 0))
+ continue;
+
+ log_error("processing %s", dev_name(dev));
+ ret = process_single_label(cmd, label, handle);
+
+ if (ret > ret_max)
+ ret_max = ret;
+
+ if (sigint_caught())
+ break;
+ }
+
+ dev_iter_destroy(iter);
+
+ return ret_max;
+}
diff --git a/tools/toollib.h b/tools/toollib.h
index cfcb934c3..f43e0f8a6 100644
--- a/tools/toollib.h
+++ b/tools/toollib.h
@@ -34,6 +34,9 @@ typedef int (*process_single_pv_fn_t) (struct cmd_context *cmd,
struct volume_group *vg,
struct physical_volume *pv,
void *handle);
+typedef int (*process_single_label_fn_t) (struct cmd_context *cmd,
+ struct label *label,
+ void *handle);
typedef int (*process_single_lv_fn_t) (struct cmd_context *cmd,
struct logical_volume *lv,
void *handle);
@@ -54,6 +57,9 @@ int process_each_pv(struct cmd_context *cmd, int argc, char **argv,
int scan_label_only, void *handle,
process_single_pv_fn_t process_single_pv);
+int process_each_label(struct cmd_context *cmd, int argc, char **argv,
+ void *handle, process_single_label_fn_t process_single_label);
+
int process_each_segment_in_pv(struct cmd_context *cmd,
struct volume_group *vg,
struct physical_volume *pv,