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