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, struct iovec *iov, 92 int iovcount, ssize_t len); 93 94 struct disk_image *raw_image__probe(int fd, struct stat *st, bool readonly); 95 struct disk_image *blkdev__probe(const char *filename, int flags, struct stat *st); 96 97 ssize_t raw_image__read_sync(struct disk_image *disk, u64 sector, 98 const struct iovec *iov, int iovcount, void *param); 99 ssize_t raw_image__write_sync(struct disk_image *disk, u64 sector, 100 const struct iovec *iov, int iovcount, void *param); 101 ssize_t raw_image__read_mmap(struct disk_image *disk, u64 sector, 102 const struct iovec *iov, int iovcount, void *param); 103 ssize_t raw_image__write_mmap(struct disk_image *disk, u64 sector, 104 const struct iovec *iov, int iovcount, void *param); 105 int raw_image__close(struct disk_image *disk); 106 void disk_image__set_callback(struct disk_image *disk, void (*disk_req_cb)(void *param, long len)); 107 108 #ifdef CONFIG_HAS_AIO 109 int disk_aio_setup(struct disk_image *disk); 110 void disk_aio_destroy(struct disk_image *disk); 111 ssize_t raw_image__read_async(struct disk_image *disk, u64 sector, 112 const struct iovec *iov, int iovcount, void *param); 113 ssize_t raw_image__write_async(struct disk_image *disk, u64 sector, 114 const struct iovec *iov, int iovcount, void *param); 115 int raw_image__wait(struct disk_image *disk); 116 117 #define raw_image__read raw_image__read_async 118 #define raw_image__write raw_image__write_async 119 120 #else /* !CONFIG_HAS_AIO */ 121 static inline int disk_aio_setup(struct disk_image *disk) 122 { 123 /* No-op */ 124 return 0; 125 } 126 static inline void disk_aio_destroy(struct disk_image *disk) 127 { 128 } 129 130 static inline int raw_image__wait(struct disk_image *disk) 131 { 132 return 0; 133 } 134 #define raw_image__read raw_image__read_sync 135 #define raw_image__write raw_image__write_sync 136 #endif /* CONFIG_HAS_AIO */ 137 138 #endif /* KVM__DISK_IMAGE_H */ 139