udev: correctly handle partition #16 and later

If a zvol has more than 15 partitions, the minor device number exhausts
the slot count reserved for partitions next to the zvol itself. As a
result, the minor number cannot be used to determine the partition
number for the higher partition, and doing so results in wrong named
symlinks being generated by udev.

Since the partition number is encoded in the block device name anyway,
let's just extract it from there instead.

Reviewed-by: Tony Hutter <hutter2@llnl.gov>
Reviewed by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Tino Reichardt <milky-zfs@mcmilk.de>
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
Closes #15904
Closes #15970
This commit is contained in:
Fabian-Gruenbichler 2024-03-22 00:38:24 +01:00 committed by GitHub
parent 2c01cae8b9
commit f1b368359b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -51,7 +51,7 @@ const char *__asan_default_options(void) {
int int
main(int argc, const char *const *argv) main(int argc, const char *const *argv)
{ {
if (argc != 2) { if (argc != 2 || strncmp(argv[1], "/dev/zd", 7) != 0) {
fprintf(stderr, "usage: %s /dev/zdX\n", argv[0]); fprintf(stderr, "usage: %s /dev/zdX\n", argv[0]);
return (1); return (1);
} }
@ -72,9 +72,10 @@ main(int argc, const char *const *argv)
return (1); return (1);
} }
unsigned int dev_part = minor(sb.st_rdev) % ZVOL_MINORS; const char *dev_part = strrchr(dev_name, 'p');
if (dev_part != 0) if (dev_part != NULL) {
sprintf(zvol_name + strlen(zvol_name), "-part%u", dev_part); sprintf(zvol_name + strlen(zvol_name), "-part%s", dev_part + 1);
}
for (size_t i = 0; i < strlen(zvol_name); ++i) for (size_t i = 0; i < strlen(zvol_name); ++i)
if (isblank(zvol_name[i])) if (isblank(zvol_name[i]))