[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 08/16] scsi: add support for FUA on writes
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PATCH 08/16] scsi: add support for FUA on writes |
Date: |
Thu, 19 Apr 2012 16:29:28 +0200 |
To force unit access, add a flush operation after the actual write.
WRITE AND VERIFY commands always flush according to SBC, so do it
even though we do not perform the reread.
Signed-off-by: Paolo Bonzini <address@hidden>
---
hw/scsi-disk.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 47 insertions(+), 2 deletions(-)
diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c
index 158ed5b..7e6e17d 100644
--- a/hw/scsi-disk.c
+++ b/hw/scsi-disk.c
@@ -174,6 +174,45 @@ done:
}
}
+static bool scsi_is_cmd_fua(SCSICommand *cmd)
+{
+ switch (cmd->buf[0]) {
+ case READ_10:
+ case READ_12:
+ case READ_16:
+ case WRITE_10:
+ case WRITE_12:
+ case WRITE_16:
+ return (cmd->buf[1] & 8) != 0;
+
+ case WRITE_VERIFY_10:
+ case WRITE_VERIFY_12:
+ case WRITE_VERIFY_16:
+ return true;
+
+ case READ_6:
+ case WRITE_6:
+ default:
+ return false;
+ }
+}
+
+static void scsi_write_do_fua(SCSIDiskReq *r)
+{
+ SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
+
+ if (scsi_is_cmd_fua(&r->req.cmd)) {
+ bdrv_acct_start(s->qdev.conf.bs, &r->acct, 0, BDRV_ACCT_FLUSH);
+ r->req.aiocb = bdrv_aio_flush(s->qdev.conf.bs, scsi_flush_complete, r);
+ return;
+ }
+
+ scsi_req_complete(&r->req, GOOD);
+ if (!r->req.io_canceled) {
+ scsi_req_unref(&r->req);
+ }
+}
+
static void scsi_dma_complete(void *opaque, int ret)
{
SCSIDiskReq *r = (SCSIDiskReq *)opaque;
@@ -189,7 +228,12 @@ static void scsi_dma_complete(void *opaque, int ret)
r->sector += r->sector_count;
r->sector_count = 0;
- scsi_req_complete(&r->req, GOOD);
+ if (r->req.cmd.mode == SCSI_XFER_TO_DEV) {
+ scsi_write_do_fua(r);
+ return;
+ } else {
+ scsi_req_complete(&r->req, GOOD);
+ }
done:
if (!r->req.io_canceled) {
@@ -342,7 +386,8 @@ static void scsi_write_complete(void * opaque, int ret)
r->sector += n;
r->sector_count -= n;
if (r->sector_count == 0) {
- scsi_req_complete(&r->req, GOOD);
+ scsi_write_do_fua(r);
+ return;
} else {
scsi_init_iovec(r, SCSI_DMA_BUF_SIZE);
DPRINTF("Write complete tag=0x%x more=%d\n", r->req.tag, r->qiov.size);
--
1.7.9.3
- [Qemu-devel] [PULL 00/16] Pending SCSI patches for 1.1, Paolo Bonzini, 2012/04/19
- [Qemu-devel] [PATCH 01/16] scsi: fix memory leak, Paolo Bonzini, 2012/04/19
- [Qemu-devel] [PATCH 03/16] virtio: add virtio_queue_get_id, Paolo Bonzini, 2012/04/19
- [Qemu-devel] [PATCH 05/16] scsi: add missing test for cancelled request, Paolo Bonzini, 2012/04/19
- [Qemu-devel] [PATCH 02/16] virtio-scsi: prepare migration format for multiqueue, Paolo Bonzini, 2012/04/19
- [Qemu-devel] [PATCH 04/16] virtio-scsi: add multiqueue capability, Paolo Bonzini, 2012/04/19
- [Qemu-devel] [PATCH 06/16] scsi: make code more homogeneous in AIO callback functions, Paolo Bonzini, 2012/04/19
- [Qemu-devel] [PATCH 10/16] scsi: add a started field to SCSIDiskReq, Paolo Bonzini, 2012/04/19
- [Qemu-devel] [PATCH 07/16] scsi: move scsi_flush_complete around, Paolo Bonzini, 2012/04/19
- [Qemu-devel] [PATCH 11/16] scsi: support FUA on reads, Paolo Bonzini, 2012/04/19
- [Qemu-devel] [PATCH 08/16] scsi: add support for FUA on writes,
Paolo Bonzini <=
- [Qemu-devel] [PATCH 09/16] scsi: force unit access on VERIFY, Paolo Bonzini, 2012/04/19
- [Qemu-devel] [PATCH 13/16] scsi: advertise DPOFUA, Paolo Bonzini, 2012/04/19
- [Qemu-devel] [PATCH 12/16] scsi: small refactoring of MMC mode-sense, Paolo Bonzini, 2012/04/19
- [Qemu-devel] [PATCH 16/16] scsi: add SANITIZE command, Paolo Bonzini, 2012/04/19
- [Qemu-devel] [PATCH 14/16] SCSI emulation: Support unmap via WRITE_SAME_10., Paolo Bonzini, 2012/04/19
- [Qemu-devel] [PATCH 15/16] SCSI emulation: should tell the guest that we actually support thin provisioning, Paolo Bonzini, 2012/04/19