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@xxxxxxxxxx) 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@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel