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 #endif /* CONFIG_HAS_AIO */ 73 const char *wwpn; 74 const char *tpgt; 75 int debug_iodelay; 76 }; 77 78 int disk_img_name_parser(const struct option *opt, const char *arg, int unset); 79 int disk_image__init(struct kvm *kvm); 80 int disk_image__exit(struct kvm *kvm); 81 struct disk_image *disk_image__new(int fd, u64 size, struct disk_image_operations *ops, int mmap); 82 int disk_image__flush(struct disk_image *disk); 83 ssize_t disk_image__read(struct disk_image *disk, u64 sector, const struct iovec *iov, 84 int iovcount, void *param); 85 ssize_t disk_image__write(struct disk_image *disk, u64 sector, const struct iovec *iov, 86 int iovcount, void *param); 87 ssize_t disk_image__get_serial(struct disk_image *disk, void *buffer, ssize_t *len); 88 89 struct disk_image *raw_image__probe(int fd, struct stat *st, bool readonly); 90 struct disk_image *blkdev__probe(const char *filename, int flags, struct stat *st); 91 92 ssize_t raw_image__read_sync(struct disk_image *disk, u64 sector, 93 const struct iovec *iov, int iovcount, void *param); 94 ssize_t raw_image__write_sync(struct disk_image *disk, u64 sector, 95 const struct iovec *iov, int iovcount, void *param); 96 ssize_t raw_image__read_mmap(struct disk_image *disk, u64 sector, 97 const struct iovec *iov, int iovcount, void *param); 98 ssize_t raw_image__write_mmap(struct disk_image *disk, u64 sector, 99 const struct iovec *iov, int iovcount, void *param); 100 int raw_image__close(struct disk_image *disk); 101 void disk_image__set_callback(struct disk_image *disk, void (*disk_req_cb)(void *param, long len)); 102 103 #ifdef CONFIG_HAS_AIO 104 int disk_aio_setup(struct disk_image *disk); 105 void disk_aio_destroy(struct disk_image *disk); 106 ssize_t raw_image__read_async(struct disk_image *disk, u64 sector, 107 const struct iovec *iov, int iovcount, void *param); 108 ssize_t raw_image__write_async(struct disk_image *disk, u64 sector, 109 const struct iovec *iov, int iovcount, void *param); 110 111 #define raw_image__read raw_image__read_async 112 #define raw_image__write raw_image__write_async 113 114 #else /* !CONFIG_HAS_AIO */ 115 static inline int disk_aio_setup(struct disk_image *disk) 116 { 117 /* No-op */ 118 return 0; 119 } 120 static inline void disk_aio_destroy(struct disk_image *disk) 121 { 122 } 123 #define raw_image__read raw_image__read_sync 124 #define raw_image__write raw_image__write_sync 125 #endif /* CONFIG_HAS_AIO */ 126 127 #endif /* KVM__DISK_IMAGE_H */ 128