This patch simplifies the disk image API.
Signed-off-by: Asias He <asias.hejun@gmail.com>
Signed-off-by: Pekka Enberg <penberg@kernel.org>
#include "kvm/disk-image.h"
#include "kvm/qcow.h"
-struct disk_image *disk_image__new(int fd, u64 size, struct disk_image_operations *ops)
+struct disk_image *disk_image__new(int fd, u64 size, struct disk_image_operations *ops, int use_mmap)
{
struct disk_image *disk;
disk->fd = fd;
disk->size = size;
disk->ops = ops;
- return disk;
-}
-
-struct disk_image *disk_image__new_readonly(int fd, u64 size, struct disk_image_operations *ops)
-{
- struct disk_image *disk;
- disk = disk_image__new(fd, size, ops);
- if (!disk)
- return NULL;
+ if (use_mmap == DISK_IMAGE_MMAP) {
+ /*
+ * The write to disk image will be discarded
+ */
+ disk->priv = mmap(NULL, size, PROT_RW, MAP_PRIVATE | MAP_NORESERVE, fd, 0);
+ if (disk->priv == MAP_FAILED)
+ die("mmap() failed");
+ }
- disk->priv = mmap(NULL, size, PROT_RW, MAP_PRIVATE | MAP_NORESERVE, fd, 0);
- if (disk->priv == MAP_FAILED)
- die("mmap() failed");
return disk;
}
if (qcow_read_l1_table(q) < 0)
goto error;
+ /*
+ * Do not use mmap use read/write instead
+ */
if (readonly)
- disk_image = disk_image__new(fd, h->size, &qcow1_disk_readonly_ops);
+ disk_image = disk_image__new(fd, h->size, &qcow1_disk_readonly_ops, DISK_IMAGE_NOMMAP);
else
- disk_image = disk_image__new(fd, h->size, &qcow1_disk_ops);
+ disk_image = disk_image__new(fd, h->size, &qcow1_disk_ops, DISK_IMAGE_NOMMAP);
if (!disk_image)
goto error;
if (qcow_read_l1_table(q) < 0)
goto error;
+ /*
+ * Do not use mmap use read/write instead
+ */
if (readonly)
- disk_image = disk_image__new(fd, h->size, &qcow1_disk_readonly_ops);
+ disk_image = disk_image__new(fd, h->size, &qcow1_disk_readonly_ops, DISK_IMAGE_NOMMAP);
else
- disk_image = disk_image__new(fd, h->size, &qcow1_disk_ops);
+ disk_image = disk_image__new(fd, h->size, &qcow1_disk_ops, DISK_IMAGE_NOMMAP);
if (!disk_image)
goto error;
struct disk_image *raw_image__probe(int fd, struct stat *st, bool readonly)
{
+
if (readonly)
- return disk_image__new_readonly(fd, st->st_size, &raw_image_ro_mmap_ops);
+ /*
+ * Use mmap's MAP_PRIVATE to implement non-persistent write
+ * FIXME: This does not work on 32-bit host.
+ */
+ return disk_image__new(fd, st->st_size, &raw_image_ro_mmap_ops, DISK_IMAGE_MMAP);
else
- return disk_image__new(fd, st->st_size, &raw_image_ops);
+ /*
+ * Use read/write instead of mmap
+ */
+ return disk_image__new(fd, st->st_size, &raw_image_ops, DISK_IMAGE_NOMMAP);
}
struct disk_image *blkdev__probe(const char *filename, struct stat *st)
return NULL;
}
- return disk_image__new_readonly(fd, size, &raw_image_ro_mmap_ops);
+ return disk_image__new(fd, size, &raw_image_ro_mmap_ops, DISK_IMAGE_MMAP);
}
#define SECTOR_SHIFT 9
#define SECTOR_SIZE (1UL << SECTOR_SHIFT)
+#define DISK_IMAGE_MMAP 0
+#define DISK_IMAGE_NOMMAP 1
+
struct disk_image;
struct disk_image_operations {
};
struct disk_image *disk_image__open(const char *filename, bool readonly);
-struct disk_image *disk_image__new(int fd, u64 size, struct disk_image_operations *ops);
-struct disk_image *disk_image__new_readonly(int fd, u64 size, struct disk_image_operations *ops);
+struct disk_image *disk_image__new(int fd, u64 size, struct disk_image_operations *ops, int mmap);
void disk_image__close(struct disk_image *disk);
ssize_t disk_image__read(struct disk_image *disk, u64 sector, const struct iovec *iov, int iovcount);