diff options
author | avg <avg@FreeBSD.org> | 2017-09-19 08:19:20 +0000 |
---|---|---|
committer | avg <avg@FreeBSD.org> | 2017-09-19 08:19:20 +0000 |
commit | ee3f1120fe0108bff60e0f3fbdad7a2c6e125333 (patch) | |
tree | f0fa22708af6cda519dbe8f09043bdde7464b16b | |
parent | 330c885e4bf434372e8bb3f79e0996ef921929c2 (diff) | |
download | FreeBSD-src-ee3f1120fe0108bff60e0f3fbdad7a2c6e125333.zip FreeBSD-src-ee3f1120fe0108bff60e0f3fbdad7a2c6e125333.tar.gz |
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
-rw-r--r-- | usr.sbin/bhyveload/bhyveload.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/usr.sbin/bhyveload/bhyveload.c b/usr.sbin/bhyveload/bhyveload.c index badf5f4..5f4fdcd 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); |