]> git.proxmox.com Git - mirror_zfs.git/commitdiff
udev: correctly handle partition #16 and later
authorFabian-Gruenbichler <f.gruenbichler@proxmox.com>
Thu, 21 Mar 2024 23:38:24 +0000 (00:38 +0100)
committerGitHub <noreply@github.com>
Thu, 21 Mar 2024 23:38:24 +0000 (16:38 -0700)
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

udev/zvol_id.c

index 5960b978787a8ccd607746fc20df01ce2f1ada88..60934959476730b2e146c5e79c9fccd001ec3622 100644 (file)
@@ -51,7 +51,7 @@ const char *__asan_default_options(void) {
 int
 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]);
                return (1);
        }
@@ -72,9 +72,10 @@ main(int argc, const char *const *argv)
                return (1);
        }
 
-       unsigned int dev_part = minor(sb.st_rdev) % ZVOL_MINORS;
-       if (dev_part != 0)
-               sprintf(zvol_name + strlen(zvol_name), "-part%u", dev_part);
+       const char *dev_part = strrchr(dev_name, 'p');
+       if (dev_part != NULL) {
+               sprintf(zvol_name + strlen(zvol_name), "-part%s", dev_part + 1);
+       }
 
        for (size_t i = 0; i < strlen(zvol_name); ++i)
                if (isblank(zvol_name[i]))