From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:60930) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TXucN-0006aS-Dv for qemu-devel@nongnu.org; Mon, 12 Nov 2012 09:04:06 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TXucK-0006ct-5Q for qemu-devel@nongnu.org; Mon, 12 Nov 2012 09:04:03 -0500 Received: from mail-pb0-f45.google.com ([209.85.160.45]:37252) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TXucJ-0006bl-Va for qemu-devel@nongnu.org; Mon, 12 Nov 2012 09:04:00 -0500 Received: by mail-pb0-f45.google.com with SMTP id mc8so1679149pbc.4 for ; Mon, 12 Nov 2012 06:03:59 -0800 (PST) Sender: Paolo Bonzini From: Paolo Bonzini Date: Mon, 12 Nov 2012 15:03:31 +0100 Message-Id: <1352729011-27799-6-git-send-email-pbonzini@redhat.com> In-Reply-To: <1352729011-27799-1-git-send-email-pbonzini@redhat.com> References: <1352729011-27799-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [PATCH 5/5] scsi-disk: flush cache after disabling it List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: aliguori@us.ibm.com SBC says that "if an application client changes the WCE bit from one to zero via a MODE SELECT command, then the device server shall write any data in volatile cache to non-volatile medium before completing the command". Signed-off-by: Paolo Bonzini --- hw/scsi-disk.c | 9 +++++++++ 1 file modificato, 9 inserzioni(+) diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c index d15f891..49b5686 100644 --- a/hw/scsi-disk.c +++ b/hw/scsi-disk.c @@ -1387,6 +1387,7 @@ invalid_param_len: static void scsi_disk_emulate_mode_select(SCSIDiskReq *r, uint8_t *inbuf) { + SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev); uint8_t *p = inbuf; int cmd = r->req.cmd.buf[0]; int len = r->req.cmd.xfer; @@ -1423,6 +1424,14 @@ static void scsi_disk_emulate_mode_select(SCSIDiskReq *r, uint8_t *inbuf) return; } } + if (!bdrv_enable_write_cache(s->qdev.conf.bs)) { + /* The request is used as the AIO opaque value, so add a ref. */ + scsi_req_ref(&r->req); + bdrv_acct_start(s->qdev.conf.bs, &r->acct, 0, BDRV_ACCT_FLUSH); + r->req.aiocb = bdrv_aio_flush(s->qdev.conf.bs, scsi_aio_complete, r); + return; + } + scsi_req_complete(&r->req, GOOD); return; -- 1.7.12.1