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 #include "kvm/parse-options.h" 7 8 #include <linux/types.h> 9 #include <linux/fs.h> /* for BLKGETSIZE64 */ 10 #include <sys/ioctl.h> 11 #include <sys/types.h> 12 #include <sys/mman.h> 13 #include <sys/stat.h> 14 #include <stdbool.h> 15 #include <sys/uio.h> 16 #include <stdbool.h> 17 #include <stddef.h> 18 #include <stdlib.h> 19 #include <unistd.h> 20 #include <fcntl.h> 21 22 #ifdef CONFIG_HAS_AIO 23 #include <libaio.h> 24 #endif 25 26 #define SECTOR_SHIFT 9 27 #define SECTOR_SIZE (1UL << SECTOR_SHIFT) 28 29 enum { 30 DISK_IMAGE_REGULAR, 31 DISK_IMAGE_MMAP, 32 }; 33 34 #define MAX_DISK_IMAGES 4 35 36 struct disk_image; 37 38 struct disk_image_operations { 39 ssize_t (*read)(struct disk_image *disk, u64 sector, const struct iovec *iov, 40 int iovcount, void *param); 41 ssize_t (*write)(struct disk_image *disk, u64 sector, const struct iovec *iov, 42 int iovcount, void *param); 43 int (*flush)(struct disk_image *disk); 44 int (*close)(struct disk_image *disk); 45 }; 46 47 struct disk_image_params { 48 const char *filename; 49 /* 50 * wwpn == World Wide Port Number 51 * tpgt == Target Portal Group Tag 52 */ 53 const char *wwpn; 54 const char *tpgt; 55 bool readonly; 56 bool direct; 57 }; 58 59 struct disk_image { 60 int fd; 61 u64 size; 62 struct disk_image_operations *ops; 63 void *priv; 64 void *disk_req_cb_param; 65 void (*disk_req_cb)(void *param, long len); 66 bool readonly; 67 bool async; 68 #ifdef CONFIG_HAS_AIO 69 io_context_t ctx; 70 int evt; 71 #endif /* CONFIG_HAS_AIO */ 72 const char *wwpn; 73 const char *tpgt; 74 int debug_iodelay; 75 }; 76 77 int disk_img_name_parser(const struct option *opt, const char *arg, int unset); 78 int disk_image__init(struct kvm *kvm); 79 int disk_image__exit(struct kvm *kvm); 80 struct disk_image *disk_image__new(int fd, u64 size, struct disk_image_operations *ops, int mmap); 81 int disk_image__flush(struct disk_image *disk); 82 ssize_t disk_image__read(struct disk_image *disk, u64 sector, const struct iovec *iov, 83 int iovcount, void *param); 84 ssize_t disk_image__write(struct disk_image *disk, u64 sector, const struct iovec *iov, 85 int iovcount, void *param); 86 ssize_t disk_image__get_serial(struct disk_image *disk, void *buffer, ssize_t *len); 87 88 struct disk_image *raw_image__probe(int fd, struct stat *st, bool readonly); 89 struct disk_image *blkdev__probe(const char *filename, int flags, struct stat *st); 90 91 ssize_t raw_image__read_sync(struct disk_image *disk, u64 sector, 92 const struct iovec *iov, int iovcount, void *param); 93 ssize_t raw_image__write_sync(struct disk_image *disk, u64 sector, 94 const struct iovec *iov, int iovcount, void *param); 95 ssize_t raw_image__read_mmap(struct disk_image *disk, u64 sector, 96 const struct iovec *iov, int iovcount, void *param); 97 ssize_t raw_image__write_mmap(struct disk_image *disk, u64 sector, 98 const struct iovec *iov, int iovcount, void *param); 99 int raw_image__close(struct disk_image *disk); 100 void disk_image__set_callback(struct disk_image *disk, void (*disk_req_cb)(void *param, long len)); 101 102 #ifdef CONFIG_HAS_AIO 103 int disk_aio_setup(struct disk_image *disk); 104 void disk_aio_destroy(struct disk_image *disk); 105 ssize_t raw_image__read_async(struct disk_image *disk, u64 sector, 106 const struct iovec *iov, int iovcount, void *param); 107 ssize_t raw_image__write_async(struct disk_image *disk, u64 sector, 108 const struct iovec *iov, int iovcount, void *param); 109 110 #define raw_image__read raw_image__read_async 111 #define raw_image__write raw_image__write_async 112 113 #else /* !CONFIG_HAS_AIO */ 114 static inline int disk_aio_setup(struct disk_image *disk) 115 { 116 /* No-op */ 117 return 0; 118 } 119 static inline void disk_aio_destroy(struct disk_image *disk) 120 { 121 } 122 #define raw_image__read raw_image__read_sync 123 #define raw_image__write raw_image__write_sync 124 #endif /* CONFIG_HAS_AIO */ 125 126 #endif /* KVM__DISK_IMAGE_H */ 127