From 03d72bf76e4b386e5e2e0f85c04bd446ee6b91fa Mon Sep 17 00:00:00 2001 From: Prasanna Kumar Kalever Date: Tue, 5 Mar 2019 16:46:33 +0100 Subject: [PATCH 1/4] gluster: Handle changed glfs_ftruncate signature New versions of Glusters libgfapi.so have an updated glfs_ftruncate() function that returns additional 'struct stat' structures to enable advanced caching of attributes. This is useful for file servers, not so much for QEMU. Nevertheless, the API has changed and needs to be adopted. Signed-off-by: Prasanna Kumar Kalever Signed-off-by: Niels de Vos Signed-off-by: Kevin Wolf (cherry picked from commit e014dbe74e0484188164c61ff6843f8a04a8cb9d) --- block/gluster.c | 4 ++++ configure | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/block/gluster.c b/block/gluster.c index 4fd55a9cc5..dd58567e7e 100644 --- a/block/gluster.c +++ b/block/gluster.c @@ -20,6 +20,10 @@ #include "qemu/option.h" #include "qemu/cutils.h" +#ifdef CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT +# define glfs_ftruncate(fd, offset) glfs_ftruncate(fd, offset, NULL, NULL) +#endif + #define GLUSTER_OPT_FILENAME "filename" #define GLUSTER_OPT_VOLUME "volume" #define GLUSTER_OPT_PATH "path" diff --git a/configure b/configure index 697c0c2cb6..27c55a534f 100755 --- a/configure +++ b/configure @@ -451,6 +451,7 @@ glusterfs_xlator_opt="no" glusterfs_discard="no" glusterfs_fallocate="no" glusterfs_zerofill="no" +glusterfs_ftruncate_has_stat="no" gtk="" gtkabi="" gtk_gl="no" @@ -3947,6 +3948,19 @@ if test "$glusterfs" != "no" ; then glusterfs_fallocate="yes" glusterfs_zerofill="yes" fi + cat > $TMPC << EOF +#include + +int +main(void) +{ + /* new glfs_ftruncate() passes two additional args */ + return glfs_ftruncate(NULL, 0, NULL, NULL); +} +EOF + if compile_prog "$glusterfs_cflags" "$glusterfs_libs" ; then + glusterfs_ftruncate_has_stat="yes" + fi else if test "$glusterfs" = "yes" ; then feature_not_found "GlusterFS backend support" \ @@ -6644,6 +6658,10 @@ if test "$glusterfs_zerofill" = "yes" ; then echo "CONFIG_GLUSTERFS_ZEROFILL=y" >> $config_host_mak fi +if test "$glusterfs_ftruncate_has_stat" = "yes" ; then + echo "CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT=y" >> $config_host_mak +fi + if test "$libssh2" = "yes" ; then echo "CONFIG_LIBSSH2=m" >> $config_host_mak echo "LIBSSH2_CFLAGS=$libssh2_cflags" >> $config_host_mak From 25c5fdaea8fe2ba66be5bb1e69676c91dea42848 Mon Sep 17 00:00:00 2001 From: Niels de Vos Date: Tue, 5 Mar 2019 16:46:34 +0100 Subject: [PATCH 2/4] gluster: the glfs_io_cbk callback function pointer adds pre/post stat args The glfs_*_async() functions do a callback once finished. This callback has changed its arguments, pre- and post-stat structures have been added. This makes it possible to improve caching, which is useful for Samba and NFS-Ganesha, but not so much for QEMU. Gluster 6 is the first release that includes these new arguments. With an additional detection in ./configure, the new arguments can conditionally get included in the glfs_io_cbk handler. Signed-off-by: Niels de Vos Signed-off-by: Kevin Wolf (cherry picked from commit 0e3b891fefacc0e49f3c8ffa3a753b69eb7214d2) --- block/gluster.c | 6 +++++- configure | 24 ++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/block/gluster.c b/block/gluster.c index dd58567e7e..e518de1b0d 100644 --- a/block/gluster.c +++ b/block/gluster.c @@ -729,7 +729,11 @@ static struct glfs *qemu_gluster_init(BlockdevOptionsGluster *gconf, /* * AIO callback routine called from GlusterFS thread. */ -static void gluster_finish_aiocb(struct glfs_fd *fd, ssize_t ret, void *arg) +static void gluster_finish_aiocb(struct glfs_fd *fd, ssize_t ret, +#ifdef CONFIG_GLUSTERFS_IOCB_HAS_STAT + struct glfs_stat *pre, struct glfs_stat *post, +#endif + void *arg) { GlusterAIOCB *acb = (GlusterAIOCB *)arg; diff --git a/configure b/configure index 27c55a534f..573e8240c1 100755 --- a/configure +++ b/configure @@ -452,6 +452,7 @@ glusterfs_discard="no" glusterfs_fallocate="no" glusterfs_zerofill="no" glusterfs_ftruncate_has_stat="no" +glusterfs_iocb_has_stat="no" gtk="" gtkabi="" gtk_gl="no" @@ -3961,6 +3962,25 @@ EOF if compile_prog "$glusterfs_cflags" "$glusterfs_libs" ; then glusterfs_ftruncate_has_stat="yes" fi + cat > $TMPC << EOF +#include + +/* new glfs_io_cbk() passes two additional glfs_stat structs */ +static void +glusterfs_iocb(glfs_fd_t *fd, ssize_t ret, struct glfs_stat *prestat, struct glfs_stat *poststat, void *data) +{} + +int +main(void) +{ + glfs_io_cbk iocb = &glusterfs_iocb; + iocb(NULL, 0 , NULL, NULL, NULL); + return 0; +} +EOF + if compile_prog "$glusterfs_cflags" "$glusterfs_libs" ; then + glusterfs_iocb_has_stat="yes" + fi else if test "$glusterfs" = "yes" ; then feature_not_found "GlusterFS backend support" \ @@ -6662,6 +6682,10 @@ if test "$glusterfs_ftruncate_has_stat" = "yes" ; then echo "CONFIG_GLUSTERFS_FTRUNCATE_HAS_STAT=y" >> $config_host_mak fi +if test "$glusterfs_iocb_has_stat" = "yes" ; then + echo "CONFIG_GLUSTERFS_IOCB_HAS_STAT=y" >> $config_host_mak +fi + if test "$libssh2" = "yes" ; then echo "CONFIG_LIBSSH2=m" >> $config_host_mak echo "LIBSSH2_CFLAGS=$libssh2_cflags" >> $config_host_mak From b1da8f239aa539c8f167ef93437376cbf395dd00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= Date: Wed, 20 Mar 2019 16:18:41 +0000 Subject: [PATCH 3/4] linux-user: assume __NR_gettid always exists MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The gettid syscall was introduced in Linux 2.4.11. This is old enough that we can assume it always exists and thus not bother with the conditional backcompat logic. Signed-off-by: Daniel P. Berrangé Reviewed-by: Richard Henderson Reviewed-by: Laurent Vivier Message-Id: <20190320161842.13908-2-berrange@redhat.com> Signed-off-by: Laurent Vivier (cherry picked from commit 184943d827ce09375284e6fbb9fd5eeb9e369529) --- linux-user/syscall.c | 8 -------- 1 file changed, 8 deletions(-) diff --git a/linux-user/syscall.c b/linux-user/syscall.c index dfc851cc35..68d6ccb27f 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -250,15 +250,7 @@ static type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5, \ #define TARGET_NR__llseek TARGET_NR_llseek #endif -#ifdef __NR_gettid _syscall0(int, gettid) -#else -/* This is a replacement for the host gettid() and must return a host - errno. */ -static int gettid(void) { - return -ENOSYS; -} -#endif /* For the 64-bit guest on 32-bit host case we must emulate * getdents using getdents64, because otherwise the host From 6a30ab09a0a14c5e3ccb0e77654aba36e6935f6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= Date: Wed, 20 Mar 2019 16:18:42 +0000 Subject: [PATCH 4/4] linux-user: rename gettid() to sys_gettid() to avoid clash with glibc MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The glibc-2.29.9000-6.fc31.x86_64 package finally includes the gettid() function as part of unistd.h when __USE_GNU is defined. This clashes with linux-user code which unconditionally defines this function name itself. /home/berrange/src/virt/qemu/linux-user/syscall.c:253:16: error: static declaration of ‘gettid’ follows non-static declaration 253 | _syscall0(int, gettid) | ^~~~~~ /home/berrange/src/virt/qemu/linux-user/syscall.c:184:13: note: in definition of macro ‘_syscall0’ 184 | static type name (void) \ | ^~~~ In file included from /usr/include/unistd.h:1170, from /home/berrange/src/virt/qemu/include/qemu/osdep.h:107, from /home/berrange/src/virt/qemu/linux-user/syscall.c:20: /usr/include/bits/unistd_ext.h:34:16: note: previous declaration of ‘gettid’ was here 34 | extern __pid_t gettid (void) __THROW; | ^~~~~~ CC aarch64-linux-user/linux-user/signal.o make[1]: *** [/home/berrange/src/virt/qemu/rules.mak:69: linux-user/syscall.o] Error 1 make[1]: *** Waiting for unfinished jobs.... make: *** [Makefile:449: subdir-aarch64-linux-user] Error 2 While we could make our definition conditional and rely on glibc's impl, this patch simply renames our definition to sys_gettid() which is a common pattern in this file. Signed-off-by: Daniel P. Berrangé Reviewed-by: Richard Henderson Reviewed-by: Laurent Vivier Message-Id: <20190320161842.13908-3-berrange@redhat.com> Signed-off-by: Laurent Vivier (cherry picked from commit 71ba74f67eaca21b0cc9d96f534ad3b9a7161400) --- linux-user/syscall.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/linux-user/syscall.c b/linux-user/syscall.c index 68d6ccb27f..d0c9c08ab7 100644 --- a/linux-user/syscall.c +++ b/linux-user/syscall.c @@ -250,7 +250,8 @@ static type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5, \ #define TARGET_NR__llseek TARGET_NR_llseek #endif -_syscall0(int, gettid) +#define __NR_sys_gettid __NR_gettid +_syscall0(int, sys_gettid) /* For the 64-bit guest on 32-bit host case we must emulate * getdents using getdents64, because otherwise the host @@ -6376,7 +6377,7 @@ static void *clone_func(void *arg) cpu = ENV_GET_CPU(env); thread_cpu = cpu; ts = (TaskState *)cpu->opaque; - info->tid = gettid(); + info->tid = sys_gettid(); task_settid(ts); if (info->child_tidptr) put_user_u32(info->tid, info->child_tidptr); @@ -6521,9 +6522,9 @@ static int do_fork(CPUArchState *env, unsigned int flags, abi_ulong newsp, mapping. We can't repeat the spinlock hack used above because the child process gets its own copy of the lock. */ if (flags & CLONE_CHILD_SETTID) - put_user_u32(gettid(), child_tidptr); + put_user_u32(sys_gettid(), child_tidptr); if (flags & CLONE_PARENT_SETTID) - put_user_u32(gettid(), parent_tidptr); + put_user_u32(sys_gettid(), parent_tidptr); ts = (TaskState *)cpu->opaque; if (flags & CLONE_SETTLS) cpu_set_tls (env, newtls); @@ -11795,7 +11796,7 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1, break; #endif case TARGET_NR_gettid: - ret = get_errno(gettid()); + ret = get_errno(sys_gettid()); break; #ifdef TARGET_NR_readahead case TARGET_NR_readahead: