<div dir="ltr">Hello,<div><br></div><div>shouldn't you either define the MAJOR and MINOR macros, or include the appropriate kernel header ? As is the build emits :</div><div><br></div><div><div>kpartx.c:481:8: warning: implicit declaration of function ‘MAJOR’ [-Wimplicit-function-declaration]</div><div>        MAJOR(buf.st_rdev), MINOR(buf.st_rdev), slices[j].start)) {</div></div><div>...</div><div><br></div><div>And the linking emits :</div><div><br></div><div><div>kpartx.o: In function `main':</div><div>/home/cvaroqui/multipath-tools/kpartx/kpartx.c:480: undefined reference to `MINOR'</div><div>/home/cvaroqui/multipath-tools/kpartx/kpartx.c:480: undefined reference to `MAJOR'</div></div><div>...</div><div><br></div><div>Regards,</div><div>Christophe Varoqui</div><div>OpenSVC</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jan 7, 2016 at 7:31 PM, Mauricio Faria de Oliveira <span dir="ltr"><<a href="mailto:mauricfo@linux.vnet.ibm.com" target="_blank">mauricfo@linux.vnet.ibm.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Device names with spaces fail to be added to device-mapper tables<br>
because spaces are field separators.  In order to support it, use<br>
device major:minor numbers, instead.  While still there, make the<br>
verbose output of container- and contained-slices consistent.<br>
<br>
This is useful on some scenarios with arbitrary loop device names,<br>
and non-user_friendly_names multipath WWIDs with spaces (eg, QEMU<br>
emulated hard drives, and some IBM devices) on some distros.<br>
<br>
Test-case:<br>
<br>
        # img="/tmp/my.img"<br>
        # spacename="/dev/my space name"<br>
<br>
        # truncate --size=1G "$img"<br>
        # lodev=$(sudo losetup --find --show "$img")<br>
        # ln -sf "$lodev" "$spacename"<br>
<br>
        # ls -l $lodev "$spacename"<br>
        brw-rw---- 1 root disk 7, 0 Jan  7 10:36 /dev/loop0<br>
        lrwxrwxrwx 1 root root   10 Jan  7 10:36 /dev/my space name -> /dev/loop0<br>
<br>
        # fdisk $lodev<br>
        <...><br>
<br>
        # fdisk -l $lodev<br>
        <...><br>
              Device Boot      Start         End      Blocks   Id  System<br>
        /dev/loop0p1            2048      264191      131072   83  Linux<br>
        /dev/loop0p2          264192      788479      262144   83  Linux<br>
        /dev/loop0p3          788480     2097151      654336    5  Extended<br>
        /dev/loop0p5          790528      856063       32768   83  Linux<br>
        /dev/loop0p6          858112      989183       65536   83  Linux<br>
        /dev/loop0p7          991232     1515519      262144   83  Linux<br>
<br>
Without patch:<br>
<br>
        # kpartx -av "$spacename"<br>
        device-mapper: reload ioctl on my\x20space\x20name1 failed: Invalid argument<br>
        create/reload failed on my space name1<br>
        add map my space name1 (0:0): 0 262144 linear /dev/my space name 2048<br>
<br>
        device-mapper: reload ioctl on my\x20space\x20name2 failed: Invalid argument<br>
        create/reload failed on my space name2<br>
        add map my space name2 (0:0): 0 524288 linear /dev/my space name 264192<br>
<br>
        device-mapper: reload ioctl on my\x20space\x20name3 failed: Invalid argument<br>
        create/reload failed on my space name3<br>
        add map my space name3 (0:0): 0 2 linear /dev/my space name 788480<br>
<br>
        device-mapper: reload ioctl on my\x20space\x20name5 failed: Invalid argument<br>
        add map my space name5 : 0 65536 linear /dev/my space name 790528<br>
<br>
        device-mapper: reload ioctl on my\x20space\x20name6 failed: Invalid argument<br>
        add map my space name6 : 0 131072 linear /dev/my space name 858112<br>
<br>
        device-mapper: reload ioctl on my\x20space\x20name7 failed: Invalid argument<br>
        add map my space name7 : 0 524288 linear /dev/my space name 991232<br>
