From cc71ff723468de99c72d455ebc970c2354b4d459 Mon Sep 17 00:00:00 2001 From: Conrad Meyer Date: Wed, 7 Oct 2020 20:31:13 +0000 Subject: [PATCH] bhyveload(8): Implement loader_callbacks::diskwrite The method was optional prior to r365938, which made it mandatory but did add any test that an implementation provides the method nor implement it for bhyveload. The code path might not be hit unless the user's loader was configured to write to a file on disk, such as with nextboot(8). Reviewed by: grehan, tsoome Approved by: bhyve X-MFC-With: r365938 Differential Revision: https://reviews.freebsd.org/D26710 --- usr.sbin/bhyveload/bhyveload.c | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/usr.sbin/bhyveload/bhyveload.c b/usr.sbin/bhyveload/bhyveload.c index 1b3be71745d..db7d995f246 100644 --- a/usr.sbin/bhyveload/bhyveload.c +++ b/usr.sbin/bhyveload/bhyveload.c @@ -300,11 +300,11 @@ cb_stat(void *arg, void *h, struct stat *sbp) static int cb_diskread(void *arg, int unit, uint64_t from, void *to, size_t size, - size_t *resid) + size_t *resid) { ssize_t n; - if (unit < 0 || unit >= ndisks ) + if (unit < 0 || unit >= ndisks) return (EIO); n = pread(disk_fd[unit], to, size, from); if (n < 0) @@ -313,6 +313,21 @@ cb_diskread(void *arg, int unit, uint64_t from, void *to, size_t size, return (0); } +static int +cb_diskwrite(void *arg, int unit, uint64_t offset, void *src, size_t size, + size_t *resid) +{ + ssize_t n; + + if (unit < 0 || unit >= ndisks) + return (EIO); + n = pwrite(disk_fd[unit], src, size, offset); + if (n < 0) + return (errno); + *resid = size - n; + return (0); +} + static int cb_diskioctl(void *arg, int unit, u_long cmd, void *data) { @@ -611,6 +626,7 @@ static struct loader_callbacks cb = { .stat = cb_stat, .diskread = cb_diskread, + .diskwrite = cb_diskwrite, .diskioctl = cb_diskioctl, .copyin = cb_copyin,