All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kevin Wolf <kwolf@redhat.com>
To: qemu-block@nongnu.org
Cc: kwolf@redhat.com, qemu-devel@nongnu.org
Subject: [Qemu-devel] [PULL 20/69] vmdk: Implement .bdrv_co_pwritev() interface
Date: Thu, 12 May 2016 16:35:00 +0200	[thread overview]
Message-ID: <1463063749-2201-21-git-send-email-kwolf@redhat.com> (raw)
In-Reply-To: <1463063749-2201-1-git-send-email-kwolf@redhat.com>

Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Fam Zheng <famz@redhat.com>
---
 block/vmdk.c | 209 ++++++++++++++++++++++++++++++++++++++---------------------
 1 file changed, 135 insertions(+), 74 deletions(-)

diff --git a/block/vmdk.c b/block/vmdk.c
index 6c447ad..f243527 100644
--- a/block/vmdk.c
+++ b/block/vmdk.c
@@ -1016,27 +1016,26 @@ static void vmdk_refresh_limits(BlockDriverState *bs, Error **errp)
  */
 static int get_whole_cluster(BlockDriverState *bs,
                              VmdkExtent *extent,
-                             uint64_t cluster_sector_num,
-                             uint64_t sector_num,
-                             uint64_t skip_start_sector,
-                             uint64_t skip_end_sector)
+                             uint64_t cluster_offset,
+                             uint64_t offset,
+                             uint64_t skip_start_bytes,
+                             uint64_t skip_end_bytes)
 {
     int ret = VMDK_OK;
     int64_t cluster_bytes;
     uint8_t *whole_grain;
 
     /* For COW, align request sector_num to cluster start */
-    sector_num = QEMU_ALIGN_DOWN(sector_num, extent->cluster_sectors);
     cluster_bytes = extent->cluster_sectors << BDRV_SECTOR_BITS;
+    offset = QEMU_ALIGN_DOWN(offset, cluster_bytes);
     whole_grain = qemu_blockalign(bs, cluster_bytes);
 
     if (!bs->backing) {
-        memset(whole_grain, 0,  skip_start_sector << BDRV_SECTOR_BITS);
-        memset(whole_grain + (skip_end_sector << BDRV_SECTOR_BITS), 0,
-               cluster_bytes - (skip_end_sector << BDRV_SECTOR_BITS));
+        memset(whole_grain, 0, skip_start_bytes);
+        memset(whole_grain + skip_end_bytes, 0, cluster_bytes - skip_end_bytes);
     }
 
-    assert(skip_end_sector <= extent->cluster_sectors);
+    assert(skip_end_bytes <= cluster_bytes);
     /* we will be here if it's first write on non-exist grain(cluster).
      * try to read from parent image, if exist */
     if (bs->backing && !vmdk_is_cid_valid(bs)) {
@@ -1045,42 +1044,43 @@ static int get_whole_cluster(BlockDriverState *bs,
     }
 
     /* Read backing data before skip range */
-    if (skip_start_sector > 0) {
+    if (skip_start_bytes > 0) {
         if (bs->backing) {
-            ret = bdrv_read(bs->backing->bs, sector_num,
-                            whole_grain, skip_start_sector);
+            ret = bdrv_pread(bs->backing->bs, offset, whole_grain,
+                             skip_start_bytes);
             if (ret < 0) {
                 ret = VMDK_ERROR;
                 goto exit;
             }
         }
-        ret = bdrv_write(extent->file->bs, cluster_sector_num, whole_grain,
-                         skip_start_sector);
+        ret = bdrv_pwrite(extent->file->bs, cluster_offset, whole_grain,
+                          skip_start_bytes);
         if (ret < 0) {
             ret = VMDK_ERROR;
             goto exit;
         }
     }
     /* Read backing data after skip range */
-    if (skip_end_sector < extent->cluster_sectors) {
+    if (skip_end_bytes < cluster_bytes) {
         if (bs->backing) {
-            ret = bdrv_read(bs->backing->bs, sector_num + skip_end_sector,
-                            whole_grain + (skip_end_sector << BDRV_SECTOR_BITS),
-                            extent->cluster_sectors - skip_end_sector);
+            ret = bdrv_pread(bs->backing->bs, offset + skip_end_bytes,
+                             whole_grain + skip_end_bytes,
+                             cluster_bytes - skip_end_bytes);
             if (ret < 0) {
                 ret = VMDK_ERROR;
                 goto exit;
             }
         }
-        ret = bdrv_write(extent->file->bs, cluster_sector_num + skip_end_sector,
-                         whole_grain + (skip_end_sector << BDRV_SECTOR_BITS),
-                         extent->cluster_sectors - skip_end_sector);
+        ret = bdrv_pwrite(extent->file->bs, cluster_offset + skip_end_bytes,
+                          whole_grain + skip_end_bytes,
+                          cluster_bytes - skip_end_bytes);
         if (ret < 0) {
             ret = VMDK_ERROR;
             goto exit;
         }
     }
 
+    ret = VMDK_OK;
 exit:
     qemu_vfree(whole_grain);
     return ret;
@@ -1142,8 +1142,8 @@ static int get_cluster_offset(BlockDriverState *bs,
                               uint64_t offset,
                               bool allocate,
                               uint64_t *cluster_offset,
-                              uint64_t skip_start_sector,
-                              uint64_t skip_end_sector)
+                              uint64_t skip_start_bytes,
+                              uint64_t skip_end_bytes)
 {
     unsigned int l1_index, l2_offset, l2_index;
     int min_index, i, j;
@@ -1230,10 +1230,8 @@ static int get_cluster_offset(BlockDriverState *bs,
          * This problem may occur because of insufficient space on host disk
          * or inappropriate VM shutdown.
          */
-        ret = get_whole_cluster(bs, extent,
-                                cluster_sector,
-                                offset >> BDRV_SECTOR_BITS,
-                                skip_start_sector, skip_end_sector);
+        ret = get_whole_cluster(bs, extent, cluster_sector * BDRV_SECTOR_SIZE,
+                                offset, skip_start_bytes, skip_end_bytes);
         if (ret) {
             return ret;
         }
@@ -1330,38 +1328,57 @@ static int64_t coroutine_fn vmdk_co_get_block_status(BlockDriverState *bs,
 }
 
 static int vmdk_write_extent(VmdkExtent *extent, int64_t cluster_offset,
-                            int64_t offset_in_cluster, const uint8_t *buf,
-                            int nb_sectors, int64_t sector_num)
+                            int64_t offset_in_cluster, QEMUIOVector *qiov,
+                            uint64_t qiov_offset, uint64_t n_bytes,
+                            uint64_t offset)
 {
     int ret;
     VmdkGrainMarker *data = NULL;
     uLongf buf_len;
-    const uint8_t *write_buf = buf;
-    int write_len = nb_sectors * 512;
+    QEMUIOVector local_qiov;
+    struct iovec iov;
     int64_t write_offset;
     int64_t write_end_sector;
 
     if (extent->compressed) {
+        void *compressed_data;
+
         if (!extent->has_marker) {
             ret = -EINVAL;
             goto out;
         }
         buf_len = (extent->cluster_sectors << 9) * 2;
         data = g_malloc(buf_len + sizeof(VmdkGrainMarker));
-        if (compress(data->data, &buf_len, buf, nb_sectors << 9) != Z_OK ||
-                buf_len == 0) {
+
+        compressed_data = g_malloc(n_bytes);
+        qemu_iovec_to_buf(qiov, qiov_offset, compressed_data, n_bytes);
+        ret = compress(data->data, &buf_len, compressed_data, n_bytes);
+        g_free(compressed_data);
+
+        if (ret != Z_OK || buf_len == 0) {
             ret = -EINVAL;
             goto out;
         }
-        data->lba = sector_num;
+
+        data->lba = offset >> BDRV_SECTOR_BITS;
         data->size = buf_len;
-        write_buf = (uint8_t *)data;
-        write_len = buf_len + sizeof(VmdkGrainMarker);
+
+        n_bytes = buf_len + sizeof(VmdkGrainMarker);
+        iov = (struct iovec) {
+            .iov_base   = data,
+            .iov_len    = n_bytes,
+        };
+        qemu_iovec_init_external(&local_qiov, &iov, 1);
+    } else {
+        qemu_iovec_init(&local_qiov, qiov->niov);
+        qemu_iovec_concat(&local_qiov, qiov, qiov_offset, n_bytes);
     }
+
     write_offset = cluster_offset + offset_in_cluster,
-    ret = bdrv_pwrite(extent->file->bs, write_offset, write_buf, write_len);
+    ret = bdrv_co_pwritev(extent->file->bs, write_offset, n_bytes,
+                          &local_qiov, 0);
 
-    write_end_sector = DIV_ROUND_UP(write_offset + write_len, BDRV_SECTOR_SIZE);
+    write_end_sector = DIV_ROUND_UP(write_offset + n_bytes, BDRV_SECTOR_SIZE);
 
     if (extent->compressed) {
         extent->next_cluster_sector = write_end_sector;
@@ -1370,13 +1387,15 @@ static int vmdk_write_extent(VmdkExtent *extent, int64_t cluster_offset,
                                           write_end_sector);
     }
 
-    if (ret != write_len) {
-        ret = ret < 0 ? ret : -EIO;
+    if (ret < 0) {
         goto out;
     }
     ret = 0;
  out:
     g_free(data);
+    if (!extent->compressed) {
+        qemu_iovec_destroy(&local_qiov);
+    }
     return ret;
 }
 
@@ -1525,38 +1544,38 @@ fail:
  *
  * Returns: error code with 0 for success.
  */
-static int vmdk_write(BlockDriverState *bs, int64_t sector_num,
-                      const uint8_t *buf, int nb_sectors,
-                      bool zeroed, bool zero_dry_run)
+static int vmdk_pwritev(BlockDriverState *bs, uint64_t offset,
+                       uint64_t bytes, QEMUIOVector *qiov,
+                       bool zeroed, bool zero_dry_run)
 {
     BDRVVmdkState *s = bs->opaque;
     VmdkExtent *extent = NULL;
     int ret;
-    int64_t index_in_cluster, n;
+    int64_t offset_in_cluster, n_bytes;
     uint64_t cluster_offset;
+    uint64_t bytes_done = 0;
     VmdkMetaData m_data;
 
-    if (sector_num > bs->total_sectors) {
-        error_report("Wrong offset: sector_num=0x%" PRIx64
+    if (DIV_ROUND_UP(offset, BDRV_SECTOR_SIZE) > bs->total_sectors) {
+        error_report("Wrong offset: offset=0x%" PRIx64
                      " total_sectors=0x%" PRIx64,
-                     sector_num, bs->total_sectors);
+                     offset, bs->total_sectors);
         return -EIO;
     }
 
-    while (nb_sectors > 0) {
-        extent = find_extent(s, sector_num, extent);
+    while (bytes > 0) {
+        extent = find_extent(s, offset >> BDRV_SECTOR_BITS, extent);
         if (!extent) {
             return -EIO;
         }
-        index_in_cluster = vmdk_find_index_in_cluster(extent, sector_num);
-        n = extent->cluster_sectors - index_in_cluster;
-        if (n > nb_sectors) {
-            n = nb_sectors;
-        }
-        ret = get_cluster_offset(bs, extent, &m_data, sector_num << 9,
+        offset_in_cluster = vmdk_find_offset_in_cluster(extent, offset);
+        n_bytes = MIN(bytes, extent->cluster_sectors * BDRV_SECTOR_SIZE
+                             - offset_in_cluster);
+
+        ret = get_cluster_offset(bs, extent, &m_data, offset,
                                  !(extent->compressed || zeroed),
-                                 &cluster_offset,
-                                 index_in_cluster, index_in_cluster + n);
+                                 &cluster_offset, offset_in_cluster,
+                                 offset_in_cluster + n_bytes);
         if (extent->compressed) {
             if (ret == VMDK_OK) {
                 /* Refuse write to allocated cluster for streamOptimized */
@@ -1565,7 +1584,7 @@ static int vmdk_write(BlockDriverState *bs, int64_t sector_num,
                 return -EIO;
             } else {
                 /* allocate */
-                ret = get_cluster_offset(bs, extent, &m_data, sector_num << 9,
+                ret = get_cluster_offset(bs, extent, &m_data, offset,
                                          true, &cluster_offset, 0, 0);
             }
         }
@@ -1575,9 +1594,9 @@ static int vmdk_write(BlockDriverState *bs, int64_t sector_num,
         if (zeroed) {
             /* Do zeroed write, buf is ignored */
             if (extent->has_zero_grain &&
-                    index_in_cluster == 0 &&
-                    n >= extent->cluster_sectors) {
-                n = extent->cluster_sectors;
+                    offset_in_cluster == 0 &&
+                    n_bytes >= extent->cluster_sectors * BDRV_SECTOR_SIZE) {
+                n_bytes = extent->cluster_sectors * BDRV_SECTOR_SIZE;
                 if (!zero_dry_run) {
                     /* update L2 tables */
                     if (vmdk_L2update(extent, &m_data, VMDK_GTE_ZEROED)
@@ -1589,9 +1608,8 @@ static int vmdk_write(BlockDriverState *bs, int64_t sector_num,
                 return -ENOTSUP;
             }
         } else {
-            ret = vmdk_write_extent(extent,
-                            cluster_offset, index_in_cluster * 512,
-                            buf, n, sector_num);
+            ret = vmdk_write_extent(extent, cluster_offset, offset_in_cluster,
+                                    qiov, bytes_done, n_bytes, offset);
             if (ret) {
                 return ret;
             }
@@ -1604,9 +1622,9 @@ static int vmdk_write(BlockDriverState *bs, int64_t sector_num,
                 }
             }
         }
-        nb_sectors -= n;
-        sector_num += n;
-        buf += n * 512;
+        bytes -= n_bytes;
+        offset += n_bytes;
+        bytes_done += n_bytes;
 
         /* update CID on the first write every time the virtual disk is
          * opened */
@@ -1621,25 +1639,65 @@ static int vmdk_write(BlockDriverState *bs, int64_t sector_num,
     return 0;
 }
 
-static coroutine_fn int vmdk_co_write(BlockDriverState *bs, int64_t sector_num,
-                                      const uint8_t *buf, int nb_sectors)
+static int coroutine_fn
+vmdk_co_pwritev(BlockDriverState *bs, uint64_t offset, uint64_t bytes,
+                QEMUIOVector *qiov, int flags)
 {
     int ret;
     BDRVVmdkState *s = bs->opaque;
     qemu_co_mutex_lock(&s->lock);
-    ret = vmdk_write(bs, sector_num, buf, nb_sectors, false, false);
+    ret = vmdk_pwritev(bs, offset, bytes, qiov, false, false);
     qemu_co_mutex_unlock(&s->lock);
     return ret;
 }
 
+typedef struct VmdkWriteCompressedCo {
+    BlockDriverState *bs;
+    int64_t sector_num;
+    const uint8_t *buf;
+    int nb_sectors;
+    int ret;
+} VmdkWriteCompressedCo;
+
+static void vmdk_co_write_compressed(void *opaque)
+{
+    VmdkWriteCompressedCo *co = opaque;
+    QEMUIOVector local_qiov;
+    uint64_t offset = co->sector_num * BDRV_SECTOR_SIZE;
+    uint64_t bytes = co->nb_sectors * BDRV_SECTOR_SIZE;
+
+    struct iovec iov = (struct iovec) {
+        .iov_base   = (uint8_t*) co->buf,
+        .iov_len    = bytes,
+    };
+    qemu_iovec_init_external(&local_qiov, &iov, 1);
+
+    co->ret = vmdk_pwritev(co->bs, offset, bytes, &local_qiov, false, false);
+}
+
 static int vmdk_write_compressed(BlockDriverState *bs,
                                  int64_t sector_num,
                                  const uint8_t *buf,
                                  int nb_sectors)
 {
     BDRVVmdkState *s = bs->opaque;
+
     if (s->num_extents == 1 && s->extents[0].compressed) {
-        return vmdk_write(bs, sector_num, buf, nb_sectors, false, false);
+        Coroutine *co;
+        AioContext *aio_context = bdrv_get_aio_context(bs);
+        VmdkWriteCompressedCo data = {
+            .bs         = bs,
+            .sector_num = sector_num,
+            .buf        = buf,
+            .nb_sectors = nb_sectors,
+            .ret        = -EINPROGRESS,
+        };
+        co = qemu_coroutine_create(vmdk_co_write_compressed);
+        qemu_coroutine_enter(co, &data);
+        while (data.ret == -EINPROGRESS) {
+            aio_poll(aio_context, true);
+        }
+        return data.ret;
     } else {
         return -ENOTSUP;
     }
@@ -1652,12 +1710,15 @@ static int coroutine_fn vmdk_co_write_zeroes(BlockDriverState *bs,
 {
     int ret;
     BDRVVmdkState *s = bs->opaque;
+    uint64_t offset = sector_num * BDRV_SECTOR_SIZE;
+    uint64_t bytes = nb_sectors * BDRV_SECTOR_SIZE;
+
     qemu_co_mutex_lock(&s->lock);
     /* write zeroes could fail if sectors not aligned to cluster, test it with
      * dry_run == true before really updating image */
-    ret = vmdk_write(bs, sector_num, NULL, nb_sectors, true, true);
+    ret = vmdk_pwritev(bs, offset, bytes, NULL, true, true);
     if (!ret) {
-        ret = vmdk_write(bs, sector_num, NULL, nb_sectors, true, false);
+        ret = vmdk_pwritev(bs, offset, bytes, NULL, true, false);
     }
     qemu_co_mutex_unlock(&s->lock);
     return ret;
@@ -2341,7 +2402,7 @@ static BlockDriver bdrv_vmdk = {
     .bdrv_check                   = vmdk_check,
     .bdrv_reopen_prepare          = vmdk_reopen_prepare,
     .bdrv_co_preadv               = vmdk_co_preadv,
-    .bdrv_write                   = vmdk_co_write,
+    .bdrv_co_pwritev              = vmdk_co_pwritev,
     .bdrv_write_compressed        = vmdk_write_compressed,
     .bdrv_co_write_zeroes         = vmdk_co_write_zeroes,
     .bdrv_close                   = vmdk_close,
-- 
1.8.3.1

  parent reply	other threads:[~2016-05-12 14:36 UTC|newest]

Thread overview: 72+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-05-12 14:34 [Qemu-devel] [PULL 00/69] Block layer patches Kevin Wolf
2016-05-12 14:34 ` [Qemu-devel] [PULL 01/69] block: Don't disable I/O throttling on sync requests Kevin Wolf
2016-05-12 14:34 ` [Qemu-devel] [PULL 02/69] block: make bdrv_start_throttled_reqs return void Kevin Wolf
2016-05-12 14:34 ` [Qemu-devel] [PULL 03/69] block: move restarting of throttled reqs to block/throttle-groups.c Kevin Wolf
2016-05-12 14:34 ` [Qemu-devel] [PULL 04/69] block: extract bdrv_drain_poll/bdrv_co_yield_to_drain from bdrv_drain/bdrv_co_drain Kevin Wolf
2016-05-12 14:34 ` [Qemu-devel] [PULL 05/69] block: introduce bdrv_no_throttling_begin/end Kevin Wolf
2016-05-12 14:34 ` [Qemu-devel] [PULL 06/69] block: plug whole tree at once, introduce bdrv_io_unplugged_begin/end Kevin Wolf
2016-05-12 14:34 ` [Qemu-devel] [PULL 07/69] linux-aio: make it more type safe Kevin Wolf
2016-05-12 14:34 ` [Qemu-devel] [PULL 08/69] block: Introduce bdrv_driver_preadv() Kevin Wolf
2016-05-12 14:34 ` [Qemu-devel] [PULL 09/69] block: Introduce bdrv_driver_pwritev() Kevin Wolf
2016-05-12 14:34 ` [Qemu-devel] [PULL 10/69] block: Support AIO drivers in bdrv_driver_preadv/pwritev() Kevin Wolf
2016-05-12 14:34 ` [Qemu-devel] [PULL 11/69] block: Rename bdrv_co_do_preadv/writev to bdrv_co_preadv/writev Kevin Wolf
2016-05-12 14:34 ` [Qemu-devel] [PULL 12/69] block: Introduce .bdrv_co_preadv/pwritev BlockDriver function Kevin Wolf
2016-05-12 14:34 ` [Qemu-devel] [PULL 13/69] bochs: Implement .bdrv_co_preadv() interface Kevin Wolf
2016-05-12 14:34 ` [Qemu-devel] [PULL 14/69] cloop: " Kevin Wolf
2016-05-12 14:34 ` [Qemu-devel] [PULL 15/69] dmg: " Kevin Wolf
2016-05-12 14:34 ` [Qemu-devel] [PULL 16/69] vdi: " Kevin Wolf
2016-05-12 14:34 ` [Qemu-devel] [PULL 17/69] vdi: Implement .bdrv_co_pwritev() interface Kevin Wolf
2016-05-12 14:34 ` [Qemu-devel] [PULL 18/69] vmdk: Add vmdk_find_offset_in_cluster() Kevin Wolf
2016-05-12 14:34 ` [Qemu-devel] [PULL 19/69] vmdk: Implement .bdrv_co_preadv() interface Kevin Wolf
2016-05-12 14:35 ` Kevin Wolf [this message]
2016-05-12 14:35 ` [Qemu-devel] [PULL 21/69] vpc: " Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 22/69] vpc: Implement .bdrv_co_pwritev() interface Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 23/69] vvfat: Implement .bdrv_co_preadv/pwritev interfaces Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 24/69] block: Remove BlockDriver.bdrv_read/write Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 25/69] block: Fix typo in comment Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 26/69] block: always compile-check debug prints Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 27/69] Allow users to specify the vmdk virtual hardware version Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 28/69] qemu-io: Fix memory leak in 'aio_write -z' Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 29/69] block: Allow BDRV_REQ_FUA through blk_pwrite() Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 30/69] block: Switch blk_read_unthrottled() to byte interface Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 31/69] block: Switch blk_*write_zeroes() " Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 32/69] block: Introduce byte-based aio read/write Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 33/69] ide: Switch to byte-based aio block access Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 34/69] scsi-disk: " Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 35/69] virtio: " Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 36/69] xen_disk: " Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 37/69] fdc: Switch to byte-based " Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 38/69] nand: " Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 39/69] onenand: " Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 40/69] pflash: " Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 41/69] sd: " Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 42/69] m25p80: " Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 43/69] atapi: " Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 44/69] nbd: " Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 45/69] qemu-img: " Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 46/69] qemu-io: " Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 47/69] block: Kill unused sector-based blk_* functions Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 48/69] qcow2: improve qcow2_co_write_zeroes() Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 49/69] block: Make supported_write_flags a per-bds property Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 50/69] block: Honor BDRV_REQ_FUA during write_zeroes Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 51/69] nbd: Simplify client FUA handling Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 52/69] block: Invalidate all children Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 53/69] block: Drop superfluous invalidating bs->file from drivers Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 54/69] block: Inactivate all children Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 55/69] iotests: fix the redirection order in 083 Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 56/69] qemu-img: check block status of backing file when converting Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 57/69] Add new block driver interface to add/delete a BDS's child Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 58/69] quorum: implement bdrv_add_child() and bdrv_del_child() Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 59/69] qmp: add monitor command to add/remove a child Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 60/69] qemu-io: Add missing option documentation Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 61/69] qemu-io: Make 'open' subcommand more like command line Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 62/69] qemu-io: Use bool for command line flags Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 63/69] qemu-io: Allow unaligned access by default Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 64/69] qemu-io: Add 'write -f' to test FUA flag Kevin Wolf
2016-05-12 21:23   ` Eric Blake
2016-05-12 14:35 ` [Qemu-devel] [PULL 65/69] qemu-io: Add 'write -z -u' to test MAY_UNMAP flag Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 66/69] block: add support for --image-opts in block I/O tests Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 67/69] block: add support for encryption secrets " Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 68/69] block: enable testing of LUKS driver with " Kevin Wolf
2016-05-12 14:35 ` [Qemu-devel] [PULL 69/69] qemu-iotests: iotests: fail hard if not run via "check" Kevin Wolf
2016-05-12 16:19 ` [Qemu-devel] [PULL 00/69] Block layer patches Peter Maydell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1463063749-2201-21-git-send-email-kwolf@redhat.com \
    --to=kwolf@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.