[lvm-devel] [PATCH] Add flag to LV interators to indicate whether to process hidden LVs.

Dave Wysochanski dwysocha at redhat.com
Wed Jan 21 00:26:39 UTC 2009


Fixes rhbz 232499.

Signed-off-by: Dave Wysochanski <dwysocha at redhat.com>
---
 tools/lvchange.c  |    2 +-
 tools/lvdisplay.c |    2 +-
 tools/lvremove.c  |    2 +-
 tools/lvscan.c    |    2 +-
 tools/reporter.c  |    4 ++--
 tools/toollib.c   |   15 +++++++++++++--
 tools/toollib.h   |   12 +++++++++++-
 tools/vgdisplay.c |    2 +-
 tools/vgmknodes.c |    4 ++--
 9 files changed, 33 insertions(+), 12 deletions(-)

diff --git a/tools/lvchange.c b/tools/lvchange.c
index cd0ff5a..fbf8dab 100644
--- a/tools/lvchange.c
+++ b/tools/lvchange.c
@@ -728,6 +728,6 @@ int lvchange(struct cmd_context *cmd, int argc, char **argv)
 		return EINVALID_CMD_LINE;
 	}
 
-	return process_each_lv(cmd, argc, argv, LCK_VG_WRITE, NULL,
+	return process_each_lv(cmd, argc, argv, LCK_VG_WRITE, 0, NULL,
 			       &lvchange_single);
 }
diff --git a/tools/lvdisplay.c b/tools/lvdisplay.c
index 5263e0d..28b9cea 100644
--- a/tools/lvdisplay.c
+++ b/tools/lvdisplay.c
@@ -54,6 +54,6 @@ int lvdisplay(struct cmd_context *cmd, int argc, char **argv)
 		return EINVALID_CMD_LINE;
 	}
 
-	return process_each_lv(cmd, argc, argv, LCK_VG_READ, NULL,
+	return process_each_lv(cmd, argc, argv, LCK_VG_READ, 0, NULL,
 			       &_lvdisplay_single);
 }
diff --git a/tools/lvremove.c b/tools/lvremove.c
index 8b8401d..e3aaab9 100644
--- a/tools/lvremove.c
+++ b/tools/lvremove.c
@@ -33,6 +33,6 @@ int lvremove(struct cmd_context *cmd, int argc, char **argv)
 
 	cmd->handles_missing_pvs = 1;
 
-	return process_each_lv(cmd, argc, argv, LCK_VG_WRITE, NULL,
+	return process_each_lv(cmd, argc, argv, LCK_VG_WRITE, 0, NULL,
 			       &lvremove_single);
 }
diff --git a/tools/lvscan.c b/tools/lvscan.c
index 1186b3b..a667046 100644
--- a/tools/lvscan.c
+++ b/tools/lvscan.c
@@ -80,6 +80,6 @@ int lvscan(struct cmd_context *cmd, int argc, char **argv)
 		return EINVALID_CMD_LINE;
 	}
 
-	return process_each_lv(cmd, argc, argv, LCK_VG_READ, NULL,
+	return process_each_lv(cmd, argc, argv, LCK_VG_READ, 0, NULL,
 			       &lvscan_single);
 }
