From fdbb2b2d1a11e5c8985283ee3af2c6a0afedb390 Mon Sep 17 00:00:00 2001 From: avg Date: Tue, 19 Sep 2017 08:19:20 +0000 Subject: [PATCH] MFV r320195: bhyveload: correctly query size of disks On FreeBSD fstat(2) works fine for querying sizes of plain files, but not so much for character devices. So, use DIOCGMEDIASIZE to try to get the correct size for disks and disk-like devices (e.g. zvols). PR: 220186 git-svn-id: svn://svn.freebsd.org/base/stable/10@323739 ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f --- usr.sbin/bhyveload/bhyveload.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/usr.sbin/bhyveload/bhyveload.c b/usr.sbin/bhyveload/bhyveload.c index badf5f49e..5f4fdcdca 100644 --- a/usr.sbin/bhyveload/bhyveload.c +++ b/usr.sbin/bhyveload/bhyveload.c @@ -312,10 +312,12 @@ cb_diskioctl(void *arg, int unit, u_long cmd, void *data) *(u_int *)data = 512; break; case DIOCGMEDIASIZE: - if (fstat(disk_fd[unit], &sb) == 0) - *(off_t *)data = sb.st_size; - else + if (fstat(disk_fd[unit], &sb) != 0) return (ENOTTY); + if (S_ISCHR(sb.st_mode) && + ioctl(disk_fd[unit], DIOCGMEDIASIZE, &sb.st_size) != 0) + return (ENOTTY); + *(off_t *)data = sb.st_size; break; default: return (ENOTTY); -- 2.42.0