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

Dave Wysochanski dwysocha at redhat.com
Thu Jan 22 21:38:57 UTC 2009


This patch does not work - I didn't set the flag anywhere!

It's also questionable to be introducing a flag to pass around for only
one instance so this needs more thought.

On Tue, 2009-01-20 at 19:26 -0500, Dave Wysochanski wrote:
> 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);
>  }




More information about the lvm-devel mailing list