From: Karel Zak Date: Fri, 8 Jun 2018 09:37:55 +0000 (+0200) Subject: blkzone: fix whole device detection X-Git-Tag: v2.33-rc1~224 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ddf287b4eccdf23e5364e20e9a461fa89ccddf48;p=thirdparty%2Futil-linux.git blkzone: fix whole device detection Matias Bjørling wrote: The current detection code for chunk size assumes that the underlying device is a device that uses the minor device id as the partition id, and that the whole device has minor id 0. This is not true for example null_blk and nvme device drivers. Let's use sysfs_devno_to_wholedisk() to get whole-disk devno. Addresses: https://github.com/karelzak/util-linux/pull/646 Reported-by: Matias Bjørling matias.bjorling@wdc.com Signed-off-by: Karel Zak --- diff --git a/sys-utils/blkzone.c b/sys-utils/blkzone.c index 6d837ff289..9c6dda0116 100644 --- a/sys-utils/blkzone.c +++ b/sys-utils/blkzone.c @@ -116,8 +116,7 @@ static unsigned long blkdev_chunk_sectors(const char *dname) { struct sysfs_cxt cxt = UL_SYSFSCXT_EMPTY; dev_t devno = sysfs_devname_to_devno(dname, NULL); - int major_no = major(devno); - int block_no = minor(devno) & ~0x0f; + dev_t disk; uint64_t sz; int rc; @@ -126,8 +125,10 @@ static unsigned long blkdev_chunk_sectors(const char *dname) * This method masks off the partition specified by the minor device * component. */ - devno = makedev(major_no, block_no); - if (sysfs_init(&cxt, devno, NULL)) + if (sysfs_devno_to_wholedisk(devno, NULL, 0, &disk) != 0) + return 0; + + if (sysfs_init(&cxt, disk, NULL)) return 0; rc = sysfs_read_u64(&cxt, "queue/chunk_sectors", &sz);