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 (*wait)(struct disk_image *disk); 45 int (*close)(struct disk_image *disk); 46 bool async; 47 }; 48 49 struct disk_image_params { 50 const char *filename; 51 /* 52 * wwpn == World Wide Port Number 53 * tpgt == Target Portal Group Tag 54 */ 55 const char *wwpn; 56 const char *tpgt; 57 bool readonly; 58 bool direct; 59 }; 60 61 struct disk_image { 62 int fd; 63 u64 size; 64 struct disk_image_operations *ops; 65 void *priv; 66 void *disk_req_cb_param; 67 void (*disk_req_cb)(void *param, long len); 68 bool readonly; 69 bool async; 70 #ifdef CONFIG_HAS_AIO 71 io_context_t ctx; 72 int evt; 73 pthread_t thread; 74 u64 aio_inflight; 75 #endif /* CONFIG_HAS_AIO */ 76 const char *wwpn; 77 const char *tpgt; 78 int debug_iodelay; 79 }; 80 81 int disk_img_name_parser(const struct option *opt, const char *arg, int unset); 82 int disk_image__init(struct kvm *kvm); 83 int disk_image__exit(struct kvm *kvm); 84 struct disk_image *disk_image__new(int fd, u64 size, struct disk_image_operations *ops, int mmap); 85 int disk_image__flush(struct disk_image *disk); 86 int disk_image__wait(struct disk_image *disk); 87 ssize_t disk_image__read(struct disk_image *disk, u64 sector, const struct iovec *iov, 88 int iovcount, void *param); 89 ssize_t disk_image__write(struct disk_image *disk, u64 sector, const struct iovec *iov, 90 int iovcount, void *param); 91 ssize_t disk_image__get_serial(struct disk_image *disk, void *buffer, ssize_t *len); 92 93 struct disk_image *raw_image__probe(int fd, struct stat *st, bool readonly); 94 struct disk_image *blkdev__probe(const char *filename, int flags, struct stat *st); 95 96 ssize_t raw_image__read_sync(struct disk_image *disk, u64 sector, 97 const struct iovec *iov, int iovcount, void *param); 98 ssize_t raw_image__write_sync(struct disk_image *disk, u64 sector, 99 const struct iovec *iov, int iovcount, void *param); 100 ssize_t raw_image__read_mmap(struct disk_image *disk, u64 sector, 101 const struct iovec *iov, int iovcount, void *param); 102 ssize_t raw_image__write_mmap(struct disk_image *disk, u64 sector, 103 const struct iovec *iov, int iovcount, void *param); 104 int raw_image__close(struct disk_image *disk); 105 void disk_image__set_callback(struct disk_image *disk, void (*disk_req_cb)(void *param, long len)); 106 107 #ifdef CONFIG_HAS_AIO 108 int disk_aio_setup(struct disk_image *disk); 109 void disk_aio_destroy(struct disk_image *disk); 110 ssize_t raw_image__read_async(struct disk_image *disk, u64 sector, 111 const struct iovec *iov, int iovcount, void *param); 112 ssize_t raw_image__write_async(struct disk_image *disk, u64 sector, 113 const struct iovec *iov, int iovcount, void *param); 114 int raw_image__wait(struct disk_image *disk); 115 116 #define raw_image__read raw_image__read_async 117 #define raw_image__write raw_image__write_async 118 119 #else /* !CONFIG_HAS_AIO */ 120 static inline int disk_aio_setup(struct disk_image *disk) 121 { 122 /* No-op */ 123 return 0; 124 } 125 static inline void disk_aio_destroy(struct disk_image *disk) 126 { 127 } 128 129 static inline int raw_image__wait(struct disk_image *disk) 130 { 131 return 0; 132 } 133 #define raw_image__read raw_image__read_sync 134 #define raw_image__write raw_image__write_sync 135 #endif /* CONFIG_HAS_AIO */ 136 137 #endif /* KVM__DISK_IMAGE_H */ 138