[dm-devel] [PATCH] [RFC] [PATCH] Add alias_prefix to get multipath names based on storage type
Malahal Naineni
malahal at us.ibm.com
Mon Jun 28 23:07:37 UTC 2010
Any comments??
Malahal Naineni [malahal at us.ibm.com] wrote:
> The current multipath tools use "mpath" prefix for all LUNs when
> user_friendly_names is set. It would be nice if the names are generated
> based on the storage subsystem. For example, all EMC LUNs would be named
> emc_a, emc_b, elm_c etc., and all IBM's SVC LUNs would be named svc_a,
> svc_b, svc_c. This patch attempts to do that using only multipath.conf.
> Patches can be added to the internal hardware table, if needed.
>
> Signed-off-by: Malahal Naineni (malahal at us.ibm.com)
>
> diff -r 49b7dc2c9d46 -r b4d519b4bbc6 libmultipath/alias.c
> --- a/libmultipath/alias.c Tue Jun 15 17:23:49 2010 -0700
> +++ b/libmultipath/alias.c Tue Jun 22 19:25:24 2010 -0700
> @@ -180,34 +180,35 @@ fail:
> }
>
> static int
> -format_devname(char *name, int id, int len)
> +format_devname(char *name, int id, int len, char *prefix)
> {
> int pos;
> + int prefix_len = strlen(prefix);
>
> memset(name,0, len);
> - strcpy(name,"mpath");
> - for (pos = len - 1; pos >= 5; pos--) {
> + strcpy(name, prefix);
> + for (pos = len - 1; pos >= prefix_len; pos--) {
> name[pos] = 'a' + id % 26;
> if (id < 26)
> break;
> id /= 26;
> id--;
> }
> - memmove(name + 5, name + pos, len - pos);
> - name[5 + len - pos] = '\0';
> - return (5 + len - pos);
> + memmove(name + prefix_len, name + pos, len - pos);
> + name[prefix_len + len - pos] = '\0';
> + return (prefix_len + len - pos);
> }
>
> static int
> -scan_devname(char *alias)
> +scan_devname(char *alias, char *prefix)
> {
> char *c;
> int i, n = 0;
>
> - if (strncmp(alias, "mpath", 5))
> + if (!prefix || strncmp(alias, prefix, strlen(prefix)))
> return -1;
>
> - c = alias + 5;
> + c = alias + strlen(prefix);
> while (*c != '\0' && *c != ' ' && *c != '\t') {
> i = *c - 'a';
> n = ( n * 26 ) + i;
> @@ -221,7 +222,7 @@ scan_devname(char *alias)
> }
>
> static int
> -lookup_binding(FILE *f, char *map_wwid, char **map_alias)
> +lookup_binding(FILE *f, char *map_wwid, char **map_alias, char *prefix)
> {
> char buf[LINE_MAX];
> unsigned int line_nr = 0;
> @@ -240,7 +241,7 @@ lookup_binding(FILE *f, char *map_wwid,
> alias = strtok(buf, " \t");
> if (!alias) /* blank line */
> continue;
> - curr_id = scan_devname(alias);
> + curr_id = scan_devname(alias, prefix);
> if (curr_id >= id)
> id = curr_id + 1;
> wwid = strtok(NULL, "");
> @@ -284,7 +285,7 @@ rlookup_binding(FILE *f, char **map_wwid
> alias = strtok(buf, " \t");
> if (!alias) /* blank line */
> continue;
> - curr_id = scan_devname(alias);
> + curr_id = scan_devname(alias, NULL); /* TBD: Why this call? */
> if (curr_id >= id)
> id = curr_id + 1;
> wwid = strtok(NULL, " \t");
> @@ -309,7 +310,7 @@ rlookup_binding(FILE *f, char **map_wwid
> }
>
> static char *
> -allocate_binding(int fd, char *wwid, int id)
> +allocate_binding(int fd, char *wwid, int id, char *prefix)
> {
> char buf[LINE_MAX];
> off_t offset;
> @@ -321,7 +322,7 @@ allocate_binding(int fd, char *wwid, int
> return NULL;
> }
>
> - i = format_devname(buf, id, LINE_MAX);
> + i = format_devname(buf, id, LINE_MAX, prefix);
> c = buf + i;
> snprintf(c,LINE_MAX - i, " %s\n", wwid);
> buf[LINE_MAX - 1] = '\0';
> @@ -352,7 +353,7 @@ allocate_binding(int fd, char *wwid, int
> }
>
> char *
> -get_user_friendly_alias(char *wwid, char *file)
> +get_user_friendly_alias(char *wwid, char *file, char *prefix)
> {
> char *alias;
> int fd, scan_fd, id;
> @@ -385,7 +386,7 @@ get_user_friendly_alias(char *wwid, char
> return NULL;
> }
>
> - id = lookup_binding(f, wwid, &alias);
> + id = lookup_binding(f, wwid, &alias, prefix);
> if (id < 0) {
> fclose(f);
> close(scan_fd);
> @@ -394,7 +395,7 @@ get_user_friendly_alias(char *wwid, char
> }
>
> if (!alias && can_write)
> - alias = allocate_binding(fd, wwid, id);
> + alias = allocate_binding(fd, wwid, id, prefix);
>
> fclose(f);
> close(scan_fd);
> diff -r 49b7dc2c9d46 -r b4d519b4bbc6 libmultipath/alias.h
> --- a/libmultipath/alias.h Tue Jun 15 17:23:49 2010 -0700
> +++ b/libmultipath/alias.h Tue Jun 22 19:25:24 2010 -0700
> @@ -8,5 +8,5 @@
> "# alias wwid\n" \
> "#\n"
>
> -char *get_user_friendly_alias(char *wwid, char *file);
> +char *get_user_friendly_alias(char *wwid, char *file, char *prefix);
> char *get_user_friendly_wwid(char *alias, char *file);
> diff -r 49b7dc2c9d46 -r b4d519b4bbc6 libmultipath/config.c
> --- a/libmultipath/config.c Tue Jun 15 17:23:49 2010 -0700
> +++ b/libmultipath/config.c Tue Jun 22 19:25:24 2010 -0700
> @@ -158,6 +158,9 @@ free_hwe (struct hwentry * hwe)
> if (hwe->prio_args)
> FREE(hwe->prio_args);
>
> + if (hwe->alias_prefix)
> + FREE(hwe->alias_prefix);
> +
> if (hwe->bl_product)
> FREE(hwe->bl_product);
>
> @@ -282,6 +285,7 @@ merge_hwe (struct hwentry * hwe1, struct
> merge_str(checker_name);
> merge_str(prio_name);
> merge_str(prio_args);
> + merge_str(alias_prefix);
> merge_str(bl_product);
> merge_num(pgpolicy);
> merge_num(pgfailback);
> @@ -333,6 +337,9 @@ store_hwe (vector hwtable, struct hwentr
> if (dhwe->prio_args && !(hwe->prio_args = set_param_str(dhwe->prio_args)))
> goto out;
>
> + if (dhwe->alias_prefix && !(hwe->alias_prefix = set_param_str(dhwe->alias_prefix)))
> + goto out;
> +
> hwe->pgpolicy = dhwe->pgpolicy;
> hwe->pgfailback = dhwe->pgfailback;
> hwe->rr_weight = dhwe->rr_weight;
> @@ -409,6 +416,9 @@ free_config (struct config * conf)
> if (conf->prio_name)
> FREE(conf->prio_name);
>
> + if (conf->alias_prefix)
> + FREE(conf->alias_prefix);
> +
> if (conf->prio_args)
> FREE(conf->prio_args);
>
> diff -r 49b7dc2c9d46 -r b4d519b4bbc6 libmultipath/config.h
> --- a/libmultipath/config.h Tue Jun 15 17:23:49 2010 -0700
> +++ b/libmultipath/config.h Tue Jun 22 19:25:24 2010 -0700
> @@ -25,6 +25,7 @@ struct hwentry {
> char * checker_name;
> char * prio_name;
> char * prio_args;
> + char * alias_prefix;
>
> int pgpolicy;
> int pgfailback;
> @@ -99,6 +100,7 @@ struct config {
> char * prio_name;
> char * prio_args;
> char * checker_name;
> + char * alias_prefix;
>
> vector keywords;
> vector mptable;
> diff -r 49b7dc2c9d46 -r b4d519b4bbc6 libmultipath/defaults.h
> --- a/libmultipath/defaults.h Tue Jun 15 17:23:49 2010 -0700
> +++ b/libmultipath/defaults.h Tue Jun 22 19:25:24 2010 -0700
> @@ -2,6 +2,7 @@
> #define DEFAULT_UDEVDIR "/dev"
> #define DEFAULT_MULTIPATHDIR "/" LIB_STRING "/multipath"
> #define DEFAULT_SELECTOR "round-robin 0"
> +#define DEFAULT_ALIAS_PREFIX "mpath"
> #define DEFAULT_FEATURES "0"
> #define DEFAULT_HWHANDLER "0"
> #define DEFAULT_MINIO 1000
> diff -r 49b7dc2c9d46 -r b4d519b4bbc6 libmultipath/dict.c
> --- a/libmultipath/dict.c Tue Jun 15 17:23:49 2010 -0700
> +++ b/libmultipath/dict.c Tue Jun 22 19:25:24 2010 -0700
> @@ -148,6 +148,17 @@ def_prio_handler(vector strvec)
> }
>
> static int
> +def_alias_prefix_handler(vector strvec)
> +{
> + conf->alias_prefix = set_value(strvec);
> +
> + if (!conf->alias_prefix)
> + return 1;
> +
> + return 0;
> +}
> +
> +static int
> def_prio_args_handler(vector strvec)
> {
> conf->prio_args = set_value(strvec);
> @@ -831,6 +842,22 @@ hw_prio_handler(vector strvec)
> }
>
> static int
> +hw_alias_prefix_handler(vector strvec)
> +{
> + struct hwentry * hwe = VECTOR_LAST_SLOT(conf->hwtable);
> +
> + if (!hwe)
> + return 1;
> +
> + hwe->alias_prefix = set_value(strvec);
> +
> + if (!hwe->alias_prefix)
> + return 1;
> +
> + return 0;
> +}
> +
> +static int
> hw_prio_args_handler(vector strvec)
> {
> struct hwentry * hwe = VECTOR_LAST_SLOT(conf->hwtable);
> @@ -1580,6 +1607,19 @@ snprint_hw_prio (char * buff, int len, v
> }
>
> static int
> +snprint_hw_alias_prefix (char * buff, int len, void * data)
> +{
> + struct hwentry * hwe = (struct hwentry *)data;
> +
> + if (!hwe->alias_prefix || (strlen(hwe->alias_prefix) == 0))
> + return 0;
> + if (conf->alias_prefix && !strcmp(hwe->alias_prefix, conf->alias_prefix))
> + return 0;
> +
> + return snprintf(buff, len, "%s", hwe->alias_prefix);
> +}
> +
> +static int
> snprint_hw_prio_args (char * buff, int len, void * data)
> {
> struct hwentry * hwe = (struct hwentry *)data;
> @@ -2076,6 +2116,16 @@ snprint_def_user_friendly_names (char *
> }
>
> static int
> +snprint_def_alias_prefix (char * buff, int len, void * data)
> +{
> + if (!conf->alias_prefix)
> + return 0;
> + if (!strcmp(conf->alias_prefix, DEFAULT_ALIAS_PREFIX))
> + return 0;
> + return snprintf(buff, len, conf->alias_prefix);
> +}
> +
> +static int
> snprint_ble_simple (char * buff, int len, void * data)
> {
> struct blentry * ble = (struct blentry *)data;
> @@ -2117,6 +2167,7 @@ init_keywords(void)
> install_keyword("features", &def_features_handler, &snprint_def_features);
> install_keyword("path_checker", &def_path_checker_handler, &snprint_def_path_checker);
> install_keyword("checker", &def_path_checker_handler, &snprint_def_path_checker);
> + install_keyword("alias_prefix", &def_alias_prefix_handler, &snprint_def_alias_prefix);
> install_keyword("failback", &default_failback_handler, &snprint_def_failback);
> install_keyword("rr_min_io", &def_minio_handler, &snprint_def_rr_min_io);
> install_keyword("max_fds", &max_fds_handler, &snprint_max_fds);
> @@ -2176,6 +2227,7 @@ init_keywords(void)
> install_keyword("path_selector", &hw_selector_handler, &snprint_hw_selector);
> install_keyword("path_checker", &hw_path_checker_handler, &snprint_hw_path_checker);
> install_keyword("checker", &hw_path_checker_handler, &snprint_hw_path_checker);
> + install_keyword("alias_prefix", &hw_alias_prefix_handler, &snprint_hw_alias_prefix);
> install_keyword("features", &hw_features_handler, &snprint_hw_features);
> install_keyword("hardware_handler", &hw_handler_handler, &snprint_hw_hardware_handler);
> install_keyword("prio", &hw_prio_handler, &snprint_hw_prio);
> diff -r 49b7dc2c9d46 -r b4d519b4bbc6 libmultipath/propsel.c
> --- a/libmultipath/propsel.c Tue Jun 15 17:23:49 2010 -0700
> +++ b/libmultipath/propsel.c Tue Jun 22 19:25:24 2010 -0700
> @@ -215,6 +215,26 @@ select_selector (struct multipath * mp)
> return 0;
> }
>
> +static void
> +select_alias_prefix (struct multipath * mp)
> +{
> + if (mp->hwe && mp->hwe->alias_prefix) {
> + mp->alias_prefix = mp->hwe->alias_prefix;
> + condlog(3, "%s: alias_prefix = %s (controller setting)",
> + mp->wwid, mp->alias_prefix);
> + return;
> + }
> + if (conf->alias_prefix) {
> + mp->alias_prefix = conf->alias_prefix;
> + condlog(3, "%s: alias_prefix = %s (config file default)",
> + mp->wwid, mp->alias_prefix);
> + return;
> + }
> + mp->alias_prefix = set_default(DEFAULT_ALIAS_PREFIX);
> + condlog(3, "%s: alias_prefix = %s (internal default)",
> + mp->wwid, mp->alias_prefix);
> +}
> +
> extern int
> select_alias (struct multipath * mp)
> {
> @@ -222,9 +242,11 @@ select_alias (struct multipath * mp)
> mp->alias = mp->mpe->alias;
> else {
> mp->alias = NULL;
> - if (conf->user_friendly_names)
> + if (conf->user_friendly_names) {
> + select_alias_prefix(mp);
> mp->alias = get_user_friendly_alias(mp->wwid,
> - conf->bindings_file);
> + conf->bindings_file, mp->alias_prefix);
> + }
> if (mp->alias == NULL){
> char *alias;
> if ((alias = MALLOC(WWID_SIZE)) != NULL){
> diff -r 49b7dc2c9d46 -r b4d519b4bbc6 libmultipath/structs.h
> --- a/libmultipath/structs.h Tue Jun 15 17:23:49 2010 -0700
> +++ b/libmultipath/structs.h Tue Jun 22 19:25:24 2010 -0700
> @@ -186,6 +186,7 @@ struct multipath {
>
> /* configlet pointers */
> char * alias;
> + char * alias_prefix;
> char * selector;
> char * features;
> char * hwhandler;
>
> --
> dm-devel mailing list
> dm-devel at redhat.com
> https://www.redhat.com/mailman/listinfo/dm-devel
More information about the dm-devel
mailing list