<div dir="ltr"><div>Ben,</div><div><br></div>I'm willing to apply this one.<div>Care to rebase it.</div><div><br></div><div>Best regards,</div><div>Christophe</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Nov 19, 2014 at 7:17 AM, Benjamin Marzinski <span dir="ltr"><<a href="mailto:bmarzins@redhat.com" target="_blank">bmarzins@redhat.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">When multipath renames a device and the name switches from ending in a<br>
number to ending in a letter or vice versa, it currently just keeps any<br>
existing delimiter between the device name and partition number.<br>
However the default behaviour in kpartx is to only use the 'p' delimiter<br>
when the name ends in a number. Unfortunately, without adding a<br>
kpartx.conf that kpartx uses to set the delimiter behavior, there's no<br>
way for multipath to know how kpartx was run for certain device names<br>
(ones ending in a number with a 'p' delimiter).<br>
<br>
The patch adds a new multipath.conf defaults parameter,<br>
"partition_delimiter". If this value is not set, when multipath renames<br>
a device, it will act just like the kpartx default does, only adding a<br>
'p' to names ending in a number.  If this parameter is set, multipath<br>
will act like kpartx does with the -p option is used, and always add<br>
delimiter.<br>
<br>
Signed-off-by: Benjamin Marzinski <<a href="mailto:bmarzins@redhat.com">bmarzins@redhat.com</a>><br>
---<br>
 libmultipath/config.c    |  3 +++<br>
 libmultipath/config.h    |  1 +<br>
 libmultipath/devmapper.c | 14 ++++++++++++--<br>
 libmultipath/dict.c      |  4 ++++<br>
 4 files changed, 20 insertions(+), 2 deletions(-)<br>
<br>
diff --git a/libmultipath/config.c b/libmultipath/config.c<br>
index 3c72b59..701e177 100644<br>
--- a/libmultipath/config.c<br>
+++ b/libmultipath/config.c<br>
@@ -502,6 +502,8 @@ free_config (struct config * conf)<br>
<br>
        if (conf->alias_prefix)<br>
                FREE(conf->alias_prefix);<br>
+       if (conf->partition_delim)<br>
+               FREE(conf->partition_delim);<br>
<br>
        if (conf->prio_args)<br>
                FREE(conf->prio_args);<br>
@@ -564,6 +566,7 @@ load_config (char * file, struct udev *udev)<br>
        conf->detect_prio = DEFAULT_DETECT_PRIO;<br>
        conf->force_sync = 0;<br>
        conf->find_multipaths = DEFAULT_FIND_MULTIPATHS;<br>
+       conf->partition_delim = NULL;<br>
<br>
        /*<br>
         * preload default hwtable<br>
diff --git a/libmultipath/config.h b/libmultipath/config.h<br>
index 801387c..a6205ee 100644<br>
--- a/libmultipath/config.h<br>
+++ b/libmultipath/config.h<br>
@@ -141,6 +141,7 @@ struct config {<br>
        char * prio_args;<br>
        char * checker_name;<br>
        char * alias_prefix;<br>
+       char * partition_delim;<br>
        unsigned char * reservation_key;<br>
<br>
        vector keywords;<br>
diff --git a/libmultipath/devmapper.c b/libmultipath/devmapper.c<br>
index 3d4c111..9e585f9 100644<br>
--- a/libmultipath/devmapper.c<br>
+++ b/libmultipath/devmapper.c<br>
@@ -1142,6 +1142,8 @@ dm_rename_partmaps (char * old, char * new)<br>
        unsigned long long size;<br>
        char dev_t[32];<br>
        int r = 1;<br>
+       int offset;<br>
+       char *delim;<br>
<br>
        if (!(dmt = dm_task_create(DM_DEVICE_LIST)))<br>
                return 1;<br>
@@ -1162,6 +1164,13 @@ dm_rename_partmaps (char * old, char * new)<br>
        if (dm_dev_t(old, &dev_t[0], 32))<br>
                goto out;<br>
<br>
+       if (conf->partition_delim)<br>
+               delim = conf->partition_delim;<br>
+       if (isdigit(new[strlen(new)-1]))<br>
+               delim = "p";<br>
+       else<br>
+               delim = "";<br>
+<br>
        do {<br>
                if (<br>
                    /*<br>
@@ -1189,8 +1198,9 @@ dm_rename_partmaps (char * old, char * new)<br>
                                 * then it's a kpartx generated partition.<br>
                                 * Rename it.<br>
                                 */<br>
-                               snprintf(buff, PARAMS_SIZE, "%s%s",<br>
-                                        new, names->name + strlen(old));<br>
+                               for (offset = strlen(old); names->name[offset] && !(isdigit(names->name[offset])); offset++); /* do nothing */<br>
+                               snprintf(buff, PARAMS_SIZE, "%s%s%s",<br>
+                                        new, delim, names->name + offset);<br>
                                dm_rename(names->name, buff);<br>
                                condlog(4, "partition map %s renamed",<br>
                                        names->name);<br>
diff --git a/libmultipath/dict.c b/libmultipath/dict.c<br>
index d1e2e96..f95f30c 100644<br>
--- a/libmultipath/dict.c<br>
+++ b/libmultipath/dict.c<br>
@@ -233,6 +233,9 @@ declare_def_snprint(multipath_dir, print_str)<br>
 declare_def_handler(find_multipaths, set_yes_no)<br>
 declare_def_snprint(find_multipaths, print_yes_no)<br>
<br>
+declare_def_handler(partition_delim, set_str)<br>
+declare_def_snprint(partition_delim, print_str)<br>
+<br>
 declare_def_handler(selector, set_str)<br>
 declare_def_snprint_defstr(selector, print_str, DEFAULT_SELECTOR)<br>
 declare_hw_handler(selector, set_str)<br>
@@ -1246,6 +1249,7 @@ init_keywords(void)<br>
        install_keyword("detect_prio", &def_detect_prio_handler, &snprint_def_detect_prio);<br>
        install_keyword("force_sync", &def_force_sync_handler, &snprint_def_force_sync);<br>
        install_keyword("find_multipaths", &def_find_multipaths_handler, &snprint_def_find_multipaths);<br>
+       install_keyword("partition_delimiter", &def_partition_delim_handler, &snprint_def_partition_delim);<br>
        __deprecated install_keyword("default_selector", &def_selector_handler, NULL);<br>
        __deprecated install_keyword("default_path_grouping_policy", &def_pgpolicy_handler, NULL);<br>
        __deprecated install_keyword("default_uid_attribute", &def_uid_attribute_handler, NULL);<br>
<span class="HOEnZb"><font color="#888888">--<br>
1.8.3.1<br>
<br>
</font></span></blockquote></div><br></div>