From: Jeff Cody <jcody@redhat.com>
To: Niels de Vos <ndevos@redhat.com>
Cc: Kevin Wolf <kwolf@redhat.com>,
qemu-block@nongnu.org, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH v2] gluster: add support for PREALLOC_MODE_FALLOC
Date: Thu, 18 May 2017 13:54:36 -0400 [thread overview]
Message-ID: <20170518175436.GF6761@localhost.localdomain> (raw)
In-Reply-To: <20170518095422.12555-1-ndevos@redhat.com>
On Thu, May 18, 2017 at 11:54:22AM +0200, Niels de Vos wrote:
> Add missing support for "preallocation=falloc" to the Gluster block
> driver. This change bases its logic on that of block/file-posix.c and
> removed the gluster_supports_zerofill() and qemu_gluster_zerofill()
> functiond in favour of #ifdef checks in an easy to read
> switch-statement.
>
> Both glfs_zerofill() and glfs_fallocate() have been introduced with
> GlusterFS 3.5.0 (pkg-config glusterfs-api = 6). A #define for the
> availability of glfs_fallocate() has been added to ./configure.
>
> Reported-by: Satheesaran Sundaramoorthi <sasundar@redhat.com>
> URL: https://bugzilla.redhat.com/1450759
> Signed-off-by: Niels de Vos <ndevos@redhat.com>
> ---
> v2 changes requested by Jeff Cody:
> - add CONFIG_GLUSTERFS_FALLOCATE
> - remove unneeded wrapper qemu_gluster_zerofill()
>
> block/gluster.c | 76 ++++++++++++++++++++++++++++++---------------------------
> configure | 6 +++++
> 2 files changed, 46 insertions(+), 36 deletions(-)
>
> diff --git a/block/gluster.c b/block/gluster.c
> index 7c76cd0..0610183 100644
> --- a/block/gluster.c
> +++ b/block/gluster.c
> @@ -964,29 +964,6 @@ static coroutine_fn int qemu_gluster_co_pwrite_zeroes(BlockDriverState *bs,
> qemu_coroutine_yield();
> return acb.ret;
> }
> -
> -static inline bool gluster_supports_zerofill(void)
> -{
> - return 1;
> -}
> -
> -static inline int qemu_gluster_zerofill(struct glfs_fd *fd, int64_t offset,
> - int64_t size)
> -{
> - return glfs_zerofill(fd, offset, size);
> -}
> -
> -#else
> -static inline bool gluster_supports_zerofill(void)
> -{
> - return 0;
> -}
> -
> -static inline int qemu_gluster_zerofill(struct glfs_fd *fd, int64_t offset,
> - int64_t size)
> -{
> - return 0;
> -}
> #endif
>
> static int qemu_gluster_create(const char *filename,
> @@ -996,9 +973,10 @@ static int qemu_gluster_create(const char *filename,
> struct glfs *glfs;
> struct glfs_fd *fd;
> int ret = 0;
> - int prealloc = 0;
> + PreallocMode prealloc;
> int64_t total_size = 0;
> char *tmp = NULL;
> + Error *local_err = NULL;
>
> gconf = g_new0(BlockdevOptionsGluster, 1);
> gconf->debug = qemu_opt_get_number_del(opts, GLUSTER_OPT_DEBUG,
> @@ -1026,13 +1004,12 @@ static int qemu_gluster_create(const char *filename,
> BDRV_SECTOR_SIZE);
>
> tmp = qemu_opt_get_del(opts, BLOCK_OPT_PREALLOC);
> - if (!tmp || !strcmp(tmp, "off")) {
> - prealloc = 0;
> - } else if (!strcmp(tmp, "full") && gluster_supports_zerofill()) {
> - prealloc = 1;
> - } else {
> - error_setg(errp, "Invalid preallocation mode: '%s'"
> - " or GlusterFS doesn't support zerofill API", tmp);
> + prealloc = qapi_enum_parse(PreallocMode_lookup, tmp,
> + PREALLOC_MODE__MAX, PREALLOC_MODE_OFF,
> + &local_err);
> + g_free(tmp);
> + if (local_err) {
> + error_propagate(errp, local_err);
> ret = -EINVAL;
> goto out;
> }
> @@ -1041,21 +1018,48 @@ static int qemu_gluster_create(const char *filename,
> O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, S_IRUSR | S_IWUSR);
> if (!fd) {
> ret = -errno;
> - } else {
> + goto out;
> + }
> +
> + switch (prealloc) {
> +#ifdef CONFIG_GLUSTERFS_FALLOCATE
> + case PREALLOC_MODE_FALLOC:
> + if (!glfs_fallocate(fd, 0, 0, total_size)) {
Does glfs_fallocate() return 0 on failure? Both posix and linux versions of
fallocate() return 0 on success.
> + error_setg(errp, "Could not preallocate data for the new file");
> + ret = -errno;
> + }
> + break;
> +#endif /* CONFIG_GLUSTERFS_FALLOCATE */
> +#ifdef CONFIG_GLUSTERFS_ZEROFILL
> + case PREALLOC_MODE_FULL:
> if (!glfs_ftruncate(fd, total_size)) {
> - if (prealloc && qemu_gluster_zerofill(fd, 0, total_size)) {
> + if (glfs_zerofill(fd, 0, total_size)) {
> + error_setg(errp, "Could not zerofill the new file");
> ret = -errno;
> }
> } else {
> + error_setg(errp, "Could not resize file");
> ret = -errno;
> }
> -
> - if (glfs_close(fd) != 0) {
> + break;
> +#endif /* CONFIG_GLUSTERFS_ZEROFILL */
> + case PREALLOC_MODE_OFF:
> + if (glfs_ftruncate(fd, total_size) != 0) {
> ret = -errno;
> + error_setg(errp, "Could not resize file");
> }
> + break;
> + default:
> + ret = -EINVAL;
> + error_setg(errp, "Unsupported preallocation mode: %s",
> + PreallocMode_lookup[prealloc]);
> + break;
> + }
> +
> + if (glfs_close(fd) != 0) {
> + ret = -errno;
> }
> out:
> - g_free(tmp);
> qapi_free_BlockdevOptionsGluster(gconf);
> glfs_clear_preopened(glfs);
> return ret;
> diff --git a/configure b/configure
> index 7c020c0..8b8291e 100755
> --- a/configure
> +++ b/configure
> @@ -300,6 +300,7 @@ seccomp=""
> glusterfs=""
> glusterfs_xlator_opt="no"
> glusterfs_discard="no"
> +glusterfs_fallocate="no"
> glusterfs_zerofill="no"
> gtk=""
> gtkabi=""
> @@ -3576,6 +3577,7 @@ if test "$glusterfs" != "no" ; then
> glusterfs_discard="yes"
> fi
> if $pkg_config --atleast-version=6 glusterfs-api; then
> + glusterfs_fallocate="yes"
> glusterfs_zerofill="yes"
> fi
> else
> @@ -5780,6 +5782,10 @@ if test "$glusterfs_discard" = "yes" ; then
> echo "CONFIG_GLUSTERFS_DISCARD=y" >> $config_host_mak
> fi
>
> +if test "$glusterfs_fallocate" = "yes" ; then
> + echo "CONFIG_GLUSTERFS_FALLOCATE=y" >> $config_host_mak
> +fi
> +
> if test "$glusterfs_zerofill" = "yes" ; then
> echo "CONFIG_GLUSTERFS_ZEROFILL=y" >> $config_host_mak
> fi
> --
> 2.9.3
>
next prev parent reply other threads:[~2017-05-18 17:54 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-05-15 19:11 [Qemu-devel] [PATCH] gluster: add support for PREALLOC_MODE_FALLOC Niels de Vos
2017-05-16 15:42 ` Jeff Cody
2017-05-17 12:35 ` Niels de Vos
2017-05-18 9:54 ` [Qemu-devel] [PATCH v2] " Niels de Vos
2017-05-18 14:30 ` Eric Blake
2017-05-18 15:21 ` Niels de Vos
2017-05-18 17:54 ` Jeff Cody [this message]
2017-05-18 19:21 ` Niels de Vos
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=20170518175436.GF6761@localhost.localdomain \
--to=jcody@redhat.com \
--cc=kwolf@redhat.com \
--cc=ndevos@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.