summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKarel Zak2018-06-08 11:37:55 +0200
committerKarel Zak2018-06-08 11:42:48 +0200
commitddf287b4eccdf23e5364e20e9a461fa89ccddf48 (patch)
treec441b5b8cc5b00d3b99c3a3a64d067391340d3f4
parentlosetup: keep -f and <devname> mutually exclusive (diff)
downloadkernel-qcow2-util-linux-ddf287b4eccdf23e5364e20e9a461fa89ccddf48.tar.gz
kernel-qcow2-util-linux-ddf287b4eccdf23e5364e20e9a461fa89ccddf48.tar.xz
kernel-qcow2-util-linux-ddf287b4eccdf23e5364e20e9a461fa89ccddf48.zip
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 <kzak@redhat.com>
-rw-r--r--sys-utils/blkzone.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/sys-utils/blkzone.c b/sys-utils/blkzone.c
index 6d837ff28..9c6dda011 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);