using pread and pwrite is a little shorter and half the syscalls.
Index: virtio.c
===================================================================
RCS file: /cvs/src/usr.sbin/vmd/virtio.c,v
retrieving revision 1.46
diff -u -p -r1.46 virtio.c
--- virtio.c 11 May 2017 07:31:20 -0000 1.46
+++ virtio.c 27 May 2017 23:20:23 -0000
@@ -335,14 +335,7 @@ vioblk_do_read(struct vioblk_dev *dev, o
return (NULL);
}
- if (lseek(dev->fd, sector * VIRTIO_BLK_SECTOR_SIZE,
- SEEK_SET) == -1) {
- log_warn("seek error in vioblk read");
- free(buf);
- return (NULL);
- }
-
- if (read(dev->fd, buf, sz) != sz) {
+ if (pread(dev->fd, buf, sz, sector * VIRTIO_BLK_SECTOR_SIZE) != sz) {
log_warn("vioblk read error");
free(buf);
return (NULL);
@@ -354,13 +347,7 @@ vioblk_do_read(struct vioblk_dev *dev, o
static int
vioblk_do_write(struct vioblk_dev *dev, off_t sector, char *buf, ssize_t sz)
{
- if (lseek(dev->fd, sector * VIRTIO_BLK_SECTOR_SIZE,
- SEEK_SET) == -1) {
- log_warn("seek error in vioblk write");
- return (1);
- }
-
- if (write(dev->fd, buf, sz) != sz) {
+ if (pwrite(dev->fd, buf, sz, sector * VIRTIO_BLK_SECTOR_SIZE) != sz) {
log_warn("vioblk write error");
return (1);
}