From patchwork Tue Aug 23 13:21:09 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Frediano Ziglio X-Patchwork-Id: 111101 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [140.186.70.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id B732CB6F9D for ; Tue, 23 Aug 2011 23:21:43 +1000 (EST) Received: from localhost ([::1]:35579 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QvqvD-0000Os-U8 for incoming@patchwork.ozlabs.org; Tue, 23 Aug 2011 09:21:39 -0400 Received: from eggs.gnu.org ([140.186.70.92]:58336) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Qvqv3-0000DG-Dy for qemu-devel@nongnu.org; Tue, 23 Aug 2011 09:21:30 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Qvquz-0006mB-4m for qemu-devel@nongnu.org; Tue, 23 Aug 2011 09:21:29 -0400 Received: from mail-gx0-f173.google.com ([209.85.161.173]:61350) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Qvquy-0006kx-PA for qemu-devel@nongnu.org; Tue, 23 Aug 2011 09:21:25 -0400 Received: by mail-gx0-f173.google.com with SMTP id 26so88072gxk.4 for ; Tue, 23 Aug 2011 06:21:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references; bh=lstDwB18zYzBhzx5ZjtioDP3eaUEVoHkopCz1SA/3kk=; b=a0lYUfEe/i3H4G3zdh8fWtN/qyRejYUkcgR7LQkLLOjmobxHTtiShN+Cg+iGHOsIgA ypirYeK+3aNWE3vSRPWJhSED1v956xoix8MylhWP2mmpHLr7XBX2CpQOH/R4SlwS/wJ0 CIfM0zv5VidJi702I1/Jd2rUuXtGJFBYyfNog= Received: by 10.236.185.138 with SMTP id u10mr22673269yhm.67.1314105684509; Tue, 23 Aug 2011 06:21:24 -0700 (PDT) Received: from obol602.omnitel.it (tor-exit-router37-readme.formlessnetworking.net [199.48.147.37]) by mx.google.com with ESMTPS id a29sm227805yhj.3.2011.08.23.06.21.18 (version=SSLv3 cipher=OTHER); Tue, 23 Aug 2011 06:21:23 -0700 (PDT) From: Frediano Ziglio To: kwolf@redhat.com Date: Tue, 23 Aug 2011 15:21:09 +0200 Message-Id: <1314105682-28396-3-git-send-email-freddy77@gmail.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1314105682-28396-1-git-send-email-freddy77@gmail.com> References: <1314105682-28396-1-git-send-email-freddy77@gmail.com> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 2) X-Received-From: 209.85.161.173 Cc: qemu-devel@nongnu.org, Frediano Ziglio Subject: [Qemu-devel] [PATCH v3 02/15] qcow: QCowAIOCB field cleanup X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org remove unused field from this structure and put some of them in qcow_aio_read_cb and qcow_aio_write_cb Signed-off-by: Frediano Ziglio --- block/qcow.c | 137 +++++++++++++++++++++++++++------------------------------ 1 files changed, 65 insertions(+), 72 deletions(-) diff --git a/block/qcow.c b/block/qcow.c index b4506b4..9754ca9 100644 --- a/block/qcow.c +++ b/block/qcow.c @@ -487,72 +487,61 @@ static int qcow_read(BlockDriverState *bs, int64_t sector_num, #endif typedef struct QCowAIOCB { - BlockDriverAIOCB common; + BlockDriverState *bs; int64_t sector_num; QEMUIOVector *qiov; uint8_t *buf; void *orig_buf; int nb_sectors; - int n; - uint64_t cluster_offset; - uint8_t *cluster_data; - struct iovec hd_iov; - bool is_write; - QEMUBH *bh; - QEMUIOVector hd_qiov; - BlockDriverAIOCB *hd_aiocb; } QCowAIOCB; static QCowAIOCB *qcow_aio_setup(BlockDriverState *bs, int64_t sector_num, QEMUIOVector *qiov, int nb_sectors, int is_write, QCowAIOCB *acb) { - memset(acb, 0, sizeof(*acb)); - acb->common.bs = bs; - acb->hd_aiocb = NULL; + acb->bs = bs; acb->sector_num = sector_num; acb->qiov = qiov; - acb->is_write = is_write; if (qiov->niov > 1) { acb->buf = acb->orig_buf = qemu_blockalign(bs, qiov->size); if (is_write) qemu_iovec_to_buffer(qiov, acb->buf); } else { + acb->orig_buf = NULL; acb->buf = (uint8_t *)qiov->iov->iov_base; } acb->nb_sectors = nb_sectors; - acb->n = 0; - acb->cluster_offset = 0; return acb; } static int qcow_aio_read_cb(QCowAIOCB *acb) { - BlockDriverState *bs = acb->common.bs; + BlockDriverState *bs = acb->bs; BDRVQcowState *s = bs->opaque; int index_in_cluster; - int ret; - - acb->hd_aiocb = NULL; + int ret, n = 0; + uint64_t cluster_offset = 0; + struct iovec hd_iov; + QEMUIOVector hd_qiov; redo: /* post process the read buffer */ - if (!acb->cluster_offset) { + if (!cluster_offset) { /* nothing to do */ - } else if (acb->cluster_offset & QCOW_OFLAG_COMPRESSED) { + } else if (cluster_offset & QCOW_OFLAG_COMPRESSED) { /* nothing to do */ } else { if (s->crypt_method) { encrypt_sectors(s, acb->sector_num, acb->buf, acb->buf, - acb->n, 0, + n, 0, &s->aes_decrypt_key); } } - acb->nb_sectors -= acb->n; - acb->sector_num += acb->n; - acb->buf += acb->n * 512; + acb->nb_sectors -= n; + acb->sector_num += n; + acb->buf += n * 512; if (acb->nb_sectors == 0) { /* request completed */ @@ -560,57 +549,58 @@ static int qcow_aio_read_cb(QCowAIOCB *acb) } /* prepare next AIO request */ - acb->cluster_offset = get_cluster_offset(bs, acb->sector_num << 9, + cluster_offset = get_cluster_offset(bs, acb->sector_num << 9, 0, 0, 0, 0); index_in_cluster = acb->sector_num & (s->cluster_sectors - 1); - acb->n = s->cluster_sectors - index_in_cluster; - if (acb->n > acb->nb_sectors) - acb->n = acb->nb_sectors; + n = s->cluster_sectors - index_in_cluster; + if (n > acb->nb_sectors) { + n = acb->nb_sectors; + } - if (!acb->cluster_offset) { + if (!cluster_offset) { if (bs->backing_hd) { /* read from the base image */ - acb->hd_iov.iov_base = (void *)acb->buf; - acb->hd_iov.iov_len = acb->n * 512; - qemu_iovec_init_external(&acb->hd_qiov, &acb->hd_iov, 1); + hd_iov.iov_base = (void *)acb->buf; + hd_iov.iov_len = n * 512; + qemu_iovec_init_external(&hd_qiov, &hd_iov, 1); qemu_co_mutex_unlock(&s->lock); ret = bdrv_co_readv(bs->backing_hd, acb->sector_num, - acb->n, &acb->hd_qiov); + n, &hd_qiov); qemu_co_mutex_lock(&s->lock); if (ret < 0) { return -EIO; } } else { /* Note: in this case, no need to wait */ - memset(acb->buf, 0, 512 * acb->n); + memset(acb->buf, 0, 512 * n); goto redo; } - } else if (acb->cluster_offset & QCOW_OFLAG_COMPRESSED) { + } else if (cluster_offset & QCOW_OFLAG_COMPRESSED) { /* add AIO support for compressed blocks ? */ - if (decompress_cluster(bs, acb->cluster_offset) < 0) { + if (decompress_cluster(bs, cluster_offset) < 0) { return -EIO; } memcpy(acb->buf, - s->cluster_cache + index_in_cluster * 512, 512 * acb->n); + s->cluster_cache + index_in_cluster * 512, 512 * n); goto redo; } else { - if ((acb->cluster_offset & 511) != 0) { + if ((cluster_offset & 511) != 0) { return -EIO; } - acb->hd_iov.iov_base = (void *)acb->buf; - acb->hd_iov.iov_len = acb->n * 512; - qemu_iovec_init_external(&acb->hd_qiov, &acb->hd_iov, 1); + hd_iov.iov_base = (void *)acb->buf; + hd_iov.iov_len = n * 512; + qemu_iovec_init_external(&hd_qiov, &hd_iov, 1); qemu_co_mutex_unlock(&s->lock); ret = bdrv_co_readv(bs->file, - (acb->cluster_offset >> 9) + index_in_cluster, - acb->n, &acb->hd_qiov); + (cluster_offset >> 9) + index_in_cluster, + n, &hd_qiov); qemu_co_mutex_lock(&s->lock); if (ret < 0) { return ret; } } - return 1; + goto redo; } static int qcow_co_readv(BlockDriverState *bs, int64_t sector_num, @@ -623,9 +613,7 @@ static int qcow_co_readv(BlockDriverState *bs, int64_t sector_num, qcow_aio_setup(bs, sector_num, qiov, nb_sectors, 0, &acb); qemu_co_mutex_lock(&s->lock); - do { - ret = qcow_aio_read_cb(&acb); - } while (ret > 0); + ret = qcow_aio_read_cb(&acb); qemu_co_mutex_unlock(&s->lock); if (acb.qiov->niov > 1) { @@ -638,18 +626,20 @@ static int qcow_co_readv(BlockDriverState *bs, int64_t sector_num, static int qcow_aio_write_cb(QCowAIOCB *acb) { - BlockDriverState *bs = acb->common.bs; + BlockDriverState *bs = acb->bs; BDRVQcowState *s = bs->opaque; int index_in_cluster; uint64_t cluster_offset; const uint8_t *src_buf; - int ret; - - acb->hd_aiocb = NULL; + int ret, n = 0; + uint8_t *cluster_data = NULL; + struct iovec hd_iov; + QEMUIOVector hd_qiov; - acb->nb_sectors -= acb->n; - acb->sector_num += acb->n; - acb->buf += acb->n * 512; +redo: + acb->nb_sectors -= n; + acb->sector_num += n; + acb->buf += n * 512; if (acb->nb_sectors == 0) { /* request completed */ @@ -657,38 +647,43 @@ static int qcow_aio_write_cb(QCowAIOCB *acb) } index_in_cluster = acb->sector_num & (s->cluster_sectors - 1); - acb->n = s->cluster_sectors - index_in_cluster; - if (acb->n > acb->nb_sectors) - acb->n = acb->nb_sectors; + n = s->cluster_sectors - index_in_cluster; + if (n > acb->nb_sectors) { + n = acb->nb_sectors; + } cluster_offset = get_cluster_offset(bs, acb->sector_num << 9, 1, 0, index_in_cluster, - index_in_cluster + acb->n); + index_in_cluster + n); if (!cluster_offset || (cluster_offset & 511) != 0) { return -EIO; } if (s->crypt_method) { - if (!acb->cluster_data) { - acb->cluster_data = g_malloc0(s->cluster_size); + if (!cluster_data) { + cluster_data = g_malloc0(s->cluster_size); } - encrypt_sectors(s, acb->sector_num, acb->cluster_data, acb->buf, - acb->n, 1, &s->aes_encrypt_key); - src_buf = acb->cluster_data; + encrypt_sectors(s, acb->sector_num, cluster_data, acb->buf, + n, 1, &s->aes_encrypt_key); + src_buf = cluster_data; } else { src_buf = acb->buf; } - acb->hd_iov.iov_base = (void *)src_buf; - acb->hd_iov.iov_len = acb->n * 512; - qemu_iovec_init_external(&acb->hd_qiov, &acb->hd_iov, 1); + hd_iov.iov_base = (void *)src_buf; + hd_iov.iov_len = n * 512; + qemu_iovec_init_external(&hd_qiov, &hd_iov, 1); qemu_co_mutex_unlock(&s->lock); ret = bdrv_co_writev(bs->file, (cluster_offset >> 9) + index_in_cluster, - acb->n, &acb->hd_qiov); + n, &hd_qiov); + if (cluster_data) { + free(cluster_data); + cluster_data = NULL; + } qemu_co_mutex_lock(&s->lock); if (ret < 0) { return ret; } - return 1; + goto redo; } static int qcow_co_writev(BlockDriverState *bs, int64_t sector_num, @@ -703,9 +698,7 @@ static int qcow_co_writev(BlockDriverState *bs, int64_t sector_num, qcow_aio_setup(bs, sector_num, qiov, nb_sectors, 1, &acb); qemu_co_mutex_lock(&s->lock); - do { - ret = qcow_aio_write_cb(&acb); - } while (ret > 0); + ret = qcow_aio_write_cb(&acb); qemu_co_mutex_unlock(&s->lock); if (acb.qiov->niov > 1) {