kvm tools: Consolidate disk_image__{new, new_readonly}

This patch simplifies the disk image API.

Signed-off-by: Asias He <asias.hejun@gmail.com>
Signed-off-by: Pekka Enberg <penberg@kernel.org>
This commit is contained in:
Asias He
2015-06-01 16:39:43 +01:00
committed by Will Deacon
parent ebe6667cf5
commit 7d22135f61
4 changed files with 34 additions and 22 deletions
+9 -13
View File
@@ -1,7 +1,7 @@
#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;
@@ -12,20 +12,16 @@ struct disk_image *disk_image__new(int fd, u64 size, struct disk_image_operation
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;
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 = disk_image__new(fd, size, ops);
if (!disk)
return NULL;
disk->priv = mmap(NULL, size, PROT_RW, MAP_PRIVATE | MAP_NORESERVE, fd, 0);
if (disk->priv == MAP_FAILED)
die("mmap() failed");
return disk;
}
+10 -4
View File
@@ -433,10 +433,13 @@ static struct disk_image *qcow2_probe(int fd, bool readonly)
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;
@@ -527,10 +530,13 @@ static struct disk_image *qcow1_probe(int fd, bool readonly)
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;
+11 -3
View File
@@ -57,10 +57,18 @@ static struct disk_image_operations raw_image_ro_mmap_ops = {
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)
@@ -80,5 +88,5 @@ 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);
}
+4 -2
View File
@@ -21,6 +21,9 @@
#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 {
@@ -40,8 +43,7 @@ struct disk_image {
};
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);