summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoravg <avg@FreeBSD.org>2017-09-19 08:19:20 +0000
committeravg <avg@FreeBSD.org>2017-09-19 08:19:20 +0000
commitee3f1120fe0108bff60e0f3fbdad7a2c6e125333 (patch)
treef0fa22708af6cda519dbe8f09043bdde7464b16b
parent330c885e4bf434372e8bb3f79e0996ef921929c2 (diff)
downloadFreeBSD-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.c8
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);
OpenPOWER on IntegriCloud