[PATCH 02/14] Refactor and add code for (lv) 'lv_path' get function.

Petr Rockai <[email protected]>
Newsgroups dev.linux.lists.lvm-devel
Message-ID <[email protected].>
Dave Wysochanski <[email protected]> writes:

> Signed-off-by: Dave Wysochanski <[email protected]>
Reviewed-By: Petr Rockai <[email protected]>

(But! See inline comments below. It would make sense to have another go
at this one.)

> ---
>  lib/metadata/lv.c       |   21 +++++++++++++++++++++
>  lib/metadata/lv.h       |    1 +
>  lib/report/properties.c |    2 +-
>  lib/report/report.c     |   11 +----------
>  4 files changed, 24 insertions(+), 11 deletions(-)
>
> diff --git a/lib/metadata/lv.c b/lib/metadata/lv.c
> index add0a4d..f750f54 100644
> --- a/lib/metadata/lv.c
> +++ b/lib/metadata/lv.c
> @@ -16,6 +16,27 @@
>  #include "lib.h"
>  #include "metadata.h"
>  #include "activate.h"
> +#include "toolcontext.h"
> +
> +char *lv_path_dup(struct dm_pool *mem, const struct logical_volume *lv)
> +{
> +	char *repstr;
> +	size_t len;
> +
> +	len = strlen(lv->vg->cmd->dev_dir);
> +	len += strlen(lv->vg->name) + strlen(lv->name) + 2;
Can you just make that a single size_t len = foo + bar + ...; line? That
would make it clear there are no side effects involved...

> +	if (!(repstr = dm_pool_zalloc(mem, len))) {
> +		log_error("dm_pool_alloc failed");
> +		return 0;
> +	}
> +
> +	if (dm_snprintf(repstr, len, "%s%s/%s",
> +			lv->vg->cmd->dev_dir, lv->vg->name, lv->name) < 0) {
> +		log_error("lvpath snprintf failed");
> +		return 0;
> +	}
^^ Should the above dm_pool_zalloc/dm_snprintf go into some
dm_pool_asprintf, in fact? That would also remove that "len" computation
and make this function completely trivial. We already have dm_asprintf
(which uses dm_malloc). You could probably parametrise dm_asprintf with
the strdup function into dm_generic_asprintf and have both dm_asprintf
and dm_pool_asprintf implemented in terms of that.

> +	return repstr;
> +}

Also, the log_error bits aren't that spectacular... Could you make them
a bit clearer, or even omit them? The caller has to check the result and
error out anyway...

>  char *lv_uuid_dup(const struct logical_volume *lv)
>  {
> diff --git a/lib/metadata/lv.h b/lib/metadata/lv.h
> index 54ed7e0..eee2811 100644
> --- a/lib/metadata/lv.h
> +++ b/lib/metadata/lv.h
> @@ -52,5 +52,6 @@ uint64_t lv_size(const struct logical_volume *lv);
>  char *lv_attr_dup(struct dm_pool *mem, const struct logical_volume *lv);
>  char *lv_uuid_dup(const struct logical_volume *lv);
>  char *lv_tags_dup(const struct logical_volume *lv);
> +char *lv_path_dup(struct dm_pool *mem, const struct logical_volume *lv);
>  
>  #endif
> diff --git a/lib/report/properties.c b/lib/report/properties.c
> index eec4c61..8890e27 100644
> --- a/lib/report/properties.c
> +++ b/lib/report/properties.c
> @@ -101,7 +101,7 @@ GET_LV_STR_PROPERTY_FN(lv_uuid, lv_uuid_dup(lv))
>  #define _lv_uuid_set _not_implemented_set
>  #define _lv_name_get _not_implemented_get
>  #define _lv_name_set _not_implemented_set
> -#define _lv_path_get _not_implemented_get
> +GET_LV_STR_PROPERTY_FN(lv_path, lv_path_dup(lv->vg->vgmem, lv))
>  #define _lv_path_set _not_implemented_set
>  GET_LV_STR_PROPERTY_FN(lv_attr, lv_attr_dup(lv->vg->vgmem, lv))
>  #define _lv_attr_set _not_implemented_set
> diff --git a/lib/report/report.c b/lib/report/report.c
> index 95f4550..32559b8 100644
> --- a/lib/report/report.c
> +++ b/lib/report/report.c
> @@ -350,18 +350,9 @@ static int _lvpath_disp(struct dm_report *rh, struct dm_pool *mem,
>  {
>  	const struct logical_volume *lv = (const struct logical_volume *) data;
>  	char *repstr;
> -	size_t len;
>  
> -	len = strlen(lv->vg->cmd->dev_dir) + strlen(lv->vg->name) + strlen(lv->name) + 2;
> -	if (!(repstr = dm_pool_zalloc(mem, len))) {
> -		log_error("dm_pool_alloc failed");
> +	if (!(repstr = lv_path_dup(mem, lv)))
>  		return 0;
> -	}
> -
> -	if (dm_snprintf(repstr, len, "%s%s/%s", lv->vg->cmd->dev_dir, lv->vg->name, lv->name) < 0) {
> -		log_error("lvpath snprintf failed");
> -		return 0;
> -	}
>  
>  	dm_report_field_set_value(field, repstr, NULL);
Ok.

Yours,
   Petr.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.