Since this is broken in 2.34 (eoan/focal); I'm thinking we should use sysfs to find the parent via device name walking;
Given a kname (nvme0n1p1) of the target partition
# look up sysfs path from kname
% realpath /sys/class/block/nvme0n1p1
/sys/devices/pci0000:00/0000:00:02.0/0000:05:00.0/nvme/nvme0/nvme0n1/nvme0n1p1
# check if it's a partition
% ls -al /sys/devices/pci0000:00/0000:00:02.0/0000:05:00.0/nvme/nvme0/nvme0n1/nvme0n1p1/partition
-r--r--r-- 1 root root 4096 Feb 12 08:08
/sys/devices/pci0000:00/0000:00:02.0/0000:05:00.0/nvme/nvme0/nvme0n1/nvme0n1p1/partition
@Lee Thanks for tracking down the util-linux bug.
Since this is broken in 2.34 (eoan/focal); I'm thinking we should use sysfs to find the parent via device name walking;
Given a kname (nvme0n1p1) of the target partition
# look up sysfs path from kname block/nvme0n1p1 pci0000: 00/0000: 00:02.0/ 0000:05: 00.0/nvme/ nvme0/nvme0n1/ nvme0n1p1
% realpath /sys/class/
/sys/devices/
# check if it's a partition pci0000: 00/0000: 00:02.0/ 0000:05: 00.0/nvme/ nvme0/nvme0n1/ nvme0n1p1/ partition pci0000: 00/0000: 00:02.0/ 0000:05: 00.0/nvme/ nvme0/nvme0n1/ nvme0n1p1/ partition
% ls -al /sys/devices/
-r--r--r-- 1 root root 4096 Feb 12 08:08
/sys/devices/
# extract parent device path pci0000: 00/0000: 00:02.0/ 0000:05: 00.0/nvme/ nvme0/nvme0n1/ nvme0n1p1 pci0000: 00/0000: 00:02.0/ 0000:05: 00.0/nvme/ nvme0/nvme0n1
% dirname /sys/devices/
/sys/devices/
# extract parent device major/minor pci0000: 00/0000: 00:02.0/ 0000:05: 00.0/nvme/ nvme0/nvme0n1/ dev
% cat /sys/devices/
259:0
# udev symlinks/ dev/block/ $MAJOR: $MINOR
% ls -al /dev/block/259:0
lrwxrwxrwx 1 root root 10 Jan 18 00:16 /dev/block/259:0 -> ../nvme0n1
% realpath /dev/block/259:0
/dev/nvme0n1