kpartx: support device names with spaces
PATCH v2 1/1 kpartx: support device names with spaces
Device names with spaces fail to be added to device-mapper tables because spaces are field separators. In order to support it, use device major:minor numbers, instead. While still there, make the verbose output of container- and contained-slices consistent.
This is useful on some scenarios with arbitrary loop device names, and non-user_friendly_names multipath WWIDs with spaces (eg, QEMU emulated hard drives, and some IBM devices) on some distros.
Changelog:
- V2: Use major()/minor() instead of MAJOR()/MINOR() (build errors). Update test-case verification output.
Thanks: Christophe Varoqui
Test-case:
# img="/tmp/my.img" # spacename="/dev/my space name" # truncate --size=1G "$img" # lodev=$(sudo losetup --find --show "$img") # ln -sf "$lodev" "$spacename" # ls -l $lodev "$spacename" brw-rw----. 1 root disk 7, 0 Jan 20 11:15 /dev/loop0 lrwxrwxrwx. 1 root root 10 Jan 20 11:16 /dev/my space name -> /dev/loop0 # fdisk $lodev <...> # fdisk -l $lodev <...> Device Boot Start End Blocks Id System /dev/loop0p1 2048 264191 131072 83 Linux /dev/loop0p2 264192 788479 262144 83 Linux /dev/loop0p3 788480 2097151 654336 5 Extended /dev/loop0p5 790528 856063 32768 83 Linux /dev/loop0p6 858112 989183 65536 83 Linux /dev/loop0p7 991232 1515519 262144 83 Linux
Without patch:
# ./kpartx/kpartx -av "$spacename" device-mapper: reload ioctl on my\x20space\x20name1 failed: Invalid argument create/reload failed on my space name1 add map my space name1 (0:0): 0 262144 linear /dev/my space name 2048
device-mapper: reload ioctl on my\x20space\x20name2 failed: Invalid argument create/reload failed on my space name2
add map my space name2 (0:0): 0 524288 linear /dev/my space name 264192
device-mapper: reload ioctl on my\x20space\x20name3 failed: Invalid argument create/reload failed on my space name3
add map my space name3 (0:0): 0 2 linear /dev/my space name 788480
device-mapper: reload ioctl on my\x20space\x20name5 failed: Invalid argument add map my space name5 : 0 65536 linear /dev/my space name 790528
device-mapper: reload ioctl on my\x20space\x20name6 failed: Invalid argument add map my space name6 : 0 131072 linear /dev/my space name 858112
device-mapper: reload ioctl on my\x20space\x20name7 failed: Invalid argument add map my space name7 : 0 524288 linear /dev/my space name 991232
(note: line breaks added for clarity)
With patch:
# ./kpartx/kpartx -av "$spacename" add map my space name1 (253:3): 0 262144 linear 7:0 2048 add map my space name2 (253:4): 0 524288 linear 7:0 264192 add map my space name3 (253:5): 0 2 linear 7:0 788480 add map my space name5 (253:6): 0 65536 linear 7:0 790528 add map my space name6 (253:7): 0 131072 linear 7:0 858112 add map my space name7 (253:8): 0 524288 linear 7:0 991232
# dmsetup table | sort my space name1: 0 262144 linear 7:0 2048 my space name2: 0 524288 linear 7:0 264192 my space name3: 0 2 linear 7:0 788480 my space name5: 0 65536 linear 7:0 790528 my space name6: 0 131072 linear 7:0 858112 my space name7: 0 524288 linear 7:0 991232
# ls -l /dev/mapper/ total 0 crw-------. 1 root root 10, 236 Jan 11 16:29 control lrwxrwxrwx. 1 root root 7 Jan 20 11:19 my\x20space\x20name1 -> ../dm-3 lrwxrwxrwx. 1 root root 7 Jan 20 11:19 my\x20space\x20name2 -> ../dm-4 lrwxrwxrwx. 1 root root 7 Jan 20 11:19 my\x20space\x20name3 -> ../dm-5 lrwxrwxrwx. 1 root root 7 Jan 20 11:19 my\x20space\x20name5 -> ../dm-6 lrwxrwxrwx. 1 root root 7 Jan 20 11:19 my\x20space\x20name6 -> ../dm-7 lrwxrwxrwx. 1 root root 7 Jan 20 11:19 my\x20space\x20name7 -> ../dm-8
Thanks: Scott Moser (pointers to the error and test-case).
--- kpartx/kpartx.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
kpartx/kpartx.c +6 -6
@@ -477,8 +477,8 @@ main(int argc, char **argv){ }strip_slash (partname); -if (safe_sprintf (params,"%s %" PRIu64 , - device, slices[j].start)) { +if (safe_sprintf (params,"%d:%d %" PRIu64 , +major (buf.st_rdev),minor (buf.st_rdev), slices[j].start)) {fprintf (stderr,"params too small\n" );exit (1 ); }
@@ -540,8 +540,8 @@ main(int argc, char **argv){ }strip_slash (partname); -if (safe_sprintf (params,"%s %" PRIu64, - device, +if (safe_sprintf (params,"%d:%d %" PRIu64, +major (buf.st_rdev),minor (buf.st_rdev), slices[j].start)) {fprintf (stderr,"params too small\n" );exit (1 );
@@ -563,8 +563,8 @@ main(int argc, char **argv){ &slices[j].minor);if (verbose) -printf ("add map %s : 0 %" PRIu64" %s %s\n" , - partname, slices[j].size, +printf ("add map %s (%d:%d): 0 %" PRIu64" %s %s\n" , + partname, slices[j].major, slices[j].minor, slices[j].size,DM_TARGET , params); c--; }
Signature · 1 line
1.8.3.1
Christophe Varoqui
AppliedApplied,
thanks.
Quoted 169 lines · Mauricio Faria de Oliveira
Device names with spaces fail to be added to device-mapper tables because spaces are field separators. In order to support it, use device major:minor numbers, instead. While still there, make the verbose output of container- and contained-slices consistent.
This is useful on some scenarios with arbitrary loop device names, and non-user_friendly_names multipath WWIDs with spaces (eg, QEMU emulated hard drives, and some IBM devices) on some distros.
Changelog:
- V2: Use major()/minor() instead of MAJOR()/MINOR() (build errors). Update test-case verification output.
Thanks: Christophe VaroquiTest-case:
# img="/tmp/my.img" # spacename="/dev/my space name" # truncate --size=1G "$img" # lodev=$(sudo losetup --find --show "$img") # ln -sf "$lodev" "$spacename" # ls -l $lodev "$spacename" brw-rw----. 1 root disk 7, 0 Jan 20 11:15 /dev/loop0 lrwxrwxrwx. 1 root root 10 Jan 20 11:16 /dev/my space name ->
/dev/loop0# fdisk $lodev <...># fdisk -l $lodev <...> Device Boot Start End Blocks Id System /dev/loop0p1 2048 264191 131072 83 Linux /dev/loop0p2 264192 788479 262144 83 Linux /dev/loop0p3 788480 2097151 654336 5 Extended /dev/loop0p5 790528 856063 32768 83 Linux /dev/loop0p6 858112 989183 65536 83 Linux /dev/loop0p7 991232 1515519 262144 83 LinuxWithout patch:
# ./kpartx/kpartx -av "$spacename" device-mapper: reload ioctl on my\x20space\x20name1 failed: Invalid argument create/reload failed on my space name1 add map my space name1 (0:0): 0 262144 linear /dev/my space name 2048device-mapper: reload ioctl on my\x20space\x20name2 failed:
Invalid argument
create/reload failed on my space name2
add map my space name2 (0:0): 0 524288 linear/dev/myspace name
264192device-mapper: reload ioctl on my\x20space\x20name3 failed:
Invalid argument
create/reload failed on my space name3
add map my space name3 (0:0): 0 2 linear/dev/myspace name 788480device-mapper: reload ioctl on my\x20space\x20name5 failed:
Invalid argument
add map my space name5 : 0 65536 linear/dev/myspace name 790528device-mapper: reload ioctl on my\x20space\x20name6 failed:
Invalid argument
add map my space name6 : 0 131072 linear/dev/myspace name 858112device-mapper: reload ioctl on my\x20space\x20name7 failed:
Invalid argument
add map my space name7 : 0 524288 linear/dev/myspace name 991232(note: line breaks added for clarity)
With patch:
# ./kpartx/kpartx -av "$spacename" add map my space name1 (253:3): 0 262144 linear 7:0 2048 add map my space name2 (253:4): 0 524288 linear 7:0 264192 add map my space name3 (253:5): 0 2 linear 7:0 788480 add map my space name5 (253:6): 0 65536 linear 7:0 790528 add map my space name6 (253:7): 0 131072 linear 7:0 858112 add map my space name7 (253:8): 0 524288 linear 7:0 991232# dmsetup table | sort my space name1: 0 262144 linear 7:0 2048 my space name2: 0 524288 linear 7:0 264192 my space name3: 0 2 linear 7:0 788480 my space name5: 0 65536 linear 7:0 790528 my space name6: 0 131072 linear 7:0 858112 my space name7: 0 524288 linear 7:0 991232# ls -l /dev/mapper/ total 0 crw-------. 1 root root 10, 236 Jan 11 16:29 control lrwxrwxrwx. 1 root root 7 Jan 20 11:19 my\x20space\x20name1 -> ../dm-3 lrwxrwxrwx. 1 root root 7 Jan 20 11:19 my\x20space\x20name2 -> ../dm-4 lrwxrwxrwx. 1 root root 7 Jan 20 11:19 my\x20space\x20name3 -> ../dm-5 lrwxrwxrwx. 1 root root 7 Jan 20 11:19 my\x20space\x20name5 -> ../dm-6 lrwxrwxrwx. 1 root root 7 Jan 20 11:19 my\x20space\x20name6 -> ../dm-7 lrwxrwxrwx. 1 root root 7 Jan 20 11:19 my\x20space\x20name7 -> ../dm-8Thanks: Scott Moser (pointers to the error and test-case).
Signed-off-by Mauricio Faria de Oliveira <[email protected]>--- kpartx/kpartx.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)kpartx/kpartx.c +2
-2@@ -477,8 +477,8 @@ main(int argc, char **argv){ }strip_slash (partname); -if (safe_sprintf (params,"%s %" PRIu64 , - device, slices[j].start)) { +if (safe_sprintf (params,"%d:%d %" PRIu64 , +major (buf.st_rdev),minor (buf.st_rdev), slices[j].start)) { fprintf(stderr, "params toosmall\n"); exit(1); }kpartx/kpartx.c +2
-2@@ -540,8 +540,8 @@ main(int argc, char **argv){ }strip_slash (partname); - if (safe_sprintf(params, "%s %" PRIu64, - device, + if (safe_sprintf(params, "%d:%d %" PRIu64, + major(buf.st_rdev), minor(buf.st_rdev),slices[j].start)) { fprintf(stderr, "params too small\n"); exit(1);kpartx/kpartx.c +2
-2@@ -563,8 +563,8 @@ main(int argc, char **argv){ &slices[j].minor);if (verbose) -printf ("add map %s : 0 %" PRIu64" %s %s\n" , - partname, slices[j].size, + printf("add map %s (%d:%d): 0 %" PRIu64 " %s %s\n", + partname,slices[j].major, slices[j].minor, slices[j].size,
DM_TARGET, params); c--; }--
1.8.3.1
Quoted 2 lines · Christophe Varoqui
Applied,
thanks.
Thank you.
Signature · 2 lines
Mauricio Faria de Oliveira IBM Linux Technology Center
PATCH 1/1 Fix loopback file with kpartx -av
In reply to Christophe VaroquiQuoted 3 lines · Christophe Varoqui
Applied,
thanks.
This patch apparently breaks the use of loopback-mounted files if you try to use them directly with kpartx -av.
For instance:
qemu-img create foo.img 20M
sgdisk -n 1 foo.img
kpartx -av foo.img
Fails with the following error:
device-mapper: reload ioctl on loop0p1 failed: No such device create/reload failed on loop0p1
add map loop0p1 (0:0): 0 4192256 linear 0:0 2048
This can be fixed by stat()'ing the loop device again after picking it:
kpartx/kpartx.c +5 -0
@@ -322,6 +322,11 @@ main(int argc, char **argv){ loopcreated =1 ; } device = loopdev; + +if (stat (device, &buf)) { +printf ("failed to stat() %s\n" , device); +exit (1 ); + } } off =find_devname_offset (device);
Signature · 3 lines
Mathieu Trudel-Lapierre <[email protected]> Freenode: cyphermox, Jabber: [email protected] 4096R/65B58DA1 818A D123 0992 275B 23C2 CF89 C67B B4D6 65B5 8DA1
Re: [PATCH] Fix loopback file with kpartx -av
Commited,
Thanks.
Quoted 51 lines · Mathieu Trudel-Lapierre
Quoted 3 lines · Christophe Varoqui
Applied,
thanks.This patch apparently breaks the use of loopback-mounted files if you try to use them directly with kpartx -av.
For instance:
qemu-img create foo.img 20M
sgdisk -n 1 foo.img
kpartx -av foo.imgFails with the following error:
device-mapper: reload ioctl on loop0p1 failed: No such device create/reload failed on loop0p1
add map loop0p1 (0:0): 0 4192256 linear 0:0 2048This can be fixed by stat()'ing the loop device again after picking it:
kpartx/kpartx.c +5
-1@@ -322,6 +322,11 @@ main(int argc, char **argv){ loopcreated =1 ; } device = loopdev; + +if (stat (device, &buf)) { +printf ("failed to stat() %s\n" , device); +exit (1 ); + } } off =find_devname_offset (device); --Mathieu Trudel-Lapierre <[email protected]>
Freenode: cyphermox, Jabber: [email protected] 4096R/65B58DA1 818A D123 0992 275B 23C2 CF89 C67B B4D6 65B5 8DA1--
dm-devel mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/dm-devel