[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 07/42] gluster: Implement .bdrv_co_write_zeroes for g
From: |
Kevin Wolf |
Subject: |
[Qemu-devel] [PULL 07/42] gluster: Implement .bdrv_co_write_zeroes for gluster |
Date: |
Wed, 15 Jan 2014 11:22:20 +0100 |
From: Bharata B Rao <address@hidden>
Support .bdrv_co_write_zeroes() from gluster driver by using GlusterFS API
glfs_zerofill() that off-loads the writing of zeroes to GlusterFS server.
Signed-off-by: Bharata B Rao <address@hidden>
Signed-off-by: Stefan Hajnoczi <address@hidden>
Signed-off-by: Kevin Wolf <address@hidden>
---
block/gluster.c | 79 +++++++++++++++++++++++++++++++++++++++++++--------------
configure | 8 ++++++
2 files changed, 68 insertions(+), 19 deletions(-)
diff --git a/block/gluster.c b/block/gluster.c
index f9aea0e..c11f60c 100644
--- a/block/gluster.c
+++ b/block/gluster.c
@@ -236,6 +236,25 @@ static void qemu_gluster_complete_aio(void *opaque)
qemu_coroutine_enter(acb->coroutine, NULL);
}
+/*
+ * AIO callback routine called from GlusterFS thread.
+ */
+static void gluster_finish_aiocb(struct glfs_fd *fd, ssize_t ret, void *arg)
+{
+ GlusterAIOCB *acb = (GlusterAIOCB *)arg;
+
+ if (!ret || ret == acb->size) {
+ acb->ret = 0; /* Success */
+ } else if (ret < 0) {
+ acb->ret = ret; /* Read/Write failed */
+ } else {
+ acb->ret = -EIO; /* Partial read/write - fail it */
+ }
+
+ acb->bh = qemu_bh_new(qemu_gluster_complete_aio, acb);
+ qemu_bh_schedule(acb->bh);
+}
+
/* TODO Convert to fine grained options */
static QemuOptsList runtime_opts = {
.name = "gluster",
@@ -308,6 +327,35 @@ out:
return ret;
}
+#ifdef CONFIG_GLUSTERFS_ZEROFILL
+static coroutine_fn int qemu_gluster_co_write_zeroes(BlockDriverState *bs,
+ int64_t sector_num, int nb_sectors, BdrvRequestFlags flags)
+{
+ int ret;
+ GlusterAIOCB *acb = g_slice_new(GlusterAIOCB);
+ BDRVGlusterState *s = bs->opaque;
+ off_t size = nb_sectors * BDRV_SECTOR_SIZE;
+ off_t offset = sector_num * BDRV_SECTOR_SIZE;
+
+ acb->size = size;
+ acb->ret = 0;
+ acb->coroutine = qemu_coroutine_self();
+
+ ret = glfs_zerofill_async(s->fd, offset, size, &gluster_finish_aiocb, acb);
+ if (ret < 0) {
+ ret = -errno;
+ goto out;
+ }
+
+ qemu_coroutine_yield();
+ ret = acb->ret;
+
+out:
+ g_slice_free(GlusterAIOCB, acb);
+ return ret;
+}
+#endif
+
static int qemu_gluster_create(const char *filename,
QEMUOptionParameter *options, Error **errp)
{
@@ -350,25 +398,6 @@ out:
return ret;
}
-/*
- * AIO callback routine called from GlusterFS thread.
- */
-static void gluster_finish_aiocb(struct glfs_fd *fd, ssize_t ret, void *arg)
-{
- GlusterAIOCB *acb = (GlusterAIOCB *)arg;
-
- if (!ret || ret == acb->size) {
- acb->ret = 0; /* Success */
- } else if (ret < 0) {
- acb->ret = ret; /* Read/Write failed */
- } else {
- acb->ret = -EIO; /* Partial read/write - fail it */
- }
-
- acb->bh = qemu_bh_new(qemu_gluster_complete_aio, acb);
- qemu_bh_schedule(acb->bh);
-}
-
static coroutine_fn int qemu_gluster_co_rw(BlockDriverState *bs,
int64_t sector_num, int nb_sectors, QEMUIOVector *qiov, int write)
{
@@ -552,6 +581,9 @@ static BlockDriver bdrv_gluster = {
#ifdef CONFIG_GLUSTERFS_DISCARD
.bdrv_co_discard = qemu_gluster_co_discard,
#endif
+#ifdef CONFIG_GLUSTERFS_ZEROFILL
+ .bdrv_co_write_zeroes = qemu_gluster_co_write_zeroes,
+#endif
.create_options = qemu_gluster_create_options,
};
@@ -573,6 +605,9 @@ static BlockDriver bdrv_gluster_tcp = {
#ifdef CONFIG_GLUSTERFS_DISCARD
.bdrv_co_discard = qemu_gluster_co_discard,
#endif
+#ifdef CONFIG_GLUSTERFS_ZEROFILL
+ .bdrv_co_write_zeroes = qemu_gluster_co_write_zeroes,
+#endif
.create_options = qemu_gluster_create_options,
};
@@ -594,6 +629,9 @@ static BlockDriver bdrv_gluster_unix = {
#ifdef CONFIG_GLUSTERFS_DISCARD
.bdrv_co_discard = qemu_gluster_co_discard,
#endif
+#ifdef CONFIG_GLUSTERFS_ZEROFILL
+ .bdrv_co_write_zeroes = qemu_gluster_co_write_zeroes,
+#endif
.create_options = qemu_gluster_create_options,
};
@@ -615,6 +653,9 @@ static BlockDriver bdrv_gluster_rdma = {
#ifdef CONFIG_GLUSTERFS_DISCARD
.bdrv_co_discard = qemu_gluster_co_discard,
#endif
+#ifdef CONFIG_GLUSTERFS_ZEROFILL
+ .bdrv_co_write_zeroes = qemu_gluster_co_write_zeroes,
+#endif
.create_options = qemu_gluster_create_options,
};
diff --git a/configure b/configure
index 3782a6a..b472694 100755
--- a/configure
+++ b/configure
@@ -256,6 +256,7 @@ coroutine_pool=""
seccomp=""
glusterfs=""
glusterfs_discard="no"
+glusterfs_zerofill="no"
virtio_blk_data_plane=""
gtk=""
gtkabi="2.0"
@@ -2701,6 +2702,9 @@ if test "$glusterfs" != "no" ; then
if $pkg_config --atleast-version=5 glusterfs-api; then
glusterfs_discard="yes"
fi
+ if $pkg_config --atleast-version=6 glusterfs-api; then
+ glusterfs_zerofill="yes"
+ fi
else
if test "$glusterfs" = "yes" ; then
feature_not_found "GlusterFS backend support"
@@ -4229,6 +4233,10 @@ if test "$glusterfs_discard" = "yes" ; then
echo "CONFIG_GLUSTERFS_DISCARD=y" >> $config_host_mak
fi
+if test "$glusterfs_zerofill" = "yes" ; then
+ echo "CONFIG_GLUSTERFS_ZEROFILL=y" >> $config_host_mak
+fi
+
if test "$libssh2" = "yes" ; then
echo "CONFIG_LIBSSH2=y" >> $config_host_mak
fi
--
1.8.1.4
- [Qemu-devel] [PULL 00/42] Block patches, Kevin Wolf, 2014/01/15
- [Qemu-devel] [PULL 01/42] rbd: switch from pipe to QEMUBH completion notification, Kevin Wolf, 2014/01/15
- [Qemu-devel] [PULL 05/42] block/iscsi: return -ENOMEM if an async call fails immediately, Kevin Wolf, 2014/01/15
- [Qemu-devel] [PULL 02/42] qemu-iotests: Introduce _unsupported_imgopts, Kevin Wolf, 2014/01/15
- [Qemu-devel] [PULL 03/42] qemu-iotests: Add _unsupported_imgopts for vmdk subformats, Kevin Wolf, 2014/01/15
- [Qemu-devel] [PULL 04/42] qemu-iotests: Clean up all extents for vmdk, Kevin Wolf, 2014/01/15
- [Qemu-devel] [PULL 06/42] gluster: Convert aio routines into coroutines, Kevin Wolf, 2014/01/15
- [Qemu-devel] [PULL 09/42] sheepdog: fix clone operation by 'qemu-img create -b', Kevin Wolf, 2014/01/15
- [Qemu-devel] [PULL 07/42] gluster: Implement .bdrv_co_write_zeroes for gluster,
Kevin Wolf <=
- [Qemu-devel] [PULL 11/42] docs: qcow2 compat=1.1 is now the default, Kevin Wolf, 2014/01/15
- [Qemu-devel] [PULL 13/42] readline: decouple readline from the monitor, Kevin Wolf, 2014/01/15
- [Qemu-devel] [PULL 08/42] gluster: Add support for creating zero-filled image, Kevin Wolf, 2014/01/15
- [Qemu-devel] [PULL 12/42] vmdk: Fix big flat extent IO, Kevin Wolf, 2014/01/15
- [Qemu-devel] [PULL 15/42] osdep: add qemu_set_tty_echo(), Kevin Wolf, 2014/01/15
- [Qemu-devel] [PULL 10/42] qtest: Fix the bug about disable vnc causes "make check" fail, Kevin Wolf, 2014/01/15