diff --git a/disk-image.c b/disk-image.c index 1a704b3..4172b05 100644 --- a/disk-image.c +++ b/disk-image.c @@ -172,3 +172,41 @@ void disk_image__close(struct disk_image *disk) free(disk); } + +/* Fill iov with disk data, starting from sector 'sector'. Return amount of bytes read. */ +ssize_t disk_image__read_sector_iov(struct disk_image *disk, u64 sector, const struct iovec *iov, int iovcount) +{ + u64 first_sector = sector; + + if (disk->ops->read_sector_iov) + return disk->ops->read_sector_iov(disk, sector, iov, iovcount); + + while (iovcount--) { + if (disk->ops->read_sector(disk, sector, iov->iov_base, iov->iov_len) < 0) + return -1; + + sector += iov->iov_len >> SECTOR_SHIFT; + iov++; + } + + return (sector - first_sector) << SECTOR_SHIFT; +} + +/* Write iov to disk, starting from sector 'sector'. Return amount of bytes written. */ +ssize_t disk_image__write_sector_iov(struct disk_image *disk, u64 sector, const struct iovec *iov, int iovcount) +{ + u64 first_sector = sector; + + if (disk->ops->write_sector_iov) + return disk->ops->write_sector_iov(disk, sector, iov, iovcount); + + while (iovcount--) { + if (disk->ops->write_sector(disk, sector, iov->iov_base, iov->iov_len) < 0) + return -1; + + sector += iov->iov_len >> SECTOR_SHIFT; + iov++; + } + + return (sector - first_sector) << SECTOR_SHIFT; +} \ No newline at end of file diff --git a/include/kvm/disk-image.h b/include/kvm/disk-image.h index 6cc9441..cc83f38 100644 --- a/include/kvm/disk-image.h +++ b/include/kvm/disk-image.h @@ -42,37 +42,8 @@ static inline int disk_image__write_sector(struct disk_image *disk, u64 sector, return disk->ops->write_sector(disk, sector, src, src_len); } -static inline ssize_t disk_image__read_sector_iov(struct disk_image *disk, u64 sector, const struct iovec *iov, int iovcount) -{ - if (disk->ops->read_sector_iov) - return disk->ops->read_sector_iov(disk, sector, iov, iovcount); - - while (iovcount--) { - if (disk->ops->read_sector(disk, sector, iov->iov_base, iov->iov_len) < 0) - return -1; - - sector += iov->iov_len >> SECTOR_SHIFT; - iov++; - } - - return sector << SECTOR_SHIFT; -} - -static inline ssize_t disk_image__write_sector_iov(struct disk_image *disk, u64 sector, const struct iovec *iov, int iovcount) -{ - if (disk->ops->write_sector_iov) - return disk->ops->write_sector_iov(disk, sector, iov, iovcount); - - while (iovcount--) { - if (disk->ops->write_sector(disk, sector, iov->iov_base, iov->iov_len) < 0) - return -1; - - sector += iov->iov_len >> SECTOR_SHIFT; - iov++; - } - - return sector << SECTOR_SHIFT; -} +ssize_t disk_image__read_sector_iov(struct disk_image *disk, u64 sector, const struct iovec *iov, int iovcount); +ssize_t disk_image__write_sector_iov(struct disk_image *disk, u64 sector, const struct iovec *iov, int iovcount); static inline int disk_image__flush(struct disk_image *disk) {