From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=36268 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OM1ct-0005aC-0G for qemu-devel@nongnu.org; Tue, 08 Jun 2010 12:26:08 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OM1cn-0006kx-9r for qemu-devel@nongnu.org; Tue, 08 Jun 2010 12:26:06 -0400 Received: from verein.lst.de ([213.95.11.210]:43202) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OM1cn-0006jT-1b for qemu-devel@nongnu.org; Tue, 08 Jun 2010 12:26:01 -0400 Received: from verein.lst.de (localhost [127.0.0.1]) by verein.lst.de (8.12.3/8.12.3/Debian-7.1) with ESMTP id o58GPsXt012301 (version=TLSv1/SSLv3 cipher=EDH-RSA-DES-CBC3-SHA bits=168 verify=NO) for ; Tue, 8 Jun 2010 18:25:54 +0200 Received: (from hch@localhost) by verein.lst.de (8.12.3/8.12.3/Debian-7.2) id o58GPsre012300 for qemu-devel@nongnu.org; Tue, 8 Jun 2010 18:25:54 +0200 Date: Tue, 8 Jun 2010 18:25:54 +0200 From: Christoph Hellwig Message-ID: <20100608162554.GA12253@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Subject: [Qemu-devel] [PATCH 1/2] virtio-blk: stop tracking old_bs List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org There is a 1:1 relation between VirtIOBlock and BlockDriverState instances, no need to track it because it won't change. Signed-off-by: Christoph Hellwig Index: qemu/hw/virtio-blk.c =================================================================== --- qemu.orig/hw/virtio-blk.c 2010-05-26 13:36:07.000000000 +0200 +++ qemu/hw/virtio-blk.c 2010-06-08 11:19:56.253262216 +0200 @@ -241,18 +241,17 @@ static void do_multiwrite(BlockDriverSta } static void virtio_blk_handle_flush(BlockRequest *blkreq, int *num_writes, - VirtIOBlockReq *req, BlockDriverState **old_bs) + VirtIOBlockReq *req) { BlockDriverAIOCB *acb; /* * Make sure all outstanding writes are posted to the backing device. */ - if (*old_bs != NULL) { - do_multiwrite(*old_bs, blkreq, *num_writes); + if (*num_writes > 0) { + do_multiwrite(req->dev->bs, blkreq, *num_writes); } *num_writes = 0; - *old_bs = req->dev->bs; acb = bdrv_aio_flush(req->dev->bs, virtio_blk_flush_complete, req); if (!acb) { @@ -261,19 +260,16 @@ static void virtio_blk_handle_flush(Bloc } static void virtio_blk_handle_write(BlockRequest *blkreq, int *num_writes, - VirtIOBlockReq *req, BlockDriverState **old_bs) + VirtIOBlockReq *req) { if (req->out->sector & req->dev->sector_mask) { virtio_blk_rw_complete(req, -EIO); return; } - if (req->dev->bs != *old_bs || *num_writes == 32) { - if (*old_bs != NULL) { - do_multiwrite(*old_bs, blkreq, *num_writes); - } + if (*num_writes == 32) { + do_multiwrite(req->dev->bs, blkreq, *num_writes); *num_writes = 0; - *old_bs = req->dev->bs; } blkreq[*num_writes].sector = req->out->sector; @@ -305,7 +301,6 @@ static void virtio_blk_handle_read(VirtI typedef struct MultiReqBuffer { BlockRequest blkreq[32]; int num_writes; - BlockDriverState *old_bs; } MultiReqBuffer; static void virtio_blk_handle_request(VirtIOBlockReq *req, @@ -326,15 +321,13 @@ static void virtio_blk_handle_request(Vi req->in = (void *)req->elem.in_sg[req->elem.in_num - 1].iov_base; if (req->out->type & VIRTIO_BLK_T_FLUSH) { - virtio_blk_handle_flush(mrb->blkreq, &mrb->num_writes, - req, &mrb->old_bs); + virtio_blk_handle_flush(mrb->blkreq, &mrb->num_writes, req); } else if (req->out->type & VIRTIO_BLK_T_SCSI_CMD) { virtio_blk_handle_scsi(req); } else if (req->out->type & VIRTIO_BLK_T_OUT) { qemu_iovec_init_external(&req->qiov, &req->elem.out_sg[1], req->elem.out_num - 1); - virtio_blk_handle_write(mrb->blkreq, &mrb->num_writes, - req, &mrb->old_bs); + virtio_blk_handle_write(mrb->blkreq, &mrb->num_writes, req); } else { qemu_iovec_init_external(&req->qiov, &req->elem.in_sg[0], req->elem.in_num - 1); @@ -348,7 +341,6 @@ static void virtio_blk_handle_output(Vir VirtIOBlockReq *req; MultiReqBuffer mrb = { .num_writes = 0, - .old_bs = NULL, }; while ((req = virtio_blk_get_request(s))) { @@ -356,7 +348,7 @@ static void virtio_blk_handle_output(Vir } if (mrb.num_writes > 0) { - do_multiwrite(mrb.old_bs, mrb.blkreq, mrb.num_writes); + do_multiwrite(s->bs, mrb.blkreq, mrb.num_writes); } /* @@ -372,7 +364,6 @@ static void virtio_blk_dma_restart_bh(vo VirtIOBlockReq *req = s->rq; MultiReqBuffer mrb = { .num_writes = 0, - .old_bs = NULL, }; qemu_bh_delete(s->bh); @@ -386,7 +377,7 @@ static void virtio_blk_dma_restart_bh(vo } if (mrb.num_writes > 0) { - do_multiwrite(mrb.old_bs, mrb.blkreq, mrb.num_writes); + do_multiwrite(s->bs, mrb.blkreq, mrb.num_writes); } }