diff --git a/tools/reporter.c b/tools/reporter.c
index c62fc03..af372a8 100644
--- a/tools/reporter.c
+++ b/tools/reporter.c
@@ -352,7 +352,7 @@ static int _report(struct cmd_context *cmd, int argc, char **argv,
 
 	switch (report_type) {
 	case LVS:
-		r = process_each_lv(cmd, argc, argv, LCK_VG_READ, report_handle,
+		r = process_each_lv(cmd, argc, argv, LCK_VG_READ, 0, report_handle,
 				    &_lvs_single);
 		break;
 	case VGS:
@@ -368,7 +368,7 @@ static int _report(struct cmd_context *cmd, int argc, char **argv,
 					    report_handle, &_pvs_in_vg);
 		break;
 	case SEGS:
-		r = process_each_lv(cmd, argc, argv, LCK_VG_READ, report_handle,
+		r = process_each_lv(cmd, argc, argv, LCK_VG_READ, 0, report_handle,
 				    &_lvsegs_single);
 		break;
 	case PVSEGS:
diff --git a/tools/toollib.c b/tools/toollib.c
index a0494a1..db839a3 100644
--- a/tools/toollib.c
+++ b/tools/toollib.c
@@ -86,6 +86,7 @@ int process_each_lv_in_vg(struct cmd_context *cmd,
 			  const struct volume_group *vg,
 			  const struct dm_list *arg_lvnames,
 			  const struct dm_list *tags,
+			  uint32_t flags,
 			  void *handle,
 			  process_single_lv_fn_t process_single)
 {
@@ -121,6 +122,15 @@ int process_each_lv_in_vg(struct cmd_context *cmd,
 	dm_list_iterate_items(lvl, &vg->lvs) {
 		if (lvl->lv->status & SNAPSHOT)
 			continue;
+		/*
+		 * If no LVs given on the cmdline, and this is not
+		 * a visible LV, then skip the LV if we were told
+		 * to only process visible ones.
+		 */
+		if (!lvargs_supplied &&
+		    !lv_is_visible(lvl->lv) &&
+		    (flags & PROCESS_ONLY_VISIBLE_LVS))
+			continue;
 
 		/* Should we process this LV? */
 		if (process_all)
@@ -161,7 +171,8 @@ int process_each_lv_in_vg(struct cmd_context *cmd,
 }
 
 int process_each_lv(struct cmd_context *cmd, int argc, char **argv,
-		    uint32_t lock_type, void *handle,
+		    uint32_t lock_type, uint32_t flags,
+		    void *handle,
 		    int (*process_single) (struct cmd_context * cmd,
 					   struct logical_volume * lv,
 					   void *handle))
@@ -343,7 +354,7 @@ int process_each_lv(struct cmd_context *cmd, int argc, char **argv,
 		}
 
 		ret = process_each_lv_in_vg(cmd, vg, &lvnames, tags_arg,
-					    handle, process_single);
+					    flags, handle, process_single);
 		unlock_vg(cmd, vgname);
 		if (ret > ret_max)
 			ret_max = ret;
diff --git a/tools/toollib.h b/tools/toollib.h
index 915e3f3..5a20d12 100644
--- a/tools/toollib.h
+++ b/tools/toollib.h
@@ -47,9 +47,18 @@ int process_each_segment_in_pv(struct cmd_context *cmd,
 						      struct volume_group * vg,
 						      struct pv_segment * pvseg,
 						      void *handle));
+/*
+ * Indicates whether we should process only visible LVs when looping
+ * through a list of LVs on a VG.
+ * NOTE: This does not apply if a hidden/non-visible LV is given on the
+ * commandline for a tool, only if another option is given (e.g. a VG) that
+ * implies a list of LVs and the tools need to make a decision.
+ */
+#define PROCESS_ONLY_VISIBLE_LVS 0x1
 
 int process_each_lv(struct cmd_context *cmd, int argc, char **argv,
-		    uint32_t lock_type, void *handle,
+		    uint32_t lock_type, uint32_t flags,
+		    void *handle,
 		    int (*process_single) (struct cmd_context * cmd,
 					   struct logical_volume * lv,
 					   void *handle));
@@ -77,6 +86,7 @@ int process_each_lv_in_vg(struct cmd_context *cmd,
 			  const struct volume_group *vg,
 			  const struct dm_list *arg_lvnames,
 			  const struct dm_list *tags,
+			  uint32_t flags,
 			  void *handle,
 			  process_single_lv_fn_t process_single);
 
diff --git a/tools/vgdisplay.c b/tools/vgdisplay.c
index 02fdc19..562fdf8 100644
--- a/tools/vgdisplay.c
+++ b/tools/vgdisplay.c
@@ -45,7 +45,7 @@ static int vgdisplay_single(struct cmd_context *cmd, const char *vg_name,
 	if (arg_count(cmd, verbose_ARG)) {
 		vgdisplay_extents(vg);
 
-		process_each_lv_in_vg(cmd, vg, NULL, NULL, NULL,
+		process_each_lv_in_vg(cmd, vg, NULL, NULL, 0, NULL,
 				      (process_single_lv_fn_t)lvdisplay_full);
 
 		log_print("--- Physical volumes ---");
diff --git a/tools/vgmknodes.c b/tools/vgmknodes.c
index fce925b..6e57a14 100644
--- a/tools/vgmknodes.c
+++ b/tools/vgmknodes.c
@@ -33,6 +33,6 @@ int vgmknodes(struct cmd_context *cmd, int argc, char **argv)
 	if (!lv_mknodes(cmd, NULL))
 		return ECMD_FAILED;
 
-	return process_each_lv(cmd, argc, argv, LCK_VG_READ, NULL,
-			    &_vgmknodes_single);
+	return process_each_lv(cmd, argc, argv, LCK_VG_READ, 0, NULL,
+			       &_vgmknodes_single);
 }
-- 
1.6.0.5




More information about the lvm-devel mailing list