[dm-devel] [PATCH 15/28] libmultipath: merge hwentries inside a conf file

Benjamin Marzinski bmarzins at redhat.com
Fri Jun 15 18:03:32 UTC 2018


On Fri, Jun 08, 2018 at 12:20:28PM +0200, Martin Wilck wrote:
> Merging hwentries with identical vendor/product/revision is still useful,
> although it's not strictly necessary any more. But such identical entries
> should always be merged, not only if they appear in different configuration
> files. This requires changing the logic of factorize_hwtable.

Sorry for my slowness in reviewing these. This one looks wrong to me
 
> By setting -DCHECK_BUILTIN_HWTABLE at compile time, the built-in hwtable
> can be checked against duplicates as well.
> 
> Signed-off-by: Martin Wilck <mwilck at suse.com>
> ---
>  libmultipath/config.c | 43 +++++++++++++++++++++----------------------
>  1 file changed, 21 insertions(+), 22 deletions(-)
> 
> diff --git a/libmultipath/config.c b/libmultipath/config.c
> index 713ac7f3..fb41d620 100644
> --- a/libmultipath/config.c
> +++ b/libmultipath/config.c
> @@ -452,7 +452,7 @@ out:
>  }
>  
>  static void
> -factorize_hwtable (vector hw, int n)
> +factorize_hwtable (vector hw, int n, const char *table_desc)
>  {
>  	struct hwentry *hwe1, *hwe2;
>  	int i, j;
> @@ -462,22 +462,26 @@ restart:
>  		if (i == n)
>  			break;
>  		j = n;
> +		/* drop invalid device configs */
> +		if (i >= n && (!hwe1->vendor || !hwe1->product)) {

How can i >= n?  vector_foreach_slot() starts i at 0, and then next
lines are

                if (i == n)
                        break;


> +			condlog(0, "device config in %s missing vendor or product parameter",
> +				table_desc);
> +			vector_del_slot(hw, i--);

shouldn't we also decrement n here. I realize that doesn't work well for
the CHECK_BUILTIN_HWTABLE check, where n is 0, but as I said above, I'm
pretty sure that will never get here.

> +			free_hwe(hwe1);
> +			continue;
> +		}
> +		j = n > i + 1 ? n : i + 1;

again, n must always be at least i + 1 to get here, so j is always n.

>  		vector_foreach_slot_after(hw, hwe2, j) {
> -			/* drop invalid device configs */
> -			if (!hwe2->vendor || !hwe2->product) {
> -				condlog(0, "device config missing vendor or product parameter");
> -				vector_del_slot(hw, j--);
> -				free_hwe(hwe2);
> -				continue;
> -			}
>  			if (hwe_strmatch(hwe2, hwe1) == 0) {
> -				condlog(4, "%s: removing hwentry %s:%s:%s",
> +				condlog(i >= n ? 1 : 3,

this check also looks wrong

> +					"%s: duplicate device section for %s:%s:%s in %s",
>  					__func__, hwe1->vendor, hwe1->product,
> -					hwe1->revision);
> +					hwe1->revision, table_desc);
>  				vector_del_slot(hw, i);
>  				merge_hwe(hwe2, hwe1);
>  				free_hwe(hwe1);
> -				n -= 1;
> +				if (i < n)

and this one looks unnecessary.

> +					n -= 1;
>  				/*
>  				 * Play safe here; we have modified
>  				 * the original vector so the outer
> @@ -605,9 +609,8 @@ process_config_dir(struct config *conf, vector keywords, char *dir)
>  		snprintf(path, LINE_MAX, "%s/%s", dir, namelist[i]->d_name);
>  		path[LINE_MAX-1] = '\0';
>  		process_file(conf, path);
> -		if (VECTOR_SIZE(conf->hwtable) > old_hwtable_size)
> -			factorize_hwtable(conf->hwtable, old_hwtable_size);
> -
> +		factorize_hwtable(conf->hwtable, old_hwtable_size,
> +				  namelist[i]->d_name);
>  	}
>  	pthread_cleanup_pop(1);
>  }
> @@ -655,6 +658,9 @@ load_config (char * file)
>  	if (setup_default_hwtable(conf->hwtable))
>  		goto out;
>  
> +#ifdef CHECK_BUILTIN_HWTABLE
> +	factorize_hwtable(conf->hwtable, 0, "builtin");
> +#endif
>  	/*
>  	 * read the config file
>  	 */
> @@ -668,14 +674,7 @@ load_config (char * file)
>  			condlog(0, "error parsing config file");
>  			goto out;
>  		}
> -		if (VECTOR_SIZE(conf->hwtable) > builtin_hwtable_size) {
> -			/*
> -			 * remove duplica in hwtable. config file
> -			 * takes precedence over build-in hwtable
> -			 */
> -			factorize_hwtable(conf->hwtable, builtin_hwtable_size);
> -		}
> -
> +		factorize_hwtable(conf->hwtable, builtin_hwtable_size, file);
>  	}
>  
>  	conf->processed_main_config = 1;
> -- 
> 2.17.0




More information about the dm-devel mailing list