<br>
With patch:<br>
<br>
        # kpartx -av "$spacename"<br>
        add map my space name1 (252:6): 0 262144 linear 7:0 2048<br>
        add map my space name2 (252:7): 0 524288 linear 7:0 264192<br>
        add map my space name3 (252:8): 0 2 linear 7:0 788480<br>
        add map my space name5 (252:9): 0 65536 linear 7:0 790528<br>
        add map my space name6 (252:10): 0 131072 linear 7:0 858112<br>
        add map my space name7 (252:11): 0 524288 linear 7:0 991232<br>
<br>
        # dmsetup table | sort<br>
        my space name1: 0 262144 linear 7:0 2048<br>
        my space name2: 0 524288 linear 7:0 264192<br>
        my space name3: 0 2 linear 7:0 788480<br>
        my space name5: 0 65536 linear 7:0 790528<br>
        my space name6: 0 131072 linear 7:0 858112<br>
        my space name7: 0 524288 linear 7:0 991232<br>
<br>
        # ls -l /dev/mapper/<br>
        total 0<br>
        crw------- 1 root root  10, 236 Jan  7 12:00 control<br>
        brw-rw---- 1 root disk 252,   6 Jan  7 15:50 my\x20space\x20name1<br>
        brw-rw---- 1 root disk 252,   7 Jan  7 15:50 my\x20space\x20name2<br>
        brw-rw---- 1 root disk 252,   8 Jan  7 15:50 my\x20space\x20name3<br>
        brw-rw---- 1 root disk 252,   9 Jan  7 15:50 my\x20space\x20name5<br>
        brw-rw---- 1 root disk 252,  10 Jan  7 15:50 my\x20space\x20name6<br>
        brw-rw---- 1 root disk 252,  11 Jan  7 15:50 my\x20space\x20name7<br>
<br>
Thanks: Scott Moser (pointers to the error and test-case).<br>
<br>
Signed-off-by: Mauricio Faria de Oliveira <<a href="mailto:mauricfo@linux.vnet.ibm.com">mauricfo@linux.vnet.ibm.com</a>><br>
---<br>
 kpartx/kpartx.c | 12 ++++++------<br>
 1 file changed, 6 insertions(+), 6 deletions(-)<br>
<br>
diff --git a/kpartx/kpartx.c b/kpartx/kpartx.c<br>
index a9d4c98..d5eeea9 100644<br>
--- a/kpartx/kpartx.c<br>
+++ b/kpartx/kpartx.c<br>
@@ -477,8 +477,8 @@ main(int argc, char **argv){<br>
                                }<br>
                                strip_slash(partname);<br>
<br>
-                               if (safe_sprintf(params, "%s %" PRIu64 ,<br>
-                                                device, slices[j].start)) {<br>
+                               if (safe_sprintf(params, "%d:%d %" PRIu64 ,<br>
+                                                MAJOR(buf.st_rdev), MINOR(buf.st_rdev), slices[j].start)) {<br>
                                        fprintf(stderr, "params too small\n");<br>
                                        exit(1);<br>
                                }<br>
@@ -540,8 +540,8 @@ main(int argc, char **argv){<br>
                                        }<br>
                                        strip_slash(partname);<br>
<br>
-                                       if (safe_sprintf(params, "%s %" PRIu64,<br>
-                                                        device,<br>
+                                       if (safe_sprintf(params, "%d:%d %" PRIu64,<br>
+                                                        MAJOR(buf.st_rdev), MINOR(buf.st_rdev),<br>
                                                         slices[j].start)) {<br>
                                                fprintf(stderr, "params too small\n");<br>
                                                exit(1);<br>
@@ -563,8 +563,8 @@ main(int argc, char **argv){<br>
                                                &slices[j].minor);<br>
<br>
                                        if (verbose)<br>
-                                               printf("add map %s : 0 %" PRIu64 " %s %s\n",<br>
-                                                      partname, slices[j].size,<br>
+                                               printf("add map %s (%d:%d): 0 %" PRIu64 " %s %s\n",<br>
+                                                      partname, slices[j].major, slices[j].minor, slices[j].size,<br>
                                                       DM_TARGET, params);<br>
                                        c--;<br>
                                }<br>
<span class="HOEnZb"><font color="#888888">--<br>
1.8.3.1<br>
<br>
</font></span></blockquote></div><br></div>