mirror of
https://github.com/clearlinux/kvmtool.git
synced 2026-09-05 05:01:33 +00:00
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:
+9
-13
@@ -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
@@ -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
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user