1 #ifndef KVM__DISK_IMAGE_H 2 #define KVM__DISK_IMAGE_H 3 4 #include "kvm/read-write.h" 5 #include "kvm/util.h" 6 7 #include <linux/types.h> 8 #include <linux/fs.h> /* for BLKGETSIZE64 */ 9 #include <sys/ioctl.h> 10 #include <sys/types.h> 11 #include <sys/mman.h> 12 #include <sys/stat.h> 13 #include <stdbool.h> 14 #include <sys/uio.h> 15 #include <stdbool.h> 16 #include <stddef.h> 17 #include <stdlib.h> 18 #include <unistd.h> 19 #include <fcntl.h> 20 21 #define SECTOR_SHIFT 9 22 #define SECTOR_SIZE (1UL << SECTOR_SHIFT) 23 24 struct disk_image; 25 26 struct disk_image_operations { 27 int (*read_sector)(struct disk_image *disk, u64 sector, void *dst, u32 dst_len); 28 int (*write_sector)(struct disk_image *disk, u64 sector, void *src, u32 src_len); 29 ssize_t (*read_sector_iov)(struct disk_image *disk, u64 sector, const struct iovec *iov, int iovcount); 30 ssize_t (*write_sector_iov)(struct disk_image *disk, u64 sector, const struct iovec *iov, int iovcount); 31 int (*flush)(struct disk_image *disk); 32 void (*close)(struct disk_image *disk); 33 }; 34 35 struct disk_image { 36 int fd; 37 u64 size; 38 struct disk_image_operations *ops; 39 void *priv; 40 }; 41 42 struct disk_image *disk_image__open(const char *filename, bool readonly); 43 struct disk_image *disk_image__new(int fd, u64 size, struct disk_image_operations *ops); 44 struct disk_image *disk_image__new_readonly(int fd, u64 size, struct disk_image_operations *ops); 45 void disk_image__close(struct disk_image *disk); 46 47 static inline int disk_image__read_sector(struct disk_image *disk, u64 sector, void *dst, u32 dst_len) 48 { 49 return disk->ops->read_sector(disk, sector, dst, dst_len); 50 } 51 52 static inline int disk_image__write_sector(struct disk_image *disk, u64 sector, void *src, u32 src_len) 53 { 54 return disk->ops->write_sector(disk, sector, src, src_len); 55 } 56 57 ssize_t disk_image__read_sector_iov(struct disk_image *disk, u64 sector, const struct iovec *iov, int iovcount); 58 ssize_t disk_image__write_sector_iov(struct disk_image *disk, u64 sector, const struct iovec *iov, int iovcount); 59 60 static inline int disk_image__flush(struct disk_image *disk) 61 { 62 if (disk->ops->flush) 63 return disk->ops->flush(disk); 64 return fsync(disk->fd); 65 } 66 67 struct disk_image *raw_image__probe(int fd, struct stat *st, bool readonly); 68 struct disk_image *blkdev__probe(const char *filename, struct stat *st); 69 70 #endif /* KVM__DISK_IMAGE_H */ 71