]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
kvm tools: Tune up ops in 'struct disk_image_operations'
authorAsias He <asias.hejun@gmail.com>
Wed, 18 May 2011 08:19:09 +0000 (16:19 +0800)
committerPekka Enberg <penberg@kernel.org>
Wed, 18 May 2011 18:29:01 +0000 (21:29 +0300)
Make read/write ops in 'struct disk_image_operations'
always return the number of bytes read/written and close/flush
ops return int.

Signed-off-by: Asias He <asias.hejun@gmail.com>
Signed-off-by: Pekka Enberg <penberg@kernel.org>
tools/kvm/disk/core.c
tools/kvm/disk/qcow.c
tools/kvm/disk/raw.c
tools/kvm/include/kvm/disk-image.h

index 2990caaed49eb98c12e55ad6479dc9a0ae2aa9f3..a0ccdc526b6adc20bf9a8d3f43517ba177f02fdb 100644 (file)
@@ -55,19 +55,21 @@ struct disk_image *disk_image__open(const char *filename, bool readonly)
        return NULL;
 }
 
-void disk_image__close(struct disk_image *disk)
+int disk_image__close(struct disk_image *disk)
 {
        /* If there was no disk image then there's nothing to do: */
        if (!disk)
-               return;
+               return 0;
 
        if (disk->ops->close)
-               disk->ops->close(disk);
+               return disk->ops->close(disk);
 
        if (close(disk->fd) < 0)
                warning("close() failed");
 
        free(disk);
+
+       return 0;
 }
 
 /* Fill iov with disk data, starting from sector 'sector'. Return amount of bytes read. */
index b29efb4f63cf521dc80f67c5a924b567251ebc08..956775ebe1724f24b505c7faa9649d0d651b9768 100644 (file)
@@ -103,7 +103,7 @@ out_error:
        goto out;
 }
 
-static int qcow1_read_sector(struct disk_image *disk, u64 sector, void *dst, u32 dst_len)
+static ssize_t qcow1_read_sector(struct disk_image *disk, u64 sector, void *dst, u32 dst_len)
 {
        struct qcow *q = disk->priv;
        struct qcow_header *header = q->header;
@@ -129,7 +129,7 @@ static int qcow1_read_sector(struct disk_image *disk, u64 sector, void *dst, u32
                sector          += (nr >> SECTOR_SHIFT);
        }
 
-       return 0;
+       return dst_len;
 }
 
 static inline u64 file_size(int fd)
@@ -291,7 +291,7 @@ error:
        return -1;
 }
 
-static int qcow1_write_sector(struct disk_image *disk, u64 sector, void *src, u32 src_len)
+static ssize_t qcow1_write_sector(struct disk_image *disk, u64 sector, void *src, u32 src_len)
 {
        struct qcow *q = disk->priv;
        struct qcow_header *header = q->header;
@@ -317,33 +317,35 @@ static int qcow1_write_sector(struct disk_image *disk, u64 sector, void *src, u3
                offset          += nr;
        }
 
-       return 0;
+       return nr_written;
 }
 
-static int qcow1_nowrite_sector(struct disk_image *disk, u64 sector, void *src, u32 src_len)
+static ssize_t qcow1_nowrite_sector(struct disk_image *disk, u64 sector, void *src, u32 src_len)
 {
        /* I/O error */
        return -1;
 }
 
-static void qcow1_disk_close(struct disk_image *disk)
+static int qcow1_disk_close(struct disk_image *disk)
 {
        struct qcow *q;
 
        if (!disk)
-               return;
+               return 0;
 
        q = disk->priv;
 
        free(q->table.l1_table);
        free(q->header);
        free(q);
+
+       return 0;
 }
 
 static struct disk_image_operations qcow1_disk_readonly_ops = {
        .read_sector            = qcow1_read_sector,
        .write_sector           = qcow1_nowrite_sector,
-       .close                  = qcow1_disk_close
+       .close                  = qcow1_disk_close,
 };
 
 static struct disk_image_operations qcow1_disk_ops = {
index 8ee7e3fb138c6e984cf9d653f87f6acd79a175e5..b58837bacaad5f72f069e5d3ec49cf8962f39432 100644 (file)
@@ -14,7 +14,7 @@ ssize_t raw_image__write_sector_iov(struct disk_image *disk, u64 sector, const s
        return pwritev_in_full(disk->fd, iov, iovcount, offset);
 }
 
-int raw_image__read_sector_ro_mmap(struct disk_image *disk, u64 sector, void *dst, u32 dst_len)
+ssize_t raw_image__read_sector_ro_mmap(struct disk_image *disk, u64 sector, void *dst, u32 dst_len)
 {
        u64 offset = sector << SECTOR_SHIFT;
 
@@ -23,10 +23,10 @@ int raw_image__read_sector_ro_mmap(struct disk_image *disk, u64 sector, void *ds
 
        memcpy(dst, disk->priv + offset, dst_len);
 
-       return 0;
+       return dst_len;
 }
 
-int raw_image__write_sector_ro_mmap(struct disk_image *disk, u64 sector, void *src, u32 src_len)
+ssize_t raw_image__write_sector_ro_mmap(struct disk_image *disk, u64 sector, void *src, u32 src_len)
 {
        u64 offset = sector << SECTOR_SHIFT;
 
@@ -35,13 +35,17 @@ int raw_image__write_sector_ro_mmap(struct disk_image *disk, u64 sector, void *s
 
        memcpy(disk->priv + offset, src, src_len);
 
-       return 0;
+       return src_len;
 }
 
-void raw_image__close_ro_mmap(struct disk_image *disk)
+int raw_image__close_ro_mmap(struct disk_image *disk)
 {
+       int ret = 0;
+
        if (disk->priv != MAP_FAILED)
-               munmap(disk->priv, disk->size);
+               ret = munmap(disk->priv, disk->size);
+
+       return ret;
 }
 
 static struct disk_image_operations raw_image_ops = {
index 463801ee239f2433d1445180741ffccca5577bf5..6531a93e45ea365fe6e0e5b4a59755010744921e 100644 (file)
 struct disk_image;
 
 struct disk_image_operations {
-       int (*read_sector)(struct disk_image *disk, u64 sector, void *dst, u32 dst_len);
-       int (*write_sector)(struct disk_image *disk, u64 sector, void *src, u32 src_len);
+       /*
+        * The following two are used for reading or writing with a single buffer.
+        * The implentation can use readv/writev or memcpy.
+        */
+       ssize_t (*read_sector)(struct disk_image *disk, u64 sector, void *dst, u32 dst_len);
+       ssize_t (*write_sector)(struct disk_image *disk, u64 sector, void *src, u32 src_len);
+       /*
+        * The following two are used for reading or writing with multiple buffers.
+        * The implentation can use readv/writev or memcpy.
+        */
        ssize_t (*read_sector_iov)(struct disk_image *disk, u64 sector, const struct iovec *iov, int iovcount);
        ssize_t (*write_sector_iov)(struct disk_image *disk, u64 sector, const struct iovec *iov, int iovcount);
        int (*flush)(struct disk_image *disk);
-       void (*close)(struct disk_image *disk);
+       int (*close)(struct disk_image *disk);
 };
 
 struct disk_image {
@@ -44,7 +52,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, int mmap);
-void disk_image__close(struct disk_image *disk);
+int disk_image__close(struct disk_image *disk);
 
 ssize_t disk_image__read(struct disk_image *disk, u64 sector, const struct iovec *iov, int iovcount);
 ssize_t disk_image__write(struct disk_image *disk, u64 sector, const struct iovec *iov, int iovcount);
@@ -61,8 +69,8 @@ struct disk_image *blkdev__probe(const char *filename, struct stat *st);
 
 ssize_t raw_image__read_sector_iov(struct disk_image *disk, u64 sector, const struct iovec *iov, int iovcount);
 ssize_t raw_image__write_sector_iov(struct disk_image *disk, u64 sector, const struct iovec *iov, int iovcount);
-int raw_image__read_sector_ro_mmap(struct disk_image *disk, u64 sector, void *dst, u32 dst_len);
-int raw_image__write_sector_ro_mmap(struct disk_image *disk, u64 sector, void *src, u32 src_len);
-void raw_image__close_ro_mmap(struct disk_image *disk);
+ssize_t raw_image__read_sector_ro_mmap(struct disk_image *disk, u64 sector, void *dst, u32 dst_len);
+ssize_t raw_image__write_sector_ro_mmap(struct disk_image *disk, u64 sector, void *src, u32 src_len);
+int raw_image__close_ro_mmap(struct disk_image *disk);
 
 #endif /* KVM__DISK_IMAGE_H */