From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:54179) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RJKTC-0007bv-AU for qemu-devel@nongnu.org; Thu, 27 Oct 2011 03:33:47 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RJKTB-0001Gw-1l for qemu-devel@nongnu.org; Thu, 27 Oct 2011 03:33:46 -0400 Received: from lo.gmane.org ([80.91.229.12]:33551) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RJKTA-0001Gp-O1 for qemu-devel@nongnu.org; Thu, 27 Oct 2011 03:33:45 -0400 Received: from list by lo.gmane.org with local (Exim 4.69) (envelope-from ) id 1RJKT8-0006TB-5x for qemu-devel@nongnu.org; Thu, 27 Oct 2011 09:33:42 +0200 Received: from 93-34-199-98.ip51.fastwebnet.it ([93.34.199.98]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Thu, 27 Oct 2011 09:33:42 +0200 Received: from pbonzini by 93-34-199-98.ip51.fastwebnet.it with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Thu, 27 Oct 2011 09:33:42 +0200 From: Paolo Bonzini Date: Thu, 27 Oct 2011 09:33:25 +0200 Message-ID: References: <1319632282-22725-1-git-send-email-kwolf@redhat.com> <1319632282-22725-4-git-send-email-kwolf@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit In-Reply-To: <1319632282-22725-4-git-send-email-kwolf@redhat.com> Subject: Re: [Qemu-devel] [PATCH 3/7] qcow: Fix bdrv_write_compressed error handling List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org On 10/26/2011 02:31 PM, Kevin Wolf wrote: > Signed-off-by: Kevin Wolf > --- > block/qcow.c | 30 +++++++++++++++++++----------- > 1 files changed, 19 insertions(+), 11 deletions(-) > > diff --git a/block/qcow.c b/block/qcow.c > index ab36b29..35e21eb 100644 > --- a/block/qcow.c > +++ b/block/qcow.c > @@ -736,8 +736,6 @@ static int qcow_write_compressed(BlockDriverState *bs, int64_t sector_num, > return -EINVAL; > > out_buf = g_malloc(s->cluster_size + (s->cluster_size / 1000) + 128); > - if (!out_buf) > - return -1; > > /* best compression, small window, no zlib header */ > memset(&strm, 0, sizeof(strm)); > @@ -745,8 +743,8 @@ static int qcow_write_compressed(BlockDriverState *bs, int64_t sector_num, > Z_DEFLATED, -12, > 9, Z_DEFAULT_STRATEGY); > if (ret != 0) { > - g_free(out_buf); > - return -1; > + ret = -EINVAL; > + goto fail; > } > > strm.avail_in = s->cluster_size; > @@ -756,9 +754,9 @@ static int qcow_write_compressed(BlockDriverState *bs, int64_t sector_num, > > ret = deflate(&strm, Z_FINISH); > if (ret != Z_STREAM_END&& ret != Z_OK) { > - g_free(out_buf); > deflateEnd(&strm); > - return -1; > + ret = -EINVAL; > + goto fail; > } > out_len = strm.next_out - out_buf; > > @@ -766,19 +764,29 @@ static int qcow_write_compressed(BlockDriverState *bs, int64_t sector_num, > > if (ret != Z_STREAM_END || out_len>= s->cluster_size) { > /* could not compress: write normal cluster */ > - bdrv_write(bs, sector_num, buf, s->cluster_sectors); > + ret = bdrv_write(bs, sector_num, buf, s->cluster_sectors); > + if (ret< 0) { > + goto fail; > + } > } else { > cluster_offset = get_cluster_offset(bs, sector_num<< 9, 2, > out_len, 0, 0); > + if (cluster_offset == 0) { > + ret = -EIO; > + goto fail; > + } > + > cluster_offset&= s->cluster_offset_mask; > - if (bdrv_pwrite(bs->file, cluster_offset, out_buf, out_len) != out_len) { > - g_free(out_buf); > - return -1; > + ret = bdrv_pwrite(bs->file, cluster_offset, out_buf, out_len); > + if (ret< 0) { > + goto fail; > } > } > > + ret = 0; > +fail: > g_free(out_buf); > - return 0; > + return ret; > } > > static coroutine_fn int qcow_co_flush(BlockDriverState *bs) Reviewed-by: Paolo Bonzini