From nobody Thu Jul 10 00:29:36 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1496318594159384.32220845487086; Thu, 1 Jun 2017 05:03:14 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 2393941A29; Thu, 1 Jun 2017 12:03:12 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id EE1827FE80; Thu, 1 Jun 2017 12:03:11 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 72DF53944; Thu, 1 Jun 2017 12:02:45 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v51C2hMr021396 for ; Thu, 1 Jun 2017 08:02:43 -0400 Received: by smtp.corp.redhat.com (Postfix) id 9C4241754B; Thu, 1 Jun 2017 12:02:43 +0000 (UTC) Received: from moe.brq.redhat.com (dhcp129-131.brq.redhat.com [10.34.129.131]) by smtp.corp.redhat.com (Postfix) with ESMTP id 22E831755E for ; Thu, 1 Jun 2017 12:02:41 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 2393941A29 Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=libvir-list-bounces@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 2393941A29 From: Michal Privoznik To: libvir-list@redhat.com Date: Thu, 1 Jun 2017 14:02:13 +0200 Message-Id: <97b1f939cdb065e71a2417bad23df4e7f5a5b761.1496318427.git.mprivozn@redhat.com> In-Reply-To: References: In-Reply-To: References: X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v2 5/6] virsh: Report errors from stream callbacks X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Thu, 01 Jun 2017 12:03:12 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" There are couple of callbacks we pass to virStreamSendAll(), virStreamRecvAll() or its sparse variants. However, none of these callbacks reports error if one occurs and neither do the virStream* functions leaving user with very unhelpful error message: error: cannot receive data from volume fedora.img error: An error occurred, but the cause is unknown Signed-off-by: Michal Privoznik --- tools/virsh-util.c | 38 +++++++++++++++++++++++++++++--------- tools/virsh-util.h | 2 +- tools/virsh-volume.c | 8 ++++++-- 3 files changed, 36 insertions(+), 12 deletions(-) diff --git a/tools/virsh-util.c b/tools/virsh-util.c index 44be3ad64..183f4c8bb 100644 --- a/tools/virsh-util.c +++ b/tools/virsh-util.c @@ -147,9 +147,15 @@ virshStreamSink(virStreamPtr st ATTRIBUTE_UNUSED, size_t nbytes, void *opaque) { - int *fd =3D opaque; + virshStreamCallbackDataPtr cbData =3D opaque; + int fd =3D cbData->fd; + const char *filename =3D cbData->filename; + int ret; =20 - return safewrite(*fd, bytes, nbytes); + if ((ret =3D safewrite(fd, bytes, nbytes)) < 0) + virReportSystemError(errno, _("unable to write to %s"), filename); + + return ret; } =20 =20 @@ -161,8 +167,13 @@ virshStreamSource(virStreamPtr st ATTRIBUTE_UNUSED, { virshStreamCallbackDataPtr cbData =3D opaque; int fd =3D cbData->fd; + const char *filename =3D cbData->filename; + int ret; =20 - return saferead(fd, bytes, nbytes); + if ((ret =3D saferead(fd, bytes, nbytes)) < 0) + virReportSystemError(errno, _("unable to read from %s"), filename); + + return ret; } =20 =20 @@ -173,10 +184,13 @@ virshStreamSourceSkip(virStreamPtr st ATTRIBUTE_UNUSE= D, { virshStreamCallbackDataPtr cbData =3D opaque; int fd =3D cbData->fd; + const char *filename =3D cbData->filename; off_t cur; =20 - if ((cur =3D lseek(fd, offset, SEEK_CUR)) =3D=3D (off_t) -1) + if ((cur =3D lseek(fd, offset, SEEK_CUR)) =3D=3D (off_t) -1) { + virReportSystemError(errno, _("unable to seek in %s"), filename); return -1; + } =20 return 0; } @@ -187,14 +201,20 @@ virshStreamSkip(virStreamPtr st ATTRIBUTE_UNUSED, long long offset, void *opaque) { - int *fd =3D opaque; + virshStreamCallbackDataPtr cbData =3D opaque; + int fd =3D cbData->fd; + const char *filename =3D cbData->filename; off_t cur; =20 - if ((cur =3D lseek(*fd, offset, SEEK_CUR)) =3D=3D (off_t) -1) + if ((cur =3D lseek(fd, offset, SEEK_CUR)) =3D=3D (off_t) -1) { + virReportSystemError(errno, _("unable to seek in %s"), filename); return -1; + } =20 - if (ftruncate(*fd, cur) < 0) + if (ftruncate(fd, cur) < 0) { + virReportSystemError(errno, _("unable to truncate %s"), filename); return -1; + } =20 return 0; } @@ -207,12 +227,12 @@ virshStreamInData(virStreamPtr st ATTRIBUTE_UNUSED, void *opaque) { virshStreamCallbackDataPtr cbData =3D opaque; - vshControl *ctl =3D cbData->ctl; int fd =3D cbData->fd; + const char *filename =3D cbData->filename; int ret; =20 if ((ret =3D virFileInData(fd, inData, offset)) < 0) - vshError(ctl, "%s", _("Unable to get current position in stream")); + virReportSystemError(errno, _("unable to seek in %s"), filename); =20 return ret; } diff --git a/tools/virsh-util.h b/tools/virsh-util.h index 9a0af3513..0babb311b 100644 --- a/tools/virsh-util.h +++ b/tools/virsh-util.h @@ -60,8 +60,8 @@ virshStreamSink(virStreamPtr st, typedef struct _virshStreamCallbackData virshStreamCallbackData; typedef virshStreamCallbackData *virshStreamCallbackDataPtr; struct _virshStreamCallbackData { - vshControl *ctl; int fd; + const char *filename; }; =20 int diff --git a/tools/virsh-volume.c b/tools/virsh-volume.c index 0736bdcdb..ea4660fee 100644 --- a/tools/virsh-volume.c +++ b/tools/virsh-volume.c @@ -698,8 +698,8 @@ cmdVolUpload(vshControl *ctl, const vshCmd *cmd) goto cleanup; } =20 - cbData.ctl =3D ctl; cbData.fd =3D fd; + cbData.filename =3D file; =20 if (vshCommandOptBool(cmd, "sparse")) flags |=3D VIR_STORAGE_VOL_UPLOAD_SPARSE_STREAM; @@ -795,6 +795,7 @@ cmdVolDownload(vshControl *ctl, const vshCmd *cmd) bool created =3D false; virshControlPtr priv =3D ctl->privData; unsigned int flags =3D 0; + virshStreamCallbackData cbData; =20 if (vshCommandOptULongLong(ctl, cmd, "offset", &offset) < 0) return false; @@ -821,6 +822,9 @@ cmdVolDownload(vshControl *ctl, const vshCmd *cmd) created =3D true; } =20 + cbData.fd =3D fd; + cbData.filename =3D file; + if (!(st =3D virStreamNew(priv->conn, 0))) { vshError(ctl, _("cannot create a new stream")); goto cleanup; @@ -831,7 +835,7 @@ cmdVolDownload(vshControl *ctl, const vshCmd *cmd) goto cleanup; } =20 - if (virStreamSparseRecvAll(st, virshStreamSink, virshStreamSkip, &fd) = < 0) { + if (virStreamSparseRecvAll(st, virshStreamSink, virshStreamSkip, &cbDa= ta) < 0) { vshError(ctl, _("cannot receive data from volume %s"), name); goto cleanup; } --=20 2.13.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list