From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36072) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Wiq5i-0008ME-GS for qemu-devel@nongnu.org; Fri, 09 May 2014 15:04:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Wiq5c-0005tg-Cw for qemu-devel@nongnu.org; Fri, 09 May 2014 15:04:18 -0400 Received: from mx1.redhat.com ([209.132.183.28]:25222) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Wiq5c-0005ta-4S for qemu-devel@nongnu.org; Fri, 09 May 2014 15:04:12 -0400 From: Stefan Hajnoczi Date: Fri, 9 May 2014 21:03:32 +0200 Message-Id: <1399662217-31148-13-git-send-email-stefanha@redhat.com> In-Reply-To: <1399662217-31148-1-git-send-email-stefanha@redhat.com> References: <1399662217-31148-1-git-send-email-stefanha@redhat.com> Subject: [Qemu-devel] [PULL 12/17] gluster: Correctly propagate errors when volume isn't accessible List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Peter Maydell , Peter Krempa , Stefan Hajnoczi From: Peter Krempa The docs for glfs_init suggest that the function sets errno on every failure. In fact it doesn't. As other functions such as qemu_gluster_open() in the gluster block code report their errors based on this fact we need to make sure that errno is set on each failure. This fixes a crash of qemu-img/qemu when a gluster brick isn't accessible from given host while the server serving the volume description is. Thread 1 (Thread 0x7ffff7fba740 (LWP 203880)): #0 0x00007ffff77673f8 in glfs_lseek () from /usr/lib64/libgfapi.so.0 #1 0x0000555555574a68 in qemu_gluster_getlength () #2 0x0000555555565742 in refresh_total_sectors () #3 0x000055555556914f in bdrv_open_common () #4 0x000055555556e8e8 in bdrv_open () #5 0x000055555556f02f in bdrv_open_image () #6 0x000055555556e5f6 in bdrv_open () #7 0x00005555555c5775 in bdrv_new_open () #8 0x00005555555c5b91 in img_info () #9 0x00007ffff62c9c05 in __libc_start_main () from /lib64/libc.so.6 #10 0x00005555555648ad in _start () Signed-off-by: Stefan Hajnoczi --- block/gluster.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/block/gluster.c b/block/gluster.c index 8836085..d0726ec 100644 --- a/block/gluster.c +++ b/block/gluster.c @@ -207,6 +207,11 @@ static struct glfs *qemu_gluster_init(GlusterConf *gconf, const char *filename, "volume=%s image=%s transport=%s", gconf->server, gconf->port, gconf->volname, gconf->image, gconf->transport); + + /* glfs_init sometimes doesn't set errno although docs suggest that */ + if (errno == 0) + errno = EINVAL; + goto out; } return glfs; @@ -482,7 +487,7 @@ static int qemu_gluster_create(const char *filename, glfs = qemu_gluster_init(gconf, filename, errp); if (!glfs) { - ret = -EINVAL; + ret = -errno; goto out; } -- 1.9.0