* [Qemu-devel] [PATCH v2 00/15] SCSI s/g + SCSI migration + virtio-scsi
@ 2012-01-16 16:30 Paolo Bonzini
2012-01-16 16:30 ` [Qemu-devel] [PATCH 01/15] dma-helpers: make QEMUSGList target independent Paolo Bonzini
` (16 more replies)
0 siblings, 17 replies; 30+ messages in thread
From: Paolo Bonzini @ 2012-01-16 16:30 UTC (permalink / raw)
To: qemu-devel
Here is v2 (three counting the RFC) of the virtio-scsi driver.
Unlike previous versions, it includes migration support.
The only change in the spec has been s/UNDERRUN/OVERRUN/g.
Paolo Bonzini (13):
dma-helpers: make QEMUSGList target independent
dma-helpers: add dma_buf_read and dma_buf_write
dma-helpers: add accounting wrappers
ahci: use new DMA helpers
scsi: pass residual amount to command_complete
scsi: add scatter/gather functionality
scsi-disk: enable scatter/gather functionality
scsi: add SCSIDevice vmstate definitions
scsi-generic: add migration support
scsi-disk: add migration support
virtio-scsi: add basic SCSI bus operation
virtio-scsi: process control queue requests
virtio-scsi: add migration support
Stefan Hajnoczi (2):
virtio-scsi: Add virtio-scsi stub device
virtio-scsi: Add basic request processing infrastructure
Makefile.target | 1 +
default-configs/pci.mak | 1 +
default-configs/s390x-softmmu.mak | 1 +
dma-helpers.c | 36 +++
dma.h | 20 +-
hw/esp.c | 3 +-
hw/ide/ahci.c | 82 +-----
hw/lsi53c895a.c | 2 +-
hw/pci.h | 1 +
hw/s390-virtio-bus.c | 24 ++
hw/s390-virtio-bus.h | 2 +
hw/scsi-bus.c | 143 +++++++++-
hw/scsi-disk.c | 120 +++++++-
hw/scsi-generic.c | 25 ++
hw/scsi.h | 22 ++-
hw/spapr_vscsi.c | 2 +-
hw/usb-msd.c | 2 +-
hw/virtio-pci.c | 42 +++
hw/virtio-pci.h | 2 +
hw/virtio-scsi.c | 607 +++++++++++++++++++++++++++++++++++++
hw/virtio-scsi.h | 36 +++
hw/virtio.h | 3 +
22 files changed, 1074 insertions(+), 103 deletions(-)
create mode 100644 hw/virtio-scsi.c
create mode 100644 hw/virtio-scsi.h
--
1.7.7.1
^ permalink raw reply [flat|nested] 30+ messages in thread
* [Qemu-devel] [PATCH 01/15] dma-helpers: make QEMUSGList target independent
2012-01-16 16:30 [Qemu-devel] [PATCH v2 00/15] SCSI s/g + SCSI migration + virtio-scsi Paolo Bonzini
@ 2012-01-16 16:30 ` Paolo Bonzini
2012-01-16 16:30 ` [Qemu-devel] [PATCH 02/15] dma-helpers: add dma_buf_read and dma_buf_write Paolo Bonzini
` (15 subsequent siblings)
16 siblings, 0 replies; 30+ messages in thread
From: Paolo Bonzini @ 2012-01-16 16:30 UTC (permalink / raw)
To: qemu-devel
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
dma.h | 14 +++++++-------
1 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/dma.h b/dma.h
index a13209d..d50019b 100644
--- a/dma.h
+++ b/dma.h
@@ -17,6 +17,13 @@
typedef struct ScatterGatherEntry ScatterGatherEntry;
+struct QEMUSGList {
+ ScatterGatherEntry *sg;
+ int nsg;
+ int nalloc;
+ size_t size;
+};
+
#if defined(TARGET_PHYS_ADDR_BITS)
typedef target_phys_addr_t dma_addr_t;
@@ -32,13 +39,6 @@ struct ScatterGatherEntry {
dma_addr_t len;
};
-struct QEMUSGList {
- ScatterGatherEntry *sg;
- int nsg;
- int nalloc;
- dma_addr_t size;
-};
-
void qemu_sglist_init(QEMUSGList *qsg, int alloc_hint);
void qemu_sglist_add(QEMUSGList *qsg, dma_addr_t base, dma_addr_t len);
void qemu_sglist_destroy(QEMUSGList *qsg);
--
1.7.7.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [Qemu-devel] [PATCH 02/15] dma-helpers: add dma_buf_read and dma_buf_write
2012-01-16 16:30 [Qemu-devel] [PATCH v2 00/15] SCSI s/g + SCSI migration + virtio-scsi Paolo Bonzini
2012-01-16 16:30 ` [Qemu-devel] [PATCH 01/15] dma-helpers: make QEMUSGList target independent Paolo Bonzini
@ 2012-01-16 16:30 ` Paolo Bonzini
2012-01-16 16:30 ` [Qemu-devel] [PATCH 03/15] dma-helpers: add accounting wrappers Paolo Bonzini
` (14 subsequent siblings)
16 siblings, 0 replies; 30+ messages in thread
From: Paolo Bonzini @ 2012-01-16 16:30 UTC (permalink / raw)
To: qemu-devel
These helpers do a full transfer from an in-memory buffer to target
memory, with support for scatter/gather lists. It will be used to
store the reply of an emulated command into a QEMUSGList provided by
the adapter.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
dma-helpers.c | 30 ++++++++++++++++++++++++++++++
dma.h | 3 +++
2 files changed, 33 insertions(+), 0 deletions(-)
diff --git a/dma-helpers.c b/dma-helpers.c
index f08cdb5..f53a51f 100644
--- a/dma-helpers.c
+++ b/dma-helpers.c
@@ -204,3 +204,33 @@ BlockDriverAIOCB *dma_bdrv_write(BlockDriverState *bs,
{
return dma_bdrv_io(bs, sg, sector, bdrv_aio_writev, cb, opaque, true);
}
+
+
+static uint64_t dma_buf_rw(uint8_t *ptr, int32_t len, QEMUSGList *sg, bool to_dev)
+{
+ uint64_t resid;
+ int sg_cur_index;
+
+ resid = sg->size;
+ sg_cur_index = 0;
+ len = MIN(len, resid);
+ while (len > 0) {
+ ScatterGatherEntry entry = sg->sg[sg_cur_index++];
+ cpu_physical_memory_rw(entry.base, ptr, MIN(len, entry.len), !to_dev);
+ ptr += entry.len;
+ len -= entry.len;
+ resid -= entry.len;
+ }
+
+ return resid;
+}
+
+uint64_t dma_buf_read(uint8_t *ptr, int32_t len, QEMUSGList *sg)
+{
+ return dma_buf_rw(ptr, len, sg, 0);
+}
+
+uint64_t dma_buf_write(uint8_t *ptr, int32_t len, QEMUSGList *sg)
+{
+ return dma_buf_rw(ptr, len, sg, 1);
+}
diff --git a/dma.h b/dma.h
index d50019b..346ac4f 100644
--- a/dma.h
+++ b/dma.h
@@ -58,4 +58,7 @@ BlockDriverAIOCB *dma_bdrv_read(BlockDriverState *bs,
BlockDriverAIOCB *dma_bdrv_write(BlockDriverState *bs,
QEMUSGList *sg, uint64_t sector,
BlockDriverCompletionFunc *cb, void *opaque);
+uint64_t dma_buf_read(uint8_t *ptr, int32_t len, QEMUSGList *sg);
+uint64_t dma_buf_write(uint8_t *ptr, int32_t len, QEMUSGList *sg);
+
#endif
--
1.7.7.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [Qemu-devel] [PATCH 03/15] dma-helpers: add accounting wrappers
2012-01-16 16:30 [Qemu-devel] [PATCH v2 00/15] SCSI s/g + SCSI migration + virtio-scsi Paolo Bonzini
2012-01-16 16:30 ` [Qemu-devel] [PATCH 01/15] dma-helpers: make QEMUSGList target independent Paolo Bonzini
2012-01-16 16:30 ` [Qemu-devel] [PATCH 02/15] dma-helpers: add dma_buf_read and dma_buf_write Paolo Bonzini
@ 2012-01-16 16:30 ` Paolo Bonzini
2012-01-16 16:30 ` [Qemu-devel] [PATCH 04/15] ahci: use new DMA helpers Paolo Bonzini
` (13 subsequent siblings)
16 siblings, 0 replies; 30+ messages in thread
From: Paolo Bonzini @ 2012-01-16 16:30 UTC (permalink / raw)
To: qemu-devel
The length of the transfer is already in the sglist, and may be opaque to
the device if it is not in hw/. So add a wrapper that fetches it.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
dma-helpers.c | 6 ++++++
dma.h | 3 +++
2 files changed, 9 insertions(+), 0 deletions(-)
diff --git a/dma-helpers.c b/dma-helpers.c
index f53a51f..a773489 100644
--- a/dma-helpers.c
+++ b/dma-helpers.c
@@ -234,3 +234,9 @@ uint64_t dma_buf_write(uint8_t *ptr, int32_t len, QEMUSGList *sg)
{
return dma_buf_rw(ptr, len, sg, 1);
}
+
+void dma_acct_start(BlockDriverState *bs, BlockAcctCookie *cookie,
+ QEMUSGList *sg, enum BlockAcctType type)
+{
+ bdrv_acct_start(bs, cookie, sg->size, type);
+}
diff --git a/dma.h b/dma.h
index 346ac4f..20e86d2 100644
--- a/dma.h
+++ b/dma.h
@@ -61,4 +61,7 @@ BlockDriverAIOCB *dma_bdrv_write(BlockDriverState *bs,
uint64_t dma_buf_read(uint8_t *ptr, int32_t len, QEMUSGList *sg);
uint64_t dma_buf_write(uint8_t *ptr, int32_t len, QEMUSGList *sg);
+void dma_acct_start(BlockDriverState *bs, BlockAcctCookie *cookie,
+ QEMUSGList *sg, enum BlockAcctType type);
+
#endif
--
1.7.7.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [Qemu-devel] [PATCH 04/15] ahci: use new DMA helpers
2012-01-16 16:30 [Qemu-devel] [PATCH v2 00/15] SCSI s/g + SCSI migration + virtio-scsi Paolo Bonzini
` (2 preceding siblings ...)
2012-01-16 16:30 ` [Qemu-devel] [PATCH 03/15] dma-helpers: add accounting wrappers Paolo Bonzini
@ 2012-01-16 16:30 ` Paolo Bonzini
2012-01-16 16:30 ` [Qemu-devel] [PATCH 05/15] scsi: pass residual amount to command_complete Paolo Bonzini
` (12 subsequent siblings)
16 siblings, 0 replies; 30+ messages in thread
From: Paolo Bonzini @ 2012-01-16 16:30 UTC (permalink / raw)
To: qemu-devel
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
hw/ide/ahci.c | 82 +++++++++------------------------------------------------
1 files changed, 13 insertions(+), 69 deletions(-)
diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c
index 0af201d..c6aa058 100644
--- a/hw/ide/ahci.c
+++ b/hw/ide/ahci.c
@@ -425,55 +425,6 @@ static void ahci_reg_init(AHCIState *s)
}
}
-static uint32_t read_from_sglist(uint8_t *buffer, uint32_t len,
- QEMUSGList *sglist)
-{
- uint32_t i = 0;
- uint32_t total = 0, once;
- ScatterGatherEntry *cur_prd;
- uint32_t sgcount;
-
- cur_prd = sglist->sg;
- sgcount = sglist->nsg;
- for (i = 0; len && sgcount; i++) {
- once = MIN(cur_prd->len, len);
- cpu_physical_memory_read(cur_prd->base, buffer, once);
- cur_prd++;
- sgcount--;
- len -= once;
- buffer += once;
- total += once;
- }
-
- return total;
-}
-
-static uint32_t write_to_sglist(uint8_t *buffer, uint32_t len,
- QEMUSGList *sglist)
-{
- uint32_t i = 0;
- uint32_t total = 0, once;
- ScatterGatherEntry *cur_prd;
- uint32_t sgcount;
-
- DPRINTF(-1, "total: 0x%x bytes\n", len);
-
- cur_prd = sglist->sg;
- sgcount = sglist->nsg;
- for (i = 0; len && sgcount; i++) {
- once = MIN(cur_prd->len, len);
- DPRINTF(-1, "write 0x%x bytes to 0x%lx\n", once, (long)cur_prd->base);
- cpu_physical_memory_write(cur_prd->base, buffer, once);
- cur_prd++;
- sgcount--;
- len -= once;
- buffer += once;
- total += once;
- }
-
- return total;
-}
-
static void check_cmd(AHCIState *s, int port)
{
AHCIPortRegs *pr = &s->dev[port].port_regs;
@@ -794,9 +745,8 @@ static void process_ncq_command(AHCIState *s, int port, uint8_t *cmd_fis,
DPRINTF(port, "tag %d aio read %"PRId64"\n",
ncq_tfs->tag, ncq_tfs->lba);
- bdrv_acct_start(ncq_tfs->drive->port.ifs[0].bs, &ncq_tfs->acct,
- (ncq_tfs->sector_count-1) * BDRV_SECTOR_SIZE,
- BDRV_ACCT_READ);
+ dma_acct_start(ncq_tfs->drive->port.ifs[0].bs, &ncq_tfs->acct,
+ &ncq_tfs->sglist, BDRV_ACCT_READ);
ncq_tfs->aiocb = dma_bdrv_read(ncq_tfs->drive->port.ifs[0].bs,
&ncq_tfs->sglist, ncq_tfs->lba,
ncq_cb, ncq_tfs);
@@ -808,9 +758,8 @@ static void process_ncq_command(AHCIState *s, int port, uint8_t *cmd_fis,
DPRINTF(port, "tag %d aio write %"PRId64"\n",
ncq_tfs->tag, ncq_tfs->lba);
- bdrv_acct_start(ncq_tfs->drive->port.ifs[0].bs, &ncq_tfs->acct,
- (ncq_tfs->sector_count-1) * BDRV_SECTOR_SIZE,
- BDRV_ACCT_WRITE);
+ dma_acct_start(ncq_tfs->drive->port.ifs[0].bs, &ncq_tfs->acct,
+ &ncq_tfs->sglist, BDRV_ACCT_WRITE);
ncq_tfs->aiocb = dma_bdrv_write(ncq_tfs->drive->port.ifs[0].bs,
&ncq_tfs->sglist, ncq_tfs->lba,
ncq_cb, ncq_tfs);
@@ -1015,12 +964,12 @@ static int ahci_start_transfer(IDEDMA *dma)
is_write ? "writ" : "read", size, is_atapi ? "atapi" : "ata",
has_sglist ? "" : "o");
- if (is_write && has_sglist && (s->data_ptr < s->data_end)) {
- read_from_sglist(s->data_ptr, size, &s->sg);
- }
-
- if (!is_write && has_sglist && (s->data_ptr < s->data_end)) {
- write_to_sglist(s->data_ptr, size, &s->sg);
+ if (has_sglist && size) {
+ if (is_write) {
+ dma_buf_write(s->data_ptr, size, &s->sg);
+ } else {
+ dma_buf_read(s->data_ptr, size, &s->sg);
+ }
}
/* update number of transferred bytes */
@@ -1059,14 +1008,9 @@ static int ahci_dma_prepare_buf(IDEDMA *dma, int is_write)
{
AHCIDevice *ad = DO_UPCAST(AHCIDevice, dma, dma);
IDEState *s = &ad->port.ifs[0];
- int i;
ahci_populate_sglist(ad, &s->sg);
-
- s->io_buffer_size = 0;
- for (i = 0; i < s->sg.nsg; i++) {
- s->io_buffer_size += s->sg.sg[i].len;
- }
+ s->io_buffer_size = s->sg.size;
DPRINTF(ad->port_no, "len=%#x\n", s->io_buffer_size);
return s->io_buffer_size != 0;
@@ -1084,9 +1028,9 @@ static int ahci_dma_rw_buf(IDEDMA *dma, int is_write)
}
if (is_write) {
- write_to_sglist(p, l, &s->sg);
+ dma_buf_read(p, l, &s->sg);
} else {
- read_from_sglist(p, l, &s->sg);
+ dma_buf_write(p, l, &s->sg);
}
/* update number of transferred bytes */
--
1.7.7.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [Qemu-devel] [PATCH 05/15] scsi: pass residual amount to command_complete
2012-01-16 16:30 [Qemu-devel] [PATCH v2 00/15] SCSI s/g + SCSI migration + virtio-scsi Paolo Bonzini
` (3 preceding siblings ...)
2012-01-16 16:30 ` [Qemu-devel] [PATCH 04/15] ahci: use new DMA helpers Paolo Bonzini
@ 2012-01-16 16:30 ` Paolo Bonzini
2012-02-10 11:44 ` Stefan Hajnoczi
2012-01-16 16:30 ` [Qemu-devel] [PATCH 06/15] scsi: add scatter/gather functionality Paolo Bonzini
` (11 subsequent siblings)
16 siblings, 1 reply; 30+ messages in thread
From: Paolo Bonzini @ 2012-01-16 16:30 UTC (permalink / raw)
To: qemu-devel
With the upcoming sglist support, HBAs will not see any transfer_data
call and will not have a way to detect short transfers. So pass the
residual amount of data upon command completion.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
hw/esp.c | 3 ++-
hw/lsi53c895a.c | 2 +-
hw/scsi-bus.c | 12 ++++++++----
hw/scsi.h | 3 ++-
hw/spapr_vscsi.c | 2 +-
hw/usb-msd.c | 2 +-
6 files changed, 15 insertions(+), 9 deletions(-)
diff --git a/hw/esp.c b/hw/esp.c
index 9551c78..bd975c0 100644
--- a/hw/esp.c
+++ b/hw/esp.c
@@ -390,7 +390,8 @@ static void esp_do_dma(ESPState *s)
esp_dma_done(s);
}
-static void esp_command_complete(SCSIRequest *req, uint32_t status)
+static void esp_command_complete(SCSIRequest *req, uint32_t status,
+ int32_t resid)
{
ESPState *s = DO_UPCAST(ESPState, busdev.qdev, req->bus->qbus.parent);
diff --git a/hw/lsi53c895a.c b/hw/lsi53c895a.c
index 0d3a101..eae317b 100644
--- a/hw/lsi53c895a.c
+++ b/hw/lsi53c895a.c
@@ -699,7 +699,7 @@ static int lsi_queue_req(LSIState *s, SCSIRequest *req, uint32_t len)
}
/* Callback to indicate that the SCSI layer has completed a command. */
-static void lsi_command_complete(SCSIRequest *req, uint32_t status)
+static void lsi_command_complete(SCSIRequest *req, uint32_t status, int32_t resid)
{
LSIState *s = DO_UPCAST(LSIState, dev.qdev, req->bus->qbus.parent);
int out;
diff --git a/hw/scsi-bus.c b/hw/scsi-bus.c
index 64e709e..aa811f4 100644
--- a/hw/scsi-bus.c
+++ b/hw/scsi-bus.c
@@ -512,6 +512,8 @@ SCSIRequest *scsi_req_new(SCSIDevice *d, uint32_t tag, uint32_t lun,
}
req->cmd = cmd;
+ req->resid = req->cmd.xfer;
+
switch (buf[0]) {
case INQUIRY:
trace_scsi_inquiry(d->id, lun, tag, cmd.buf[1], cmd.buf[2]);
@@ -1256,10 +1258,12 @@ void scsi_req_data(SCSIRequest *req, int len)
{
if (req->io_canceled) {
trace_scsi_req_data_canceled(req->dev->id, req->lun, req->tag, len);
- } else {
- trace_scsi_req_data(req->dev->id, req->lun, req->tag, len);
- req->bus->info->transfer_data(req, len);
+ return;
}
+ trace_scsi_req_data(req->dev->id, req->lun, req->tag, len);
+ assert(req->cmd.mode != SCSI_XFER_NONE);
+ req->resid -= len;
+ req->bus->info->transfer_data(req, len);
}
void scsi_req_print(SCSIRequest *req)
@@ -1318,7 +1322,7 @@ void scsi_req_complete(SCSIRequest *req, int status)
scsi_req_ref(req);
scsi_req_dequeue(req);
- req->bus->info->complete(req, req->status);
+ req->bus->info->complete(req, req->status, req->resid);
scsi_req_unref(req);
}
diff --git a/hw/scsi.h b/hw/scsi.h
index ab6e952..27ca087 100644
--- a/hw/scsi.h
+++ b/hw/scsi.h
@@ -47,6 +47,7 @@ struct SCSIRequest {
uint32_t tag;
uint32_t lun;
uint32_t status;
+ size_t resid;
SCSICommand cmd;
BlockDriverAIOCB *aiocb;
uint8_t sense[SCSI_SENSE_BUF_SIZE];
@@ -107,7 +108,7 @@ struct SCSIBusInfo {
int tcq;
int max_channel, max_target, max_lun;
void (*transfer_data)(SCSIRequest *req, uint32_t arg);
- void (*complete)(SCSIRequest *req, uint32_t arg);
+ void (*complete)(SCSIRequest *req, uint32_t arg, int32_t len);
void (*cancel)(SCSIRequest *req);
};
diff --git a/hw/spapr_vscsi.c b/hw/spapr_vscsi.c
index 00e2d2d..c28bba9 100644
--- a/hw/spapr_vscsi.c
+++ b/hw/spapr_vscsi.c
@@ -494,7 +494,7 @@ static void vscsi_transfer_data(SCSIRequest *sreq, uint32_t len)
}
/* Callback to indicate that the SCSI layer has completed a transfer. */
-static void vscsi_command_complete(SCSIRequest *sreq, uint32_t status)
+static void vscsi_command_complete(SCSIRequest *sreq, uint32_t status, int32_t resid)
{
VSCSIState *s = DO_UPCAST(VSCSIState, vdev.qdev, sreq->bus->qbus.parent);
vscsi_req *req = sreq->hba_private;
diff --git a/hw/usb-msd.c b/hw/usb-msd.c
index e427296..d2faabd 100644
--- a/hw/usb-msd.c
+++ b/hw/usb-msd.c
@@ -223,7 +223,7 @@ static void usb_msd_transfer_data(SCSIRequest *req, uint32_t len)
}
}
-static void usb_msd_command_complete(SCSIRequest *req, uint32_t status)
+static void usb_msd_command_complete(SCSIRequest *req, uint32_t status, int32_t resid)
{
MSDState *s = DO_UPCAST(MSDState, dev.qdev, req->bus->qbus.parent);
USBPacket *p = s->packet;
--
1.7.7.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [Qemu-devel] [PATCH 06/15] scsi: add scatter/gather functionality
2012-01-16 16:30 [Qemu-devel] [PATCH v2 00/15] SCSI s/g + SCSI migration + virtio-scsi Paolo Bonzini
` (4 preceding siblings ...)
2012-01-16 16:30 ` [Qemu-devel] [PATCH 05/15] scsi: pass residual amount to command_complete Paolo Bonzini
@ 2012-01-16 16:30 ` Paolo Bonzini
2012-01-16 16:30 ` [Qemu-devel] [PATCH 07/15] scsi-disk: enable " Paolo Bonzini
` (10 subsequent siblings)
16 siblings, 0 replies; 30+ messages in thread
From: Paolo Bonzini @ 2012-01-16 16:30 UTC (permalink / raw)
To: qemu-devel
Scatter/gather functionality uses the newly added DMA helpers. The
device can choose between doing DMA itself, or calling scsi_req_data
as usual, which will use the newly added DMA helpers to copy piecewise
to/from the destination area(s).
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
hw/scsi-bus.c | 28 ++++++++++++++++++++++++++--
hw/scsi.h | 3 +++
2 files changed, 29 insertions(+), 2 deletions(-)
diff --git a/hw/scsi-bus.c b/hw/scsi-bus.c
index aa811f4..b774261 100644
--- a/hw/scsi-bus.c
+++ b/hw/scsi-bus.c
@@ -5,6 +5,7 @@
#include "qdev.h"
#include "blockdev.h"
#include "trace.h"
+#include "dma.h"
static char *scsibus_get_fw_dev_path(DeviceState *dev);
static int scsi_req_parse(SCSICommand *cmd, SCSIDevice *dev, uint8_t *buf);
@@ -632,6 +633,11 @@ int32_t scsi_req_enqueue(SCSIRequest *req)
assert(!req->enqueued);
scsi_req_ref(req);
+ if (req->bus->info->get_sg_list) {
+ req->sg = req->bus->info->get_sg_list(req);
+ } else {
+ req->sg = NULL;
+ }
req->enqueued = true;
QTAILQ_INSERT_TAIL(&req->dev->requests, req, next);
@@ -1256,14 +1262,32 @@ void scsi_req_continue(SCSIRequest *req)
Once it completes, calling scsi_req_continue will restart I/O. */
void scsi_req_data(SCSIRequest *req, int len)
{
+ uint8_t *buf;
if (req->io_canceled) {
trace_scsi_req_data_canceled(req->dev->id, req->lun, req->tag, len);
return;
}
trace_scsi_req_data(req->dev->id, req->lun, req->tag, len);
assert(req->cmd.mode != SCSI_XFER_NONE);
- req->resid -= len;
- req->bus->info->transfer_data(req, len);
+ if (!req->sg) {
+ req->resid -= len;
+ req->bus->info->transfer_data(req, len);
+ return;
+ }
+
+ /* If the device calls scsi_req_data and the HBA specified a
+ * scatter/gather list, the transfer has to happen in a single
+ * step. */
+ assert(!req->dma_started);
+ req->dma_started = true;
+
+ buf = scsi_req_get_buf(req);
+ if (req->cmd.mode == SCSI_XFER_FROM_DEV) {
+ req->resid = dma_buf_read(buf, len, req->sg);
+ } else {
+ req->resid = dma_buf_write(buf, len, req->sg);
+ }
+ scsi_req_continue(req);
}
void scsi_req_print(SCSIRequest *req)
diff --git a/hw/scsi.h b/hw/scsi.h
index 27ca087..5b1ca60 100644
--- a/hw/scsi.h
+++ b/hw/scsi.h
@@ -50,6 +50,8 @@ struct SCSIRequest {
size_t resid;
SCSICommand cmd;
BlockDriverAIOCB *aiocb;
+ QEMUSGList *sg;
+ bool dma_started;
uint8_t sense[SCSI_SENSE_BUF_SIZE];
uint32_t sense_len;
bool enqueued;
@@ -110,6 +112,7 @@ struct SCSIBusInfo {
void (*transfer_data)(SCSIRequest *req, uint32_t arg);
void (*complete)(SCSIRequest *req, uint32_t arg, int32_t len);
void (*cancel)(SCSIRequest *req);
+ QEMUSGList *(*get_sg_list)(SCSIRequest *req);
};
struct SCSIBus {
--
1.7.7.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [Qemu-devel] [PATCH 07/15] scsi-disk: enable scatter/gather functionality
2012-01-16 16:30 [Qemu-devel] [PATCH v2 00/15] SCSI s/g + SCSI migration + virtio-scsi Paolo Bonzini
` (5 preceding siblings ...)
2012-01-16 16:30 ` [Qemu-devel] [PATCH 06/15] scsi: add scatter/gather functionality Paolo Bonzini
@ 2012-01-16 16:30 ` Paolo Bonzini
2012-01-16 16:30 ` [Qemu-devel] [PATCH 08/15] scsi: add SCSIDevice vmstate definitions Paolo Bonzini
` (9 subsequent siblings)
16 siblings, 0 replies; 30+ messages in thread
From: Paolo Bonzini @ 2012-01-16 16:30 UTC (permalink / raw)
To: qemu-devel
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
hw/scsi-bus.c | 1 +
hw/scsi-disk.c | 63 ++++++++++++++++++++++++++++++++++++++++++++-----------
2 files changed, 51 insertions(+), 13 deletions(-)
diff --git a/hw/scsi-bus.c b/hw/scsi-bus.c
index b774261..ff7e4f4 100644
--- a/hw/scsi-bus.c
+++ b/hw/scsi-bus.c
@@ -51,6 +51,7 @@ static void scsi_dma_restart_bh(void *opaque)
scsi_req_continue(req);
break;
case SCSI_XFER_NONE:
+ assert(!req->sg);
scsi_req_dequeue(req);
scsi_req_enqueue(req);
break;
diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c
index 5d8bf53..28b217c 100644
--- a/hw/scsi-disk.c
+++ b/hw/scsi-disk.c
@@ -38,6 +38,7 @@ do { fprintf(stderr, "scsi-disk: " fmt , ## __VA_ARGS__); } while (0)
#include "sysemu.h"
#include "blockdev.h"
#include "block_int.h"
+#include "dma.h"
#ifdef __linux
#include <scsi/sg.h>
@@ -123,6 +124,27 @@ static uint32_t scsi_init_iovec(SCSIDiskReq *r)
return r->qiov.size / 512;
}
+static void scsi_dma_complete(void * opaque, int ret)
+{
+ SCSIDiskReq *r = (SCSIDiskReq *)opaque;
+ SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
+
+ bdrv_acct_done(s->qdev.conf.bs, &r->acct);
+
+ if (ret) {
+ if (scsi_handle_rw_error(r, -ret)) {
+ goto done;
+ }
+ }
+
+ r->sector += r->sector_count;
+ r->sector_count = 0;
+ scsi_req_complete(&r->req, GOOD);
+
+done:
+ scsi_req_unref(&r->req);
+}
+
static void scsi_read_complete(void * opaque, int ret)
{
SCSIDiskReq *r = (SCSIDiskReq *)opaque;
@@ -213,10 +235,17 @@ static void scsi_read_data(SCSIRequest *req)
return;
}
- n = scsi_init_iovec(r);
- bdrv_acct_start(s->qdev.conf.bs, &r->acct, n * BDRV_SECTOR_SIZE, BDRV_ACCT_READ);
- r->req.aiocb = bdrv_aio_readv(s->qdev.conf.bs, r->sector, &r->qiov, n,
- scsi_read_complete, r);
+ if (r->req.sg) {
+ dma_acct_start(s->qdev.conf.bs, &r->acct, r->req.sg, BDRV_ACCT_READ);
+ r->req.resid -= r->req.sg->size;
+ r->req.aiocb = dma_bdrv_read(s->qdev.conf.bs, r->req.sg, r->sector,
+ scsi_dma_complete, r);
+ } else {
+ n = scsi_init_iovec(r);
+ bdrv_acct_start(s->qdev.conf.bs, &r->acct, n * BDRV_SECTOR_SIZE, BDRV_ACCT_READ);
+ r->req.aiocb = bdrv_aio_readv(s->qdev.conf.bs, r->sector, &r->qiov, n,
+ scsi_read_complete, r);
+ }
}
/*
@@ -315,18 +344,26 @@ static void scsi_write_data(SCSIRequest *req)
return;
}
- n = r->qiov.size / 512;
- if (n) {
- if (s->tray_open) {
- scsi_write_complete(r, -ENOMEDIUM);
- return;
- }
+ if (!r->req.sg && !r->qiov.size) {
+ /* Called for the first time. Ask the driver to send us more data. */
+ scsi_write_complete(r, 0);
+ return;
+ }
+ if (s->tray_open) {
+ scsi_write_complete(r, -ENOMEDIUM);
+ return;
+ }
+
+ if (r->req.sg) {
+ dma_acct_start(s->qdev.conf.bs, &r->acct, r->req.sg, BDRV_ACCT_WRITE);
+ r->req.resid -= r->req.sg->size;
+ r->req.aiocb = dma_bdrv_write(s->qdev.conf.bs, r->req.sg, r->sector,
+ scsi_dma_complete, r);
+ } else {
+ n = r->qiov.size / 512;
bdrv_acct_start(s->qdev.conf.bs, &r->acct, n * BDRV_SECTOR_SIZE, BDRV_ACCT_WRITE);
r->req.aiocb = bdrv_aio_writev(s->qdev.conf.bs, r->sector, &r->qiov, n,
scsi_write_complete, r);
- } else {
- /* Called for the first time. Ask the driver to send us more data. */
- scsi_write_complete(r, 0);
}
}
--
1.7.7.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [Qemu-devel] [PATCH 08/15] scsi: add SCSIDevice vmstate definitions
2012-01-16 16:30 [Qemu-devel] [PATCH v2 00/15] SCSI s/g + SCSI migration + virtio-scsi Paolo Bonzini
` (6 preceding siblings ...)
2012-01-16 16:30 ` [Qemu-devel] [PATCH 07/15] scsi-disk: enable " Paolo Bonzini
@ 2012-01-16 16:30 ` Paolo Bonzini
2012-01-16 16:30 ` [Qemu-devel] [PATCH 09/15] scsi-generic: add migration support Paolo Bonzini
` (8 subsequent siblings)
16 siblings, 0 replies; 30+ messages in thread
From: Paolo Bonzini @ 2012-01-16 16:30 UTC (permalink / raw)
To: qemu-devel
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
hw/scsi-bus.c | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--
hw/scsi.h | 16 ++++++++
2 files changed, 121 insertions(+), 3 deletions(-)
diff --git a/hw/scsi-bus.c b/hw/scsi-bus.c
index ff7e4f4..a1bfbbe 100644
--- a/hw/scsi-bus.c
+++ b/hw/scsi-bus.c
@@ -628,10 +628,8 @@ void scsi_req_build_sense(SCSIRequest *req, SCSISense sense)
req->sense_len = 18;
}
-int32_t scsi_req_enqueue(SCSIRequest *req)
+static void scsi_req_enqueue_internal(SCSIRequest *req)
{
- int32_t rc;
-
assert(!req->enqueued);
scsi_req_ref(req);
if (req->bus->info->get_sg_list) {
@@ -641,7 +639,14 @@ int32_t scsi_req_enqueue(SCSIRequest *req)
}
req->enqueued = true;
QTAILQ_INSERT_TAIL(&req->dev->requests, req, next);
+}
+int32_t scsi_req_enqueue(SCSIRequest *req)
+{
+ int32_t rc;
+
+ assert (!req->retry);
+ scsi_req_enqueue_internal(req);
scsi_req_ref(req);
rc = req->ops->send_command(req, req->cmd.buf);
scsi_req_unref(req);
@@ -1422,3 +1427,100 @@ SCSIDevice *scsi_device_find(SCSIBus *bus, int channel, int id, int lun)
}
return target_dev;
}
+
+
+/* SCSI request list. For simplicity, pv points to the whole device */
+
+static void put_scsi_requests(QEMUFile *f, void *pv, size_t size)
+{
+ SCSIDevice *s = pv;
+ SCSIBus *bus = DO_UPCAST(SCSIBus, qbus, s->qdev.parent_bus);
+ SCSIRequest *req;
+
+ QTAILQ_FOREACH(req, &s->requests, next) {
+ assert(!req->io_canceled);
+ assert(req->status == -1);
+ assert(req->retry);
+ assert(req->enqueued);
+
+ qemu_put_sbyte(f, 1);
+ qemu_put_buffer(f, req->cmd.buf, sizeof(req->cmd.buf));
+ qemu_put_be32s(f, &req->tag);
+ qemu_put_be32s(f, &req->lun);
+ if (bus->info->save_request) {
+ bus->info->save_request(f, req);
+ }
+ if (req->ops->save_request) {
+ req->ops->save_request(f, req);
+ }
+ }
+ qemu_put_sbyte(f, 0);
+}
+
+static int get_scsi_requests(QEMUFile *f, void *pv, size_t size)
+{
+ SCSIDevice *s = pv;
+ SCSIBus *bus = DO_UPCAST(SCSIBus, qbus, s->qdev.parent_bus);
+
+ while (qemu_get_sbyte(f)) {
+ uint8_t buf[SCSI_CMD_BUF_SIZE];
+ uint32_t tag;
+ uint32_t lun;
+ SCSIRequest *req;
+
+ qemu_get_buffer(f, buf, sizeof(buf));
+ qemu_get_be32s(f, &tag);
+ qemu_get_be32s(f, &lun);
+ req = scsi_req_new(s, tag, lun, buf, NULL);
+ if (bus->info->load_request) {
+ req->hba_private = bus->info->load_request(f, req);
+ }
+ if (req->ops->load_request) {
+ req->ops->load_request(f, req);
+ }
+
+ /* Just restart it later. */
+ req->retry = true;
+ scsi_req_enqueue_internal(req);
+
+ /* At this point, the request will be kept alive by the reference
+ * added by scsi_req_enqueue_internal, so we can release our reference.
+ * The HBA of course will add its own reference in the load_request
+ * callback if it needs to hold on the SCSIRequest.
+ */
+ scsi_req_unref(req);
+ }
+
+ return 0;
+}
+
+const VMStateInfo vmstate_info_scsi_requests = {
+ .name = "scsi-requests",
+ .get = get_scsi_requests,
+ .put = put_scsi_requests,
+};
+
+const VMStateDescription vmstate_scsi_device = {
+ .name = "SCSIDevice",
+ .version_id = 1,
+ .minimum_version_id = 1,
+ .minimum_version_id_old = 1,
+ .fields = (VMStateField[]) {
+ VMSTATE_UINT8(unit_attention.key, SCSIDevice),
+ VMSTATE_UINT8(unit_attention.asc, SCSIDevice),
+ VMSTATE_UINT8(unit_attention.ascq, SCSIDevice),
+ VMSTATE_BOOL(sense_is_ua, SCSIDevice),
+ VMSTATE_UINT8_ARRAY(sense, SCSIDevice, SCSI_SENSE_BUF_SIZE),
+ VMSTATE_UINT32(sense_len, SCSIDevice),
+ {
+ .name = "requests",
+ .version_id = 0,
+ .field_exists = NULL,
+ .size = 0, /* ouch */
+ .info = &vmstate_info_scsi_requests,
+ .flags = VMS_SINGLE,
+ .offset = 0,
+ },
+ VMSTATE_END_OF_LIST()
+ }
+};
diff --git a/hw/scsi.h b/hw/scsi.h
index 5b1ca60..f933937 100644
--- a/hw/scsi.h
+++ b/hw/scsi.h
@@ -81,6 +81,16 @@ struct SCSIDevice
uint64_t max_lba;
};
+extern const VMStateDescription vmstate_scsi_device;
+
+#define VMSTATE_SCSI_DEVICE(_field, _state) { \
+ .name = (stringify(_field)), \
+ .size = sizeof(SCSIDevice), \
+ .vmsd = &vmstate_scsi_device, \
+ .flags = VMS_STRUCT, \
+ .offset = vmstate_offset_value(_state, _field, SCSIDevice), \
+}
+
/* cdrom.c */
int cdrom_read_toc(int nb_sectors, uint8_t *buf, int msf, int start_track);
int cdrom_read_toc_raw(int nb_sectors, uint8_t *buf, int msf, int session_num);
@@ -94,6 +104,9 @@ struct SCSIReqOps {
void (*write_data)(SCSIRequest *req);
void (*cancel_io)(SCSIRequest *req);
uint8_t *(*get_buf)(SCSIRequest *req);
+
+ void (*save_request)(QEMUFile *f, SCSIRequest *req);
+ void (*load_request)(QEMUFile *f, SCSIRequest *req);
};
typedef int (*scsi_qdev_initfn)(SCSIDevice *dev);
@@ -113,6 +126,9 @@ struct SCSIBusInfo {
void (*complete)(SCSIRequest *req, uint32_t arg, int32_t len);
void (*cancel)(SCSIRequest *req);
QEMUSGList *(*get_sg_list)(SCSIRequest *req);
+
+ void (*save_request)(QEMUFile *f, SCSIRequest *req);
+ void *(*load_request)(QEMUFile *f, SCSIRequest *req);
};
struct SCSIBus {
--
1.7.7.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [Qemu-devel] [PATCH 09/15] scsi-generic: add migration support
2012-01-16 16:30 [Qemu-devel] [PATCH v2 00/15] SCSI s/g + SCSI migration + virtio-scsi Paolo Bonzini
` (7 preceding siblings ...)
2012-01-16 16:30 ` [Qemu-devel] [PATCH 08/15] scsi: add SCSIDevice vmstate definitions Paolo Bonzini
@ 2012-01-16 16:30 ` Paolo Bonzini
2012-01-16 16:30 ` [Qemu-devel] [PATCH 10/15] scsi-disk: " Paolo Bonzini
` (7 subsequent siblings)
16 siblings, 0 replies; 30+ messages in thread
From: Paolo Bonzini @ 2012-01-16 16:30 UTC (permalink / raw)
To: qemu-devel
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
hw/scsi-generic.c | 25 +++++++++++++++++++++++++
1 files changed, 25 insertions(+), 0 deletions(-)
diff --git a/hw/scsi-generic.c b/hw/scsi-generic.c
index 0aebcdd..12d7d15 100644
--- a/hw/scsi-generic.c
+++ b/hw/scsi-generic.c
@@ -59,6 +59,28 @@ typedef struct SCSIGenericReq {
sg_io_hdr_t io_header;
} SCSIGenericReq;
+static void scsi_generic_save_request(QEMUFile *f, SCSIRequest *req)
+{
+ SCSIGenericReq *r = DO_UPCAST(SCSIGenericReq, req, req);
+
+ qemu_put_sbe32s(f, &r->buflen);
+ if (r->buflen && r->req.cmd.mode == SCSI_XFER_TO_DEV) {
+ assert(!r->req.sg);
+ qemu_put_buffer(f, r->buf, r->req.cmd.xfer);
+ }
+}
+
+static void scsi_generic_load_request(QEMUFile *f, SCSIRequest *req)
+{
+ SCSIGenericReq *r = DO_UPCAST(SCSIGenericReq, req, req);
+
+ qemu_get_sbe32s(f, &r->buflen);
+ if (r->buflen && r->req.cmd.mode == SCSI_XFER_TO_DEV) {
+ assert(!r->req.sg);
+ qemu_get_buffer(f, r->buf, r->req.cmd.xfer);
+ }
+}
+
static void scsi_free_request(SCSIRequest *req)
{
SCSIGenericReq *r = DO_UPCAST(SCSIGenericReq, req, req);
@@ -446,6 +468,8 @@ const SCSIReqOps scsi_generic_req_ops = {
.write_data = scsi_write_data,
.cancel_io = scsi_cancel_io,
.get_buf = scsi_get_buf,
+ .load_request = scsi_generic_load_request,
+ .save_request = scsi_generic_save_request,
};
static SCSIRequest *scsi_new_request(SCSIDevice *d, uint32_t tag, uint32_t lun,
@@ -463,6 +487,7 @@ static SCSIDeviceInfo scsi_generic_info = {
.qdev.desc = "pass through generic scsi device (/dev/sg*)",
.qdev.size = sizeof(SCSIDevice),
.qdev.reset = scsi_generic_reset,
+ .qdev.vmsd = &vmstate_scsi_device,
.init = scsi_generic_initfn,
.destroy = scsi_destroy,
.alloc_req = scsi_new_request,
--
1.7.7.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [Qemu-devel] [PATCH 10/15] scsi-disk: add migration support
2012-01-16 16:30 [Qemu-devel] [PATCH v2 00/15] SCSI s/g + SCSI migration + virtio-scsi Paolo Bonzini
` (8 preceding siblings ...)
2012-01-16 16:30 ` [Qemu-devel] [PATCH 09/15] scsi-generic: add migration support Paolo Bonzini
@ 2012-01-16 16:30 ` Paolo Bonzini
2012-01-16 16:30 ` [Qemu-devel] [PATCH 11/15] virtio-scsi: Add virtio-scsi stub device Paolo Bonzini
` (6 subsequent siblings)
16 siblings, 0 replies; 30+ messages in thread
From: Paolo Bonzini @ 2012-01-16 16:30 UTC (permalink / raw)
To: qemu-devel
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
hw/scsi-disk.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 55 insertions(+), 4 deletions(-)
diff --git a/hw/scsi-disk.c b/hw/scsi-disk.c
index 28b217c..4465d76 100644
--- a/hw/scsi-disk.c
+++ b/hw/scsi-disk.c
@@ -111,12 +111,12 @@ static void scsi_cancel_io(SCSIRequest *req)
r->req.aiocb = NULL;
}
-static uint32_t scsi_init_iovec(SCSIDiskReq *r)
+static uint32_t scsi_init_iovec(SCSIDiskReq *r, size_t size)
{
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
if (!r->iov.iov_base) {
- r->buflen = SCSI_DMA_BUF_SIZE;
+ r->buflen = size;
r->iov.iov_base = qemu_blockalign(s->qdev.conf.bs, r->buflen);
}
r->iov.iov_len = MIN(r->sector_count * 512, r->buflen);
@@ -124,6 +124,35 @@ static uint32_t scsi_init_iovec(SCSIDiskReq *r)
return r->qiov.size / 512;
}
+static void scsi_disk_save_request(QEMUFile *f, SCSIRequest *req)
+{
+ SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
+
+ qemu_put_be64s(f, &r->sector);
+ qemu_put_be32s(f, &r->sector_count);
+ qemu_put_be32s(f, &r->buflen);
+ if (r->buflen && r->req.cmd.mode == SCSI_XFER_TO_DEV) {
+ qemu_put_buffer(f, r->iov.iov_base, r->iov.iov_len);
+ }
+}
+
+static void scsi_disk_load_request(QEMUFile *f, SCSIRequest *req)
+{
+ SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
+
+ qemu_get_be64s(f, &r->sector);
+ qemu_get_be32s(f, &r->sector_count);
+ qemu_get_be32s(f, &r->buflen);
+ if (r->buflen) {
+ scsi_init_iovec(r, r->buflen);
+ if (r->req.cmd.mode == SCSI_XFER_TO_DEV) {
+ qemu_get_buffer(f, r->iov.iov_base, r->iov.iov_len);
+ }
+ }
+
+ qemu_iovec_init_external(&r->qiov, &r->iov, 1);
+}
+
static void scsi_dma_complete(void * opaque, int ret)
{
SCSIDiskReq *r = (SCSIDiskReq *)opaque;
@@ -241,7 +270,7 @@ static void scsi_read_data(SCSIRequest *req)
r->req.aiocb = dma_bdrv_read(s->qdev.conf.bs, r->req.sg, r->sector,
scsi_dma_complete, r);
} else {
- n = scsi_init_iovec(r);
+ n = scsi_init_iovec(r, SCSI_DMA_BUF_SIZE);
bdrv_acct_start(s->qdev.conf.bs, &r->acct, n * BDRV_SECTOR_SIZE, BDRV_ACCT_READ);
r->req.aiocb = bdrv_aio_readv(s->qdev.conf.bs, r->sector, &r->qiov, n,
scsi_read_complete, r);
@@ -316,7 +345,7 @@ static void scsi_write_complete(void * opaque, int ret)
if (r->sector_count == 0) {
scsi_req_complete(&r->req, GOOD);
} else {
- scsi_init_iovec(r);
+ scsi_init_iovec(r, SCSI_DMA_BUF_SIZE);
DPRINTF("Write complete tag=0x%x more=%d\n", r->req.tag, r->qiov.size);
scsi_req_data(&r->req, r->qiov.size);
}
@@ -1629,6 +1658,8 @@ static const SCSIReqOps scsi_disk_reqops = {
.write_data = scsi_write_data,
.cancel_io = scsi_cancel_io,
.get_buf = scsi_get_buf,
+ .load_request = scsi_disk_load_request,
+ .save_request = scsi_disk_save_request,
};
static SCSIRequest *scsi_new_request(SCSIDevice *d, uint32_t tag, uint32_t lun,
@@ -1757,6 +1788,22 @@ static SCSIRequest *scsi_block_new_request(SCSIDevice *d, uint32_t tag,
DEFINE_PROP_STRING("ver", SCSIDiskState, version), \
DEFINE_PROP_STRING("serial", SCSIDiskState, serial)
+static const VMStateDescription vmstate_scsi_disk_state = {
+ .name = "scsi-disk",
+ .version_id = 1,
+ .minimum_version_id = 1,
+ .minimum_version_id_old = 1,
+ .fields = (VMStateField[]) {
+ VMSTATE_SCSI_DEVICE(qdev, SCSIDiskState),
+ VMSTATE_BOOL(media_changed, SCSIDiskState),
+ VMSTATE_BOOL(media_event, SCSIDiskState),
+ VMSTATE_BOOL(eject_request, SCSIDiskState),
+ VMSTATE_BOOL(tray_open, SCSIDiskState),
+ VMSTATE_BOOL(tray_locked, SCSIDiskState),
+ VMSTATE_END_OF_LIST()
+ }
+};
+
static SCSIDeviceInfo scsi_disk_info[] = {
{
.qdev.name = "scsi-hd",
@@ -1764,6 +1811,7 @@ static SCSIDeviceInfo scsi_disk_info[] = {
.qdev.desc = "virtual SCSI disk",
.qdev.size = sizeof(SCSIDiskState),
.qdev.reset = scsi_disk_reset,
+ .qdev.vmsd = &vmstate_scsi_disk_state,
.init = scsi_hd_initfn,
.destroy = scsi_destroy,
.alloc_req = scsi_new_request,
@@ -1779,6 +1827,7 @@ static SCSIDeviceInfo scsi_disk_info[] = {
.qdev.desc = "virtual SCSI CD-ROM",
.qdev.size = sizeof(SCSIDiskState),
.qdev.reset = scsi_disk_reset,
+ .qdev.vmsd = &vmstate_scsi_disk_state,
.init = scsi_cd_initfn,
.destroy = scsi_destroy,
.alloc_req = scsi_new_request,
@@ -1794,6 +1843,7 @@ static SCSIDeviceInfo scsi_disk_info[] = {
.qdev.desc = "SCSI block device passthrough",
.qdev.size = sizeof(SCSIDiskState),
.qdev.reset = scsi_disk_reset,
+ .qdev.vmsd = &vmstate_scsi_disk_state,
.init = scsi_block_initfn,
.destroy = scsi_destroy,
.alloc_req = scsi_block_new_request,
@@ -1808,6 +1858,7 @@ static SCSIDeviceInfo scsi_disk_info[] = {
.qdev.desc = "virtual SCSI disk or CD-ROM (legacy)",
.qdev.size = sizeof(SCSIDiskState),
.qdev.reset = scsi_disk_reset,
+ .qdev.vmsd = &vmstate_scsi_disk_state,
.init = scsi_disk_initfn,
.destroy = scsi_destroy,
.alloc_req = scsi_new_request,
--
1.7.7.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [Qemu-devel] [PATCH 11/15] virtio-scsi: Add virtio-scsi stub device
2012-01-16 16:30 [Qemu-devel] [PATCH v2 00/15] SCSI s/g + SCSI migration + virtio-scsi Paolo Bonzini
` (9 preceding siblings ...)
2012-01-16 16:30 ` [Qemu-devel] [PATCH 10/15] scsi-disk: " Paolo Bonzini
@ 2012-01-16 16:30 ` Paolo Bonzini
2012-02-10 12:41 ` Stefan Hajnoczi
2012-01-16 16:30 ` [Qemu-devel] [PATCH 12/15] virtio-scsi: Add basic request processing infrastructure Paolo Bonzini
` (5 subsequent siblings)
16 siblings, 1 reply; 30+ messages in thread
From: Paolo Bonzini @ 2012-01-16 16:30 UTC (permalink / raw)
To: qemu-devel; +Cc: Stefan Hajnoczi
From: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
Add a useless virtio SCSI HBA device:
qemu -device virtio-scsi-pci
Signed-off-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
Makefile.target | 1 +
default-configs/pci.mak | 1 +
default-configs/s390x-softmmu.mak | 1 +
hw/pci.h | 1 +
hw/s390-virtio-bus.c | 24 ++++
hw/s390-virtio-bus.h | 2 +
hw/virtio-pci.c | 42 +++++++
hw/virtio-pci.h | 2 +
hw/virtio-scsi.c | 228 +++++++++++++++++++++++++++++++++++++
hw/virtio-scsi.h | 36 ++++++
hw/virtio.h | 3 +
11 files changed, 341 insertions(+), 0 deletions(-)
create mode 100644 hw/virtio-scsi.c
create mode 100644 hw/virtio-scsi.h
diff --git a/Makefile.target b/Makefile.target
index 18be624..d255ff5 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -191,6 +191,7 @@ obj-y = arch_init.o cpus.o monitor.o machine.o gdbstub.o balloon.o ioport.o
# need to fix this properly
obj-$(CONFIG_NO_PCI) += pci-stub.o
obj-$(CONFIG_VIRTIO) += virtio.o virtio-blk.o virtio-balloon.o virtio-net.o virtio-serial-bus.o
+obj-$(CONFIG_VIRTIO_SCSI) += virtio-scsi.o
obj-y += vhost_net.o
obj-$(CONFIG_VHOST_NET) += vhost.o
obj-$(CONFIG_REALLY_VIRTFS) += 9pfs/virtio-9p-device.o
diff --git a/default-configs/pci.mak b/default-configs/pci.mak
index 22bd350..9c8edd4 100644
--- a/default-configs/pci.mak
+++ b/default-configs/pci.mak
@@ -1,5 +1,6 @@
CONFIG_PCI=y
CONFIG_VIRTIO_PCI=y
+CONFIG_VIRTIO_SCSI=y
CONFIG_VIRTIO=y
CONFIG_USB_UHCI=y
CONFIG_USB_OHCI=y
diff --git a/default-configs/s390x-softmmu.mak b/default-configs/s390x-softmmu.mak
index 3005729..e588803 100644
--- a/default-configs/s390x-softmmu.mak
+++ b/default-configs/s390x-softmmu.mak
@@ -1 +1,2 @@
CONFIG_VIRTIO=y
+CONFIG_VIRTIO_SCSI=y
diff --git a/hw/pci.h b/hw/pci.h
index 625e717..767bcd4 100644
--- a/hw/pci.h
+++ b/hw/pci.h
@@ -75,6 +75,7 @@
#define PCI_DEVICE_ID_VIRTIO_BLOCK 0x1001
#define PCI_DEVICE_ID_VIRTIO_BALLOON 0x1002
#define PCI_DEVICE_ID_VIRTIO_CONSOLE 0x1003
+#define PCI_DEVICE_ID_VIRTIO_SCSI 0x1004
#define FMT_PCIBUS PRIx64
diff --git a/hw/s390-virtio-bus.c b/hw/s390-virtio-bus.c
index c4b9a99..2da52c2 100644
--- a/hw/s390-virtio-bus.c
+++ b/hw/s390-virtio-bus.c
@@ -158,6 +158,18 @@ static int s390_virtio_serial_init(VirtIOS390Device *dev)
return r;
}
+static int s390_virtio_scsi_init(VirtIOS390Device *dev)
+{
+ VirtIODevice *vdev;
+
+ vdev = virtio_scsi_init((DeviceState *)dev, &dev->scsi);
+ if (!vdev) {
+ return -1;
+ }
+
+ return s390_virtio_device_init(dev, vdev);
+}
+
static uint64_t s390_virtio_device_vq_token(VirtIOS390Device *dev, int vq)
{
ram_addr_t token_off;
@@ -370,6 +382,17 @@ static VirtIOS390DeviceInfo s390_virtio_serial = {
},
};
+static VirtIOS390DeviceInfo s390_virtio_scsi = {
+ .init = s390_virtio_scsi_init,
+ .qdev.name = "virtio-scsi-s390",
+ .qdev.alias = "virtio-scsi",
+ .qdev.size = sizeof(VirtIOS390Device),
+ .qdev.props = (Property[]) {
+ DEFINE_VIRTIO_SCSI_PROPERTIES(VirtIOS390Device, host_features, scsi),
+ DEFINE_PROP_END_OF_LIST(),
+ },
+};
+
static int s390_virtio_busdev_init(DeviceState *dev, DeviceInfo *info)
{
VirtIOS390DeviceInfo *_info = (VirtIOS390DeviceInfo *)info;
@@ -392,6 +415,7 @@ static void s390_virtio_register(void)
s390_virtio_bus_register_withprop(&s390_virtio_serial);
s390_virtio_bus_register_withprop(&s390_virtio_blk);
s390_virtio_bus_register_withprop(&s390_virtio_net);
+ s390_virtio_bus_register_withprop(&s390_virtio_scsi);
}
device_init(s390_virtio_register);
diff --git a/hw/s390-virtio-bus.h b/hw/s390-virtio-bus.h
index f1bece7..a840936 100644
--- a/hw/s390-virtio-bus.h
+++ b/hw/s390-virtio-bus.h
@@ -19,6 +19,7 @@
#include "virtio-net.h"
#include "virtio-serial.h"
+#include "virtio-scsi.h"
#define VIRTIO_DEV_OFFS_TYPE 0 /* 8 bits */
#define VIRTIO_DEV_OFFS_NUM_VQ 1 /* 8 bits */
@@ -47,6 +48,7 @@ typedef struct VirtIOS390Device {
uint32_t host_features;
virtio_serial_conf serial;
virtio_net_conf net;
+ VirtIOSCSIConf scsi;
} VirtIOS390Device;
typedef struct VirtIOS390Bus {
diff --git a/hw/virtio-pci.c b/hw/virtio-pci.c
index 77b75bc..4980536 100644
--- a/hw/virtio-pci.c
+++ b/hw/virtio-pci.c
@@ -19,6 +19,7 @@
#include "virtio-blk.h"
#include "virtio-net.h"
#include "virtio-serial.h"
+#include "virtio-scsi.h"
#include "pci.h"
#include "qemu-error.h"
#include "msix.h"
@@ -780,6 +781,32 @@ static int virtio_balloon_exit_pci(PCIDevice *pci_dev)
return virtio_exit_pci(pci_dev);
}
+static int virtio_scsi_init_pci(PCIDevice *pci_dev)
+{
+ VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
+ VirtIODevice *vdev;
+
+ vdev = virtio_scsi_init(&pci_dev->qdev, &proxy->scsi);
+ if (!vdev) {
+ return -EINVAL;
+ }
+
+ vdev->nvectors = proxy->nvectors;
+ virtio_init_pci(proxy, vdev);
+
+ /* make the actual value visible */
+ proxy->nvectors = vdev->nvectors;
+ return 0;
+}
+
+static int virtio_scsi_exit_pci(PCIDevice *pci_dev)
+{
+ VirtIOPCIProxy *proxy = DO_UPCAST(VirtIOPCIProxy, pci_dev, pci_dev);
+
+ virtio_scsi_exit(proxy->vdev);
+ return virtio_exit_pci(pci_dev);
+}
+
static PCIDeviceInfo virtio_info[] = {
{
.qdev.name = "virtio-blk-pci",
@@ -865,6 +892,21 @@ static PCIDeviceInfo virtio_info[] = {
},
.qdev.reset = virtio_pci_reset,
},{
+ .qdev.name = "virtio-scsi-pci",
+ .qdev.alias = "virtio-scsi",
+ .qdev.size = sizeof(VirtIOPCIProxy),
+ .init = virtio_scsi_init_pci,
+ .exit = virtio_scsi_exit_pci,
+ .vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET,
+ .device_id = PCI_DEVICE_ID_VIRTIO_SCSI,
+ .class_id = PCI_CLASS_STORAGE_SCSI,
+ .revision = 0x00,
+ .qdev.props = (Property[]) {
+ DEFINE_PROP_UINT32("vectors", VirtIOPCIProxy, nvectors, 2),
+ DEFINE_VIRTIO_SCSI_PROPERTIES(VirtIOPCIProxy, host_features, scsi),
+ DEFINE_PROP_END_OF_LIST(),
+ },
+ }, {
/* end of list */
}
};
diff --git a/hw/virtio-pci.h b/hw/virtio-pci.h
index 344c22b..e560428 100644
--- a/hw/virtio-pci.h
+++ b/hw/virtio-pci.h
@@ -17,6 +17,7 @@
#include "virtio-net.h"
#include "virtio-serial.h"
+#include "virtio-scsi.h"
/* Performance improves when virtqueue kick processing is decoupled from the
* vcpu thread using ioeventfd for some devices. */
@@ -40,6 +41,7 @@ typedef struct {
#endif
virtio_serial_conf serial;
virtio_net_conf net;
+ VirtIOSCSIConf scsi;
bool ioeventfd_disabled;
bool ioeventfd_started;
} VirtIOPCIProxy;
diff --git a/hw/virtio-scsi.c b/hw/virtio-scsi.c
new file mode 100644
index 0000000..7ebfba7
--- /dev/null
+++ b/hw/virtio-scsi.c
@@ -0,0 +1,228 @@
+/*
+ * Virtio SCSI HBA
+ *
+ * Copyright IBM, Corp. 2010
+ * Copyright Red Hat, Inc. 2011
+ *
+ * Authors:
+ * Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
+ * Paolo Bonzini <pbonzini@redhat.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ *
+ */
+
+#include "virtio-scsi.h"
+#include <hw/scsi.h>
+#include <hw/scsi-defs.h>
+
+#define VIRTIO_SCSI_VQ_SIZE 128
+#define VIRTIO_SCSI_CDB_SIZE 32
+#define VIRTIO_SCSI_SENSE_SIZE 96
+#define VIRTIO_SCSI_MAX_CHANNEL 0
+#define VIRTIO_SCSI_MAX_TARGET 255
+#define VIRTIO_SCSI_MAX_LUN 16383
+
+/* Response codes */
+#define VIRTIO_SCSI_S_OK 0
+#define VIRTIO_SCSI_S_OVERRUN 1
+#define VIRTIO_SCSI_S_ABORTED 2
+#define VIRTIO_SCSI_S_BAD_TARGET 3
+#define VIRTIO_SCSI_S_RESET 4
+#define VIRTIO_SCSI_S_BUSY 5
+#define VIRTIO_SCSI_S_TRANSPORT_FAILURE 6
+#define VIRTIO_SCSI_S_TARGET_FAILURE 7
+#define VIRTIO_SCSI_S_NEXUS_FAILURE 8
+#define VIRTIO_SCSI_S_FAILURE 9
+#define VIRTIO_SCSI_S_FUNCTION_SUCCEEDED 10
+#define VIRTIO_SCSI_S_FUNCTION_REJECTED 11
+#define VIRTIO_SCSI_S_INCORRECT_LUN 12
+
+/* Controlq type codes. */
+#define VIRTIO_SCSI_T_TMF 0
+#define VIRTIO_SCSI_T_AN_QUERY 1
+#define VIRTIO_SCSI_T_AN_SUBSCRIBE 2
+
+/* Valid TMF subtypes. */
+#define VIRTIO_SCSI_T_TMF_ABORT_TASK 0
+#define VIRTIO_SCSI_T_TMF_ABORT_TASK_SET 1
+#define VIRTIO_SCSI_T_TMF_CLEAR_ACA 2
+#define VIRTIO_SCSI_T_TMF_CLEAR_TASK_SET 3
+#define VIRTIO_SCSI_T_TMF_I_T_NEXUS_RESET 4
+#define VIRTIO_SCSI_T_TMF_LOGICAL_UNIT_RESET 5
+#define VIRTIO_SCSI_T_TMF_QUERY_TASK 6
+#define VIRTIO_SCSI_T_TMF_QUERY_TASK_SET 7
+
+/* Events. */
+#define VIRTIO_SCSI_T_EVENTS_MISSED 0x80000000
+#define VIRTIO_SCSI_T_NO_EVENT 0
+#define VIRTIO_SCSI_T_TRANSPORT_RESET 1
+#define VIRTIO_SCSI_T_ASYNC_NOTIFY 2
+
+/* SCSI command request, followed by data-out */
+typedef struct {
+ uint8_t lun[8]; /* Logical Unit Number */
+ uint64_t tag; /* Command identifier */
+ uint8_t task_attr; /* Task attribute */
+ uint8_t prio;
+ uint8_t crn;
+ uint8_t cdb[];
+} QEMU_PACKED VirtIOSCSICmdReq;
+
+/* Response, followed by sense data and data-in */
+typedef struct {
+ uint32_t sense_len; /* Sense data length */
+ uint32_t resid; /* Residual bytes in data buffer */
+ uint16_t status_qualifier; /* Status qualifier */
+ uint8_t status; /* Command completion status */
+ uint8_t response; /* Response values */
+ uint8_t sense[];
+} QEMU_PACKED VirtIOSCSICmdResp;
+
+/* Task Management Request */
+typedef struct {
+ uint32_t type;
+ uint32_t subtype;
+ uint8_t lun[8];
+ uint64_t tag;
+} QEMU_PACKED VirtIOSCSICtrlTMFReq;
+
+typedef struct {
+ uint8_t response;
+} QEMU_PACKED VirtIOSCSICtrlTMFResp;
+
+/* Asynchronous notification query/subscription */
+typedef struct {
+ uint32_t type;
+ uint8_t lun[8];
+ uint32_t event_requested;
+} QEMU_PACKED VirtIOSCSICtrlANReq;
+
+typedef struct {
+ uint32_t event_actual;
+ uint8_t response;
+} QEMU_PACKED VirtIOSCSICtrlANResp;
+
+typedef struct {
+ uint32_t event;
+ uint8_t lun[8];
+ uint32_t reason;
+} QEMU_PACKED VirtIOSCSIEvent;
+
+typedef struct {
+ uint32_t num_queues;
+ uint32_t seg_max;
+ uint32_t max_sectors;
+ uint32_t cmd_per_lun;
+ uint32_t event_info_size;
+ uint32_t sense_size;
+ uint32_t cdb_size;
+ uint16_t max_channel;
+ uint16_t max_target;
+ uint32_t max_lun;
+} QEMU_PACKED VirtIOSCSIConfig;
+
+typedef struct {
+ VirtIODevice vdev;
+ DeviceState *qdev;
+ VirtIOSCSIConf *conf;
+
+ VirtQueue *ctrl_vq;
+ VirtQueue *event_vq;
+ VirtQueue *cmd_vq;
+ uint32_t sense_size;
+ uint32_t cdb_size;
+} VirtIOSCSI;
+
+static void virtio_scsi_handle_ctrl(VirtIODevice *vdev, VirtQueue *vq)
+{
+ /* TODO */
+}
+
+static void virtio_scsi_handle_cmd(VirtIODevice *vdev, VirtQueue *vq)
+{
+ /* TODO */
+}
+
+static void virtio_scsi_get_config(VirtIODevice *vdev,
+ uint8_t *config)
+{
+ VirtIOSCSIConfig *scsiconf = (VirtIOSCSIConfig *)config;
+ VirtIOSCSI *s = (VirtIOSCSI *)vdev;
+
+ stl_raw(&scsiconf->num_queues, s->conf->num_queues);
+ stl_raw(&scsiconf->seg_max, 128 - 2);
+ stl_raw(&scsiconf->max_sectors, s->conf->max_sectors);
+ stl_raw(&scsiconf->cmd_per_lun, s->conf->cmd_per_lun);
+ stl_raw(&scsiconf->event_info_size, sizeof(VirtIOSCSIEvent));
+ stl_raw(&scsiconf->sense_size, s->sense_size);
+ stl_raw(&scsiconf->cdb_size, s->cdb_size);
+ stl_raw(&scsiconf->max_channel, VIRTIO_SCSI_MAX_CHANNEL);
+ stl_raw(&scsiconf->max_target, VIRTIO_SCSI_MAX_TARGET);
+ stl_raw(&scsiconf->max_lun, VIRTIO_SCSI_MAX_LUN);
+}
+
+static void virtio_scsi_set_config(VirtIODevice *vdev,
+ const uint8_t *config)
+{
+ VirtIOSCSIConfig *scsiconf = (VirtIOSCSIConfig *)config;
+ VirtIOSCSI *s = (VirtIOSCSI *)vdev;
+
+ if ((uint32_t) ldl_raw(&scsiconf->sense_size) >= 65536 ||
+ (uint32_t) ldl_raw(&scsiconf->cdb_size) >= 256) {
+ error_report("bad data written to virtio-scsi configuration space");
+ exit(1);
+ }
+
+ s->sense_size = ldl_raw(&scsiconf->sense_size);
+ s->cdb_size = ldl_raw(&scsiconf->cdb_size);
+}
+
+static uint32_t virtio_scsi_get_features(VirtIODevice *vdev,
+ uint32_t requested_features)
+{
+ return requested_features;
+}
+
+static void virtio_scsi_reset(VirtIODevice *vdev)
+{
+ VirtIOSCSI *s = (VirtIOSCSI *)vdev;
+
+ s->sense_size = VIRTIO_SCSI_SENSE_SIZE;
+ s->cdb_size = VIRTIO_SCSI_CDB_SIZE;
+}
+
+VirtIODevice *virtio_scsi_init(DeviceState *dev, VirtIOSCSIConf *proxyconf)
+{
+ VirtIOSCSI *s;
+
+ s = (VirtIOSCSI *)virtio_common_init("virtio-scsi", VIRTIO_ID_SCSI,
+ sizeof(VirtIOSCSIConfig),
+ sizeof(VirtIOSCSI));
+
+ s->qdev = dev;
+ s->conf = proxyconf;
+
+ /* TODO set up vdev function pointers */
+ s->vdev.get_config = virtio_scsi_get_config;
+ s->vdev.set_config = virtio_scsi_set_config;
+ s->vdev.get_features = virtio_scsi_get_features;
+ s->vdev.reset = virtio_scsi_reset;
+
+ s->ctrl_vq = virtio_add_queue(&s->vdev, VIRTIO_SCSI_VQ_SIZE,
+ virtio_scsi_handle_ctrl);
+ s->event_vq = virtio_add_queue(&s->vdev, VIRTIO_SCSI_VQ_SIZE,
+ NULL);
+ s->cmd_vq = virtio_add_queue(&s->vdev, VIRTIO_SCSI_VQ_SIZE,
+ virtio_scsi_handle_cmd);
+
+ /* TODO savevm */
+
+ return &s->vdev;
+}
+
+void virtio_scsi_exit(VirtIODevice *vdev)
+{
+ virtio_cleanup(vdev);
+}
diff --git a/hw/virtio-scsi.h b/hw/virtio-scsi.h
new file mode 100644
index 0000000..72928ab
--- /dev/null
+++ b/hw/virtio-scsi.h
@@ -0,0 +1,36 @@
+/*
+ * Virtio SCSI HBA
+ *
+ * Copyright IBM, Corp. 2010
+ *
+ * Authors:
+ * Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2. See
+ * the COPYING file in the top-level directory.
+ *
+ */
+
+#ifndef _QEMU_VIRTIO_SCSI_H
+#define _QEMU_VIRTIO_SCSI_H
+
+#include "virtio.h"
+#include "net.h"
+#include "pci.h"
+
+/* The ID for virtio_scsi */
+#define VIRTIO_ID_SCSI 7
+
+struct VirtIOSCSIConf {
+ uint32_t num_queues;
+ uint32_t max_sectors;
+ uint32_t cmd_per_lun;
+};
+
+#define DEFINE_VIRTIO_SCSI_PROPERTIES(_state, _features_field, _conf_field) \
+ DEFINE_VIRTIO_COMMON_FEATURES(_state, _features_field), \
+ DEFINE_PROP_UINT32("num_queues", _state, _conf_field.num_queues, 1), \
+ DEFINE_PROP_UINT32("max_sectors", _state, _conf_field.max_sectors, 0xFFFF), \
+ DEFINE_PROP_UINT32("cmd_per_lun", _state, _conf_field.cmd_per_lun, 128)
+
+#endif /* _QEMU_VIRTIO_SCSI_H */
diff --git a/hw/virtio.h b/hw/virtio.h
index 25f5564..400c092 100644
--- a/hw/virtio.h
+++ b/hw/virtio.h
@@ -199,6 +199,8 @@ VirtIODevice *virtio_net_init(DeviceState *dev, NICConf *conf,
typedef struct virtio_serial_conf virtio_serial_conf;
VirtIODevice *virtio_serial_init(DeviceState *dev, virtio_serial_conf *serial);
VirtIODevice *virtio_balloon_init(DeviceState *dev);
+typedef struct VirtIOSCSIConf VirtIOSCSIConf;
+VirtIODevice *virtio_scsi_init(DeviceState *dev, VirtIOSCSIConf *conf);
#ifdef CONFIG_LINUX
VirtIODevice *virtio_9p_init(DeviceState *dev, V9fsConf *conf);
#endif
@@ -208,6 +210,7 @@ void virtio_net_exit(VirtIODevice *vdev);
void virtio_blk_exit(VirtIODevice *vdev);
void virtio_serial_exit(VirtIODevice *vdev);
void virtio_balloon_exit(VirtIODevice *vdev);
+void virtio_scsi_exit(VirtIODevice *vdev);
#define DEFINE_VIRTIO_COMMON_FEATURES(_state, _field) \
DEFINE_PROP_BIT("indirect_desc", _state, _field, \
--
1.7.7.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [Qemu-devel] [PATCH 12/15] virtio-scsi: Add basic request processing infrastructure
2012-01-16 16:30 [Qemu-devel] [PATCH v2 00/15] SCSI s/g + SCSI migration + virtio-scsi Paolo Bonzini
` (10 preceding siblings ...)
2012-01-16 16:30 ` [Qemu-devel] [PATCH 11/15] virtio-scsi: Add virtio-scsi stub device Paolo Bonzini
@ 2012-01-16 16:30 ` Paolo Bonzini
2012-01-16 16:30 ` [Qemu-devel] [PATCH 13/15] virtio-scsi: add basic SCSI bus operation Paolo Bonzini
` (4 subsequent siblings)
16 siblings, 0 replies; 30+ messages in thread
From: Paolo Bonzini @ 2012-01-16 16:30 UTC (permalink / raw)
To: qemu-devel; +Cc: Stefan Hajnoczi
From: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
Signed-off-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
hw/virtio-scsi.c | 142 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 140 insertions(+), 2 deletions(-)
diff --git a/hw/virtio-scsi.c b/hw/virtio-scsi.c
index 7ebfba7..b34c14f 100644
--- a/hw/virtio-scsi.c
+++ b/hw/virtio-scsi.c
@@ -135,14 +135,152 @@ typedef struct {
uint32_t cdb_size;
} VirtIOSCSI;
+typedef struct VirtIOSCSIReq {
+ VirtIOSCSI *dev;
+ VirtQueue *vq;
+ VirtQueueElement elem;
+ QEMUSGList qsgl;
+ SCSIRequest *sreq;
+ union {
+ char *buf;
+ VirtIOSCSICmdReq *cmd;
+ VirtIOSCSICtrlTMFReq *tmf;
+ VirtIOSCSICtrlANReq *an;
+ } req;
+ union {
+ char *buf;
+ VirtIOSCSICmdResp *cmd;
+ VirtIOSCSICtrlTMFResp *tmf;
+ VirtIOSCSICtrlANResp *an;
+ VirtIOSCSIEvent *event;
+ } resp;
+} VirtIOSCSIReq;
+
+static void virtio_scsi_complete_req(VirtIOSCSIReq *req)
+{
+ VirtIOSCSI *s = req->dev;
+ VirtQueue *vq = req->vq;
+ virtqueue_push(vq, &req->elem, req->qsgl.size + req->elem.in_sg[0].iov_len);
+ qemu_sglist_destroy(&req->qsgl);
+ if (req->sreq) {
+ req->sreq->hba_private = NULL;
+ scsi_req_unref(req->sreq);
+ }
+ g_free(req);
+ virtio_notify(&s->vdev, vq);
+}
+
+static void virtio_scsi_bad_req(void)
+{
+ error_report("wrong size for virtio-scsi headers");
+ exit(1);
+}
+
+static void qemu_sgl_init_external(QEMUSGList *qsgl, struct iovec *sg,
+ target_phys_addr_t *addr, int num)
+{
+ memset(qsgl, 0, sizeof(*qsgl));
+ while (num--) {
+ qemu_sglist_add(qsgl, *(addr++), (sg++)->iov_len);
+ }
+}
+
+static void virtio_scsi_parse_req(VirtIOSCSI *s, VirtQueue *vq,
+ VirtIOSCSIReq *req)
+{
+ assert(req->elem.out_num && req->elem.in_num);
+ req->vq = vq;
+ req->dev = s;
+ req->sreq = NULL;
+ req->req.buf = req->elem.out_sg[0].iov_base;
+ req->resp.buf = req->elem.in_sg[0].iov_base;
+
+ if (req->elem.out_num > 1) {
+ qemu_sgl_init_external(&req->qsgl, &req->elem.out_sg[1],
+ &req->elem.out_addr[1],
+ req->elem.out_num - 1);
+ } else {
+ qemu_sgl_init_external(&req->qsgl, &req->elem.in_sg[1],
+ &req->elem.in_addr[1],
+ req->elem.in_num - 1);
+ }
+}
+
+static VirtIOSCSIReq *virtio_scsi_pop_req(VirtIOSCSI *s, VirtQueue *vq)
+{
+ VirtIOSCSIReq *req;
+ req = g_malloc(sizeof(*req));
+ if (!virtqueue_pop(vq, &req->elem)) {
+ g_free(req);
+ return NULL;
+ }
+
+ virtio_scsi_parse_req(s, vq, req);
+ return req;
+}
+
+static void virtio_scsi_fail_ctrl_req(VirtIOSCSIReq *req)
+{
+ if (req->req.tmf->type == VIRTIO_SCSI_T_TMF) {
+ req->resp.tmf->response = VIRTIO_SCSI_S_FAILURE;
+ } else {
+ req->resp.an->response = VIRTIO_SCSI_S_FAILURE;
+ }
+
+ virtio_scsi_complete_req(req);
+}
+
static void virtio_scsi_handle_ctrl(VirtIODevice *vdev, VirtQueue *vq)
{
- /* TODO */
+ VirtIOSCSI *s = (VirtIOSCSI *)vdev;
+ VirtIOSCSIReq *req;
+
+ while ((req = virtio_scsi_pop_req(s, vq))) {
+ virtio_scsi_fail_ctrl_req(req);
+ }
+}
+
+static void virtio_scsi_fail_cmd_req(VirtIOSCSI *s, VirtIOSCSIReq *req)
+{
+ req->resp.cmd->response = VIRTIO_SCSI_S_FAILURE;
+ virtio_scsi_complete_req(req);
}
static void virtio_scsi_handle_cmd(VirtIODevice *vdev, VirtQueue *vq)
{
- /* TODO */
+ VirtIOSCSI *s = (VirtIOSCSI *)vdev;
+ VirtIOSCSIReq *req;
+
+ while ((req = virtio_scsi_pop_req(s, vq))) {
+ int out_size, in_size;
+ if (req->elem.out_num < 1 || req->elem.in_num < 1) {
+ virtio_scsi_bad_req();
+ }
+
+ out_size = req->elem.out_sg[0].iov_len;
+ in_size = req->elem.in_sg[0].iov_len;
+ if (out_size < sizeof(VirtIOSCSICmdReq) + s->cdb_size ||
+ in_size < sizeof(VirtIOSCSICmdResp) + s->sense_size) {
+ virtio_scsi_bad_req();
+ }
+
+ if (req->elem.out_num > 1 && req->elem.in_num > 1) {
+ virtio_scsi_fail_cmd_req(s, req);
+ continue;
+ }
+
+ req->resp.cmd->resid = 0;
+ req->resp.cmd->status_qualifier = 0;
+ req->resp.cmd->status = CHECK_CONDITION;
+ req->resp.cmd->sense_len = 4;
+ req->resp.cmd->sense[0] = 0xf0; /* Fixed format current sense */
+ req->resp.cmd->sense[1] = ILLEGAL_REQUEST;
+ req->resp.cmd->sense[2] = 0x20;
+ req->resp.cmd->sense[3] = 0x00;
+ req->resp.cmd->response = VIRTIO_SCSI_S_OK;
+
+ virtio_scsi_complete_req(req);
+ }
}
static void virtio_scsi_get_config(VirtIODevice *vdev,
--
1.7.7.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [Qemu-devel] [PATCH 13/15] virtio-scsi: add basic SCSI bus operation
2012-01-16 16:30 [Qemu-devel] [PATCH v2 00/15] SCSI s/g + SCSI migration + virtio-scsi Paolo Bonzini
` (11 preceding siblings ...)
2012-01-16 16:30 ` [Qemu-devel] [PATCH 12/15] virtio-scsi: Add basic request processing infrastructure Paolo Bonzini
@ 2012-01-16 16:30 ` Paolo Bonzini
2012-01-16 16:30 ` [Qemu-devel] [PATCH 14/15] virtio-scsi: process control queue requests Paolo Bonzini
` (3 subsequent siblings)
16 siblings, 0 replies; 30+ messages in thread
From: Paolo Bonzini @ 2012-01-16 16:30 UTC (permalink / raw)
To: qemu-devel
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
hw/virtio-scsi.c | 110 +++++++++++++++++++++++++++++++++++++++++++++++------
1 files changed, 97 insertions(+), 13 deletions(-)
diff --git a/hw/virtio-scsi.c b/hw/virtio-scsi.c
index b34c14f..21264a1 100644
--- a/hw/virtio-scsi.c
+++ b/hw/virtio-scsi.c
@@ -128,6 +128,7 @@ typedef struct {
DeviceState *qdev;
VirtIOSCSIConf *conf;
+ SCSIBus bus;
VirtQueue *ctrl_vq;
VirtQueue *event_vq;
VirtQueue *cmd_vq;
@@ -156,6 +157,22 @@ typedef struct VirtIOSCSIReq {
} resp;
} VirtIOSCSIReq;
+static inline int virtio_scsi_get_lun(uint8_t *lun)
+{
+ return ((lun[2] << 8) | lun[3]) & 0x3FFF;
+}
+
+static inline SCSIDevice *virtio_scsi_device_find(VirtIOSCSI *s, uint8_t *lun)
+{
+ if (lun[0] != 1) {
+ return NULL;
+ }
+ if (lun[2] != 0 && !(lun[2] >= 0x40 && lun[2] < 0x80)) {
+ return NULL;
+ }
+ return scsi_device_find(&s->bus, 0, lun[1], virtio_scsi_get_lun(lun));
+}
+
static void virtio_scsi_complete_req(VirtIOSCSIReq *req)
{
VirtIOSCSI *s = req->dev;
@@ -240,7 +257,41 @@ static void virtio_scsi_handle_ctrl(VirtIODevice *vdev, VirtQueue *vq)
}
}
-static void virtio_scsi_fail_cmd_req(VirtIOSCSI *s, VirtIOSCSIReq *req)
+static void virtio_scsi_command_complete(SCSIRequest *r, uint32_t status,
+ int32_t resid)
+{
+ VirtIOSCSIReq *req = r->hba_private;
+
+ req->resp.cmd->response = VIRTIO_SCSI_S_OK;
+ req->resp.cmd->status = status;
+ if (req->resp.cmd->status == GOOD) {
+ req->resp.cmd->resid = resid;
+ } else {
+ req->resp.cmd->resid = 0;
+ scsi_req_get_sense(r, req->resp.cmd->sense, VIRTIO_SCSI_SENSE_SIZE);
+ }
+ virtio_scsi_complete_req(req);
+}
+
+static QEMUSGList *virtio_scsi_get_sg_list(SCSIRequest *r)
+{
+ VirtIOSCSIReq *req = r->hba_private;
+
+ return &req->qsgl;
+}
+
+static void virtio_scsi_request_cancelled(SCSIRequest *r)
+{
+ VirtIOSCSIReq *req = r->hba_private;
+
+ if (!req) {
+ return;
+ }
+ req->resp.cmd->response = VIRTIO_SCSI_S_ABORTED;
+ virtio_scsi_complete_req(req);
+}
+
+static void virtio_scsi_fail_cmd_req(VirtIOSCSIReq *req)
{
req->resp.cmd->response = VIRTIO_SCSI_S_FAILURE;
virtio_scsi_complete_req(req);
@@ -250,8 +301,10 @@ static void virtio_scsi_handle_cmd(VirtIODevice *vdev, VirtQueue *vq)
{
VirtIOSCSI *s = (VirtIOSCSI *)vdev;
VirtIOSCSIReq *req;
+ int n;
while ((req = virtio_scsi_pop_req(s, vq))) {
+ SCSIDevice *d;
int out_size, in_size;
if (req->elem.out_num < 1 || req->elem.in_num < 1) {
virtio_scsi_bad_req();
@@ -265,21 +318,36 @@ static void virtio_scsi_handle_cmd(VirtIODevice *vdev, VirtQueue *vq)
}
if (req->elem.out_num > 1 && req->elem.in_num > 1) {
- virtio_scsi_fail_cmd_req(s, req);
+ virtio_scsi_fail_cmd_req(req);
continue;
}
- req->resp.cmd->resid = 0;
- req->resp.cmd->status_qualifier = 0;
- req->resp.cmd->status = CHECK_CONDITION;
- req->resp.cmd->sense_len = 4;
- req->resp.cmd->sense[0] = 0xf0; /* Fixed format current sense */
- req->resp.cmd->sense[1] = ILLEGAL_REQUEST;
- req->resp.cmd->sense[2] = 0x20;
- req->resp.cmd->sense[3] = 0x00;
- req->resp.cmd->response = VIRTIO_SCSI_S_OK;
-
- virtio_scsi_complete_req(req);
+ d = virtio_scsi_device_find(s, req->req.cmd->lun);
+ if (!d) {
+ req->resp.cmd->response = VIRTIO_SCSI_S_BAD_TARGET;
+ virtio_scsi_complete_req(req);
+ continue;
+ }
+ req->sreq = scsi_req_new(d, req->req.cmd->tag,
+ virtio_scsi_get_lun(req->req.cmd->lun),
+ req->req.cmd->cdb, req);
+
+ if (req->sreq->cmd.mode != SCSI_XFER_NONE) {
+ int req_mode =
+ (req->elem.in_num > 1 ? SCSI_XFER_FROM_DEV : SCSI_XFER_TO_DEV);
+
+ if (req->sreq->cmd.mode != req_mode ||
+ req->sreq->cmd.xfer > req->qsgl.size) {
+ req->resp.cmd->response = VIRTIO_SCSI_S_OVERRUN;
+ virtio_scsi_complete_req(req);
+ continue;
+ }
+ }
+
+ n = scsi_req_enqueue(req->sreq);
+ if (n) {
+ scsi_req_continue(req->sreq);
+ }
}
}
@@ -331,6 +399,17 @@ static void virtio_scsi_reset(VirtIODevice *vdev)
s->cdb_size = VIRTIO_SCSI_CDB_SIZE;
}
+static struct SCSIBusInfo virtio_scsi_scsi_info = {
+ .tcq = true,
+ .max_channel = VIRTIO_SCSI_MAX_CHANNEL,
+ .max_target = VIRTIO_SCSI_MAX_TARGET,
+ .max_lun = VIRTIO_SCSI_MAX_LUN,
+
+ .complete = virtio_scsi_command_complete,
+ .cancel = virtio_scsi_request_cancelled,
+ .get_sg_list = virtio_scsi_get_sg_list,
+};
+
VirtIODevice *virtio_scsi_init(DeviceState *dev, VirtIOSCSIConf *proxyconf)
{
VirtIOSCSI *s;
@@ -355,6 +434,11 @@ VirtIODevice *virtio_scsi_init(DeviceState *dev, VirtIOSCSIConf *proxyconf)
s->cmd_vq = virtio_add_queue(&s->vdev, VIRTIO_SCSI_VQ_SIZE,
virtio_scsi_handle_cmd);
+ scsi_bus_new(&s->bus, dev, &virtio_scsi_scsi_info);
+ if (!dev->hotplugged) {
+ scsi_bus_legacy_handle_cmdline(&s->bus);
+ }
+
/* TODO savevm */
return &s->vdev;
--
1.7.7.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [Qemu-devel] [PATCH 14/15] virtio-scsi: process control queue requests
2012-01-16 16:30 [Qemu-devel] [PATCH v2 00/15] SCSI s/g + SCSI migration + virtio-scsi Paolo Bonzini
` (12 preceding siblings ...)
2012-01-16 16:30 ` [Qemu-devel] [PATCH 13/15] virtio-scsi: add basic SCSI bus operation Paolo Bonzini
@ 2012-01-16 16:30 ` Paolo Bonzini
2012-01-16 16:30 ` [Qemu-devel] [PATCH 15/15] virtio-scsi: add migration support Paolo Bonzini
` (2 subsequent siblings)
16 siblings, 0 replies; 30+ messages in thread
From: Paolo Bonzini @ 2012-01-16 16:30 UTC (permalink / raw)
To: qemu-devel
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
hw/virtio-scsi.c | 125 ++++++++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 117 insertions(+), 8 deletions(-)
diff --git a/hw/virtio-scsi.c b/hw/virtio-scsi.c
index 21264a1..7ad60ec 100644
--- a/hw/virtio-scsi.c
+++ b/hw/virtio-scsi.c
@@ -134,6 +134,7 @@ typedef struct {
VirtQueue *cmd_vq;
uint32_t sense_size;
uint32_t cdb_size;
+ bool resetting;
} VirtIOSCSI;
typedef struct VirtIOSCSIReq {
@@ -236,15 +237,95 @@ static VirtIOSCSIReq *virtio_scsi_pop_req(VirtIOSCSI *s, VirtQueue *vq)
return req;
}
-static void virtio_scsi_fail_ctrl_req(VirtIOSCSIReq *req)
+static void virtio_scsi_do_tmf(VirtIOSCSI *s, VirtIOSCSIReq *req)
{
- if (req->req.tmf->type == VIRTIO_SCSI_T_TMF) {
- req->resp.tmf->response = VIRTIO_SCSI_S_FAILURE;
- } else {
- req->resp.an->response = VIRTIO_SCSI_S_FAILURE;
+ SCSIDevice *d = virtio_scsi_device_find(s, req->req.cmd->lun);
+ SCSIRequest *r, *next;
+ DeviceState *qdev;
+ int target;
+
+ switch (req->req.tmf->subtype) {
+ case VIRTIO_SCSI_T_TMF_ABORT_TASK:
+ case VIRTIO_SCSI_T_TMF_QUERY_TASK:
+ d = virtio_scsi_device_find(s, req->req.cmd->lun);
+ if (!d) {
+ goto fail;
+ }
+ if (d->lun != virtio_scsi_get_lun(req->req.cmd->lun)) {
+ req->resp.tmf->response = VIRTIO_SCSI_S_INCORRECT_LUN;
+ break;
+ }
+ QTAILQ_FOREACH_SAFE(r, &d->requests, next, next) {
+ if (r->tag == req->req.cmd->tag) {
+ break;
+ }
+ }
+ if (r && r->hba_private) {
+ if (req->req.tmf->subtype == VIRTIO_SCSI_T_TMF_ABORT_TASK) {
+ scsi_req_cancel(r);
+ }
+ req->resp.tmf->response = VIRTIO_SCSI_S_FUNCTION_SUCCEEDED;
+ } else {
+ req->resp.tmf->response = VIRTIO_SCSI_S_OK;
+ }
+ break;
+
+ case VIRTIO_SCSI_T_TMF_LOGICAL_UNIT_RESET:
+ d = virtio_scsi_device_find(s, req->req.cmd->lun);
+ if (!d) {
+ goto fail;
+ }
+ if (d->lun == virtio_scsi_get_lun(req->req.cmd->lun)) {
+ s->resetting++;
+ qdev_reset_all(&d->qdev);
+ s->resetting--;
+ }
+ break;
+
+ case VIRTIO_SCSI_T_TMF_ABORT_TASK_SET:
+ case VIRTIO_SCSI_T_TMF_CLEAR_TASK_SET:
+ case VIRTIO_SCSI_T_TMF_QUERY_TASK_SET:
+ d = virtio_scsi_device_find(s, req->req.cmd->lun);
+ if (!d) {
+ goto fail;
+ }
+ if (d->lun != virtio_scsi_get_lun(req->req.cmd->lun)) {
+ req->resp.tmf->response = VIRTIO_SCSI_S_INCORRECT_LUN;
+ break;
+ }
+ req->resp.tmf->response = VIRTIO_SCSI_S_OK;
+ QTAILQ_FOREACH_SAFE(r, &d->requests, next, next) {
+ if (r->hba_private) {
+ if (req->req.tmf->subtype != VIRTIO_SCSI_T_TMF_QUERY_TASK) {
+ scsi_req_cancel(r);
+ }
+ req->resp.tmf->response = VIRTIO_SCSI_S_FUNCTION_SUCCEEDED;
+ }
+ }
+ break;
+
+ case VIRTIO_SCSI_T_TMF_I_T_NEXUS_RESET:
+ target = req->req.cmd->lun[1];
+ s->resetting++;
+ QTAILQ_FOREACH(qdev, &s->bus.qbus.children, sibling) {
+ d = DO_UPCAST(SCSIDevice, qdev, qdev);
+ if (d->channel == 0 && d->id == target) {
+ qdev_reset_all(&d->qdev);
+ }
+ }
+ s->resetting--;
+ break;
+
+ case VIRTIO_SCSI_T_TMF_CLEAR_ACA:
+ default:
+ req->resp.tmf->response = VIRTIO_SCSI_S_FUNCTION_REJECTED;
+ break;
}
- virtio_scsi_complete_req(req);
+ return;
+
+fail:
+ req->resp.tmf->response = VIRTIO_SCSI_S_BAD_TARGET;
}
static void virtio_scsi_handle_ctrl(VirtIODevice *vdev, VirtQueue *vq)
@@ -253,7 +334,31 @@ static void virtio_scsi_handle_ctrl(VirtIODevice *vdev, VirtQueue *vq)
VirtIOSCSIReq *req;
while ((req = virtio_scsi_pop_req(s, vq))) {
- virtio_scsi_fail_ctrl_req(req);
+ int out_size, in_size;
+ if (req->elem.out_num < 1 || req->elem.in_num < 1) {
+ virtio_scsi_bad_req();
+ continue;
+ }
+
+ out_size = req->elem.out_sg[0].iov_len;
+ in_size = req->elem.in_sg[0].iov_len;
+ if (req->req.tmf->type == VIRTIO_SCSI_T_TMF) {
+ if (out_size < sizeof(VirtIOSCSICtrlTMFReq) ||
+ in_size < sizeof(VirtIOSCSICtrlTMFResp)) {
+ virtio_scsi_bad_req();
+ }
+ virtio_scsi_do_tmf(s, req);
+
+ } else if (req->req.tmf->type == VIRTIO_SCSI_T_AN_QUERY ||
+ req->req.tmf->type == VIRTIO_SCSI_T_AN_SUBSCRIBE) {
+ if (out_size < sizeof(VirtIOSCSICtrlANReq) ||
+ in_size < sizeof(VirtIOSCSICtrlANResp)) {
+ virtio_scsi_bad_req();
+ }
+ req->resp.an->event_actual = 0;
+ req->resp.an->response = VIRTIO_SCSI_S_OK;
+ }
+ virtio_scsi_complete_req(req);
}
}
@@ -287,7 +392,11 @@ static void virtio_scsi_request_cancelled(SCSIRequest *r)
if (!req) {
return;
}
- req->resp.cmd->response = VIRTIO_SCSI_S_ABORTED;
+ if (req->dev->resetting) {
+ req->resp.cmd->response = VIRTIO_SCSI_S_RESET;
+ } else {
+ req->resp.cmd->response = VIRTIO_SCSI_S_ABORTED;
+ }
virtio_scsi_complete_req(req);
}
--
1.7.7.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* [Qemu-devel] [PATCH 15/15] virtio-scsi: add migration support
2012-01-16 16:30 [Qemu-devel] [PATCH v2 00/15] SCSI s/g + SCSI migration + virtio-scsi Paolo Bonzini
` (13 preceding siblings ...)
2012-01-16 16:30 ` [Qemu-devel] [PATCH 14/15] virtio-scsi: process control queue requests Paolo Bonzini
@ 2012-01-16 16:30 ` Paolo Bonzini
2012-01-18 7:39 ` [Qemu-devel] [PATCH v2 00/15] SCSI s/g + SCSI migration + virtio-scsi Hu Tao
2012-02-10 14:01 ` Stefan Hajnoczi
16 siblings, 0 replies; 30+ messages in thread
From: Paolo Bonzini @ 2012-01-16 16:30 UTC (permalink / raw)
To: qemu-devel
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
hw/virtio-scsi.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 49 insertions(+), 1 deletions(-)
diff --git a/hw/virtio-scsi.c b/hw/virtio-scsi.c
index 7ad60ec..f5cecfc 100644
--- a/hw/virtio-scsi.c
+++ b/hw/virtio-scsi.c
@@ -237,6 +237,34 @@ static VirtIOSCSIReq *virtio_scsi_pop_req(VirtIOSCSI *s, VirtQueue *vq)
return req;
}
+static void virtio_scsi_save_request(QEMUFile *f, SCSIRequest *sreq)
+{
+ VirtIOSCSIReq *req = sreq->hba_private;
+
+ qemu_put_buffer(f, (unsigned char*)&req->elem, sizeof(req->elem));
+}
+
+static void *virtio_scsi_load_request(QEMUFile *f, SCSIRequest *sreq)
+{
+ SCSIBus *bus = sreq->bus;
+ VirtIOSCSI *s = container_of(bus, VirtIOSCSI, bus);
+ VirtIOSCSIReq *req;
+
+ req = g_malloc(sizeof(*req));
+ qemu_get_buffer(f, (unsigned char*)&req->elem, sizeof(req->elem));
+ virtio_scsi_parse_req(s, s->cmd_vq, req);
+
+ scsi_req_ref(sreq);
+ req->sreq = sreq;
+ if (req->sreq->cmd.mode != SCSI_XFER_NONE) {
+ int req_mode =
+ (req->elem.in_num > 1 ? SCSI_XFER_FROM_DEV : SCSI_XFER_TO_DEV);
+
+ assert (req->sreq->cmd.mode == req_mode);
+ }
+ return req;
+}
+
static void virtio_scsi_do_tmf(VirtIOSCSI *s, VirtIOSCSIReq *req)
{
SCSIDevice *d = virtio_scsi_device_find(s, req->req.cmd->lun);
@@ -508,6 +536,22 @@ static void virtio_scsi_reset(VirtIODevice *vdev)
s->cdb_size = VIRTIO_SCSI_CDB_SIZE;
}
+/* The device does not have anything to save beyond the virtio data.
+ * Request data is saved with callbacks from SCSI devices.
+ */
+static void virtio_scsi_save(QEMUFile *f, void *opaque)
+{
+ VirtIOSCSI *s = opaque;
+ virtio_save(&s->vdev, f);
+}
+
+static int virtio_scsi_load(QEMUFile *f, void *opaque, int version_id)
+{
+ VirtIOSCSI *s = opaque;
+ virtio_load(&s->vdev, f);
+ return 0;
+}
+
static struct SCSIBusInfo virtio_scsi_scsi_info = {
.tcq = true,
.max_channel = VIRTIO_SCSI_MAX_CHANNEL,
@@ -517,11 +561,14 @@ static struct SCSIBusInfo virtio_scsi_scsi_info = {
.complete = virtio_scsi_command_complete,
.cancel = virtio_scsi_request_cancelled,
.get_sg_list = virtio_scsi_get_sg_list,
+ .save_request = virtio_scsi_save_request,
+ .load_request = virtio_scsi_load_request,
};
VirtIODevice *virtio_scsi_init(DeviceState *dev, VirtIOSCSIConf *proxyconf)
{
VirtIOSCSI *s;
+ static int virtio_scsi_id;
s = (VirtIOSCSI *)virtio_common_init("virtio-scsi", VIRTIO_ID_SCSI,
sizeof(VirtIOSCSIConfig),
@@ -548,7 +595,8 @@ VirtIODevice *virtio_scsi_init(DeviceState *dev, VirtIOSCSIConf *proxyconf)
scsi_bus_legacy_handle_cmdline(&s->bus);
}
- /* TODO savevm */
+ register_savevm(dev, "virtio-scsi", virtio_scsi_id++, 1,
+ virtio_scsi_save, virtio_scsi_load, s);
return &s->vdev;
}
--
1.7.7.1
^ permalink raw reply related [flat|nested] 30+ messages in thread
* Re: [Qemu-devel] [PATCH v2 00/15] SCSI s/g + SCSI migration + virtio-scsi
2012-01-16 16:30 [Qemu-devel] [PATCH v2 00/15] SCSI s/g + SCSI migration + virtio-scsi Paolo Bonzini
` (14 preceding siblings ...)
2012-01-16 16:30 ` [Qemu-devel] [PATCH 15/15] virtio-scsi: add migration support Paolo Bonzini
@ 2012-01-18 7:39 ` Hu Tao
2012-01-19 15:53 ` Paolo Bonzini
2012-02-10 14:01 ` Stefan Hajnoczi
16 siblings, 1 reply; 30+ messages in thread
From: Hu Tao @ 2012-01-18 7:39 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: qemu-devel
Hi Paolo,
I found a problem that a virtio-scsi disk gets offline during mkfs.
The scsi disk is of 100G or bigger, and the corresponding image
is a freshly created qcow2 image. If the disk is small enough, or
not freshly created, the problem doesn't appear.
--
Thanks,
Hu Tao
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [Qemu-devel] [PATCH v2 00/15] SCSI s/g + SCSI migration + virtio-scsi
2012-01-18 7:39 ` [Qemu-devel] [PATCH v2 00/15] SCSI s/g + SCSI migration + virtio-scsi Hu Tao
@ 2012-01-19 15:53 ` Paolo Bonzini
2012-01-23 13:36 ` Paolo Bonzini
2012-01-30 9:33 ` Hu Tao
0 siblings, 2 replies; 30+ messages in thread
From: Paolo Bonzini @ 2012-01-19 15:53 UTC (permalink / raw)
To: Hu Tao; +Cc: qemu-devel
On 01/18/2012 08:39 AM, Hu Tao wrote:
> Hi Paolo,
>
> I found a problem that a virtio-scsi disk gets offline during mkfs.
> The scsi disk is of 100G or bigger, and the corresponding image
> is a freshly created qcow2 image. If the disk is small enough, or
> not freshly created, the problem doesn't appear.
Hi Hu,
I cannot reproduce this with a 100G qcow2 image (created with "qemu-img
create scsi.qcow2 100G" just before launching the host), with a
partition starting at sector 2048 and extending to the end of the disk.
mkfs (ext4) takes less than 1 minute and extends the qcow2 file to a
little less than 2 gigs.
Can you send the partition table ("file -s /dev/sda" should be enough)
and any output you get from the dmesg?
Paolo
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [Qemu-devel] [PATCH v2 00/15] SCSI s/g + SCSI migration + virtio-scsi
2012-01-19 15:53 ` Paolo Bonzini
@ 2012-01-23 13:36 ` Paolo Bonzini
2012-01-30 9:33 ` Hu Tao
1 sibling, 0 replies; 30+ messages in thread
From: Paolo Bonzini @ 2012-01-23 13:36 UTC (permalink / raw)
To: qemu-devel, Hu Tao
On 01/19/2012 04:53 PM, Paolo Bonzini wrote:
>> I found a problem that a virtio-scsi disk gets offline during mkfs.
>> The scsi disk is of 100G or bigger, and the corresponding image
>> is a freshly created qcow2 image. If the disk is small enough, or
>> not freshly created, the problem doesn't appear.
>
> Hi Hu,
>
> I cannot reproduce this with a 100G qcow2 image (created with "qemu-img
> create scsi.qcow2 100G" just before launching the host), with a
> partition starting at sector 2048 and extending to the end of the disk.
> mkfs (ext4) takes less than 1 minute and extends the qcow2 file to a
> little less than 2 gigs.
>
> Can you send the partition table ("file -s /dev/sda" should be enough)
> and any output you get from the dmesg?
I cannot reproduce this even with a 3T qcow2 image. mkfs takes 30
minutes and creates a 50G image.
What kernel driver are you using?
Paolo
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [Qemu-devel] [PATCH v2 00/15] SCSI s/g + SCSI migration + virtio-scsi
2012-01-19 15:53 ` Paolo Bonzini
2012-01-23 13:36 ` Paolo Bonzini
@ 2012-01-30 9:33 ` Hu Tao
2012-01-31 12:36 ` Paolo Bonzini
1 sibling, 1 reply; 30+ messages in thread
From: Hu Tao @ 2012-01-30 9:33 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: qemu-devel
[-- Attachment #1: Type: text/plain, Size: 1280 bytes --]
On Thu, Jan 19, 2012 at 04:53:30PM +0100, Paolo Bonzini wrote:
> On 01/18/2012 08:39 AM, Hu Tao wrote:
> >Hi Paolo,
> >
> >I found a problem that a virtio-scsi disk gets offline during mkfs.
> >The scsi disk is of 100G or bigger, and the corresponding image
> >is a freshly created qcow2 image. If the disk is small enough, or
> >not freshly created, the problem doesn't appear.
>
> Hi Hu,
>
> I cannot reproduce this with a 100G qcow2 image (created with
> "qemu-img create scsi.qcow2 100G" just before launching the host),
> with a partition starting at sector 2048 and extending to the end of
> the disk. mkfs (ext4) takes less than 1 minute and extends the
> qcow2 file to a little less than 2 gigs.
I've re-tested today, with host kernel 2.6.35.6-45.fc14.x86_64,
2.6.32-71.el6.x86_64, 3.1.0 and 3.3.0-rc1+, qemu version and guest
configuration remain the same, including guest kernel. It apears
that the problem appears only when the host kernel version is 3.1.0.
>
> Can you send the partition table ("file -s /dev/sda" should be
> enough) and any output you get from the dmesg?
#file -s /dev/sda
/dev/sda: x86 boot sector; partition 1: ID=0x83, starthead 1, startsector 63, 209712447 sectors, extended partition table (last)\011, code offset 0x0
--
Thanks,
Hu Tao
[-- Attachment #2: dmesg-virtio-scsi-error-sd-offline-during-mkfs --]
[-- Type: text/plain, Size: 98582 bytes --]
Initializing cgroup subsys cpuset
Initializing cgroup subsys cpu
Linux version 3.2.0-ht-virtio-scsi-1+ (root@localhost.localdomain) (gcc version 4.5.1 20100924 (Red Hat 4.5.1-4) (GCC) ) #1 SMP Fri Jan 13 14:07:56 CST 2012
Command line: ro root=UUID=a93a2827-4db1-4818-876c-5992c9b27830 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD quiet SYSFONT=latarcyrheb-sun16 rhgb crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM
BIOS-provided physical RAM map:
BIOS-e820: 0000000000000000 - 000000000009dc00 (usable)
BIOS-e820: 000000000009dc00 - 00000000000a0000 (reserved)
BIOS-e820: 00000000000f0000 - 0000000000100000 (reserved)
BIOS-e820: 0000000000100000 - 000000003fffd000 (usable)
BIOS-e820: 000000003fffd000 - 0000000040000000 (reserved)
BIOS-e820: 00000000feffc000 - 00000000ff000000 (reserved)
BIOS-e820: 00000000fffc0000 - 0000000100000000 (reserved)
NX (Execute Disable) protection: active
DMI 2.4 present.
DMI: Bochs Bochs, BIOS Bochs 01/01/2007
e820 update range: 0000000000000000 - 0000000000010000 (usable) ==> (reserved)
e820 remove range: 00000000000a0000 - 0000000000100000 (usable)
No AGP bridge found
last_pfn = 0x3fffd max_arch_pfn = 0x400000000
MTRR default type: write-back
MTRR fixed ranges enabled:
00000-9FFFF write-back
A0000-BFFFF uncachable
C0000-FFFFF write-protect
MTRR variable ranges enabled:
0 base 00E0000000 mask FFE0000000 uncachable
1 disabled
2 disabled
3 disabled
4 disabled
5 disabled
6 disabled
7 disabled
PAT not supported by CPU.
found SMP MP-table at [ffff8800000fda70] fda70
initial memory mapped : 0 - 20000000
Base memory trampoline at [ffff880000098000] 98000 size 20480
init_memory_mapping: 0000000000000000-000000003fffd000
0000000000 - 003fe00000 page 2M
003fe00000 - 003fffd000 page 4k
kernel direct mapping tables up to 3fffd000 @ 1fffd000-20000000
RAMDISK: 37555000 - 37ff0000
crashkernel: memory value expected
ACPI: RSDP 00000000000fd910 00014 (v00 BOCHS )
ACPI: RSDT 000000003fffd7b0 00034 (v01 BOCHS BXPCRSDT 00000001 BXPC 00000001)
ACPI: FACP 000000003fffff80 00074 (v01 BOCHS BXPCFACP 00000001 BXPC 00000001)
ACPI: DSDT 000000003fffd9b0 02589 (v01 BXPC BXDSDT 00000001 INTL 20100528)
ACPI: FACS 000000003fffff40 00040
ACPI: SSDT 000000003fffd910 0009E (v01 BOCHS BXPCSSDT 00000001 BXPC 00000001)
ACPI: APIC 000000003fffd830 00072 (v01 BOCHS BXPCAPIC 00000001 BXPC 00000001)
ACPI: HPET 000000003fffd7f0 00038 (v01 BOCHS BXPCHPET 00000001 BXPC 00000001)
ACPI: Local APIC address 0xfee00000
kvm-clock: Using msrs 4b564d01 and 4b564d00
kvm-clock: cpu 0, msr 0:1acf5c1, boot clock
[ffffea0000000000-ffffea0000dfffff] PMD -> [ffff88003e600000-ffff88003f3fffff] on node 0
Zone PFN ranges:
DMA 0x00000010 -> 0x00001000
DMA32 0x00001000 -> 0x00100000
Normal empty
Movable zone start PFN for each node
Early memory PFN ranges
0: 0x00000010 -> 0x0000009d
0: 0x00000100 -> 0x0003fffd
On node 0 totalpages: 262026
DMA zone: 56 pages used for memmap
DMA zone: 5 pages reserved
DMA zone: 3920 pages, LIFO batch:0
DMA32 zone: 3528 pages used for memmap
DMA32 zone: 254517 pages, LIFO batch:31
ACPI: PM-Timer IO Port: 0xb008
ACPI: Local APIC address 0xfee00000
ACPI: LAPIC (acpi_id[0x00] lapic_id[0x00] enabled)
ACPI: IOAPIC (id[0x01] address[0xfec00000] gsi_base[0])
IOAPIC[0]: apic_id 1, version 17, address 0xfec00000, GSI 0-23
ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 dfl dfl)
ACPI: INT_SRC_OVR (bus 0 bus_irq 5 global_irq 5 high level)
ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 high level)
ACPI: INT_SRC_OVR (bus 0 bus_irq 10 global_irq 10 high level)
ACPI: INT_SRC_OVR (bus 0 bus_irq 11 global_irq 11 high level)
ACPI: IRQ0 used by override.
ACPI: IRQ2 used by override.
ACPI: IRQ5 used by override.
ACPI: IRQ9 used by override.
ACPI: IRQ10 used by override.
ACPI: IRQ11 used by override.
Using ACPI (MADT) for SMP configuration information
ACPI: HPET id: 0x8086a201 base: 0xfed00000
SMP: Allowing 1 CPUs, 0 hotplug CPUs
nr_irqs_gsi: 40
PM: Registered nosave memory: 000000000009d000 - 000000000009e000
PM: Registered nosave memory: 000000000009e000 - 00000000000a0000
PM: Registered nosave memory: 00000000000a0000 - 00000000000f0000
PM: Registered nosave memory: 00000000000f0000 - 0000000000100000
Allocating PCI resources starting at 40000000 (gap: 40000000:beffc000)
Booting paravirtualized kernel on KVM
setup_percpu: NR_CPUS:4096 nr_cpumask_bits:1 nr_cpu_ids:1 nr_node_ids:1
PERCPU: Embedded 27 pages/cpu @ffff88003fc00000 s78528 r8192 d23872 u2097152
pcpu-alloc: s78528 r8192 d23872 u2097152 alloc=1*2097152
pcpu-alloc: [0] 0
kvm-clock: cpu 0, msr 0:3fc125c1, primary cpu clock
Built 1 zonelists in Zone order, mobility grouping on. Total pages: 258437
Kernel command line: ro root=UUID=a93a2827-4db1-4818-876c-5992c9b27830 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD quiet SYSFONT=latarcyrheb-sun16 rhgb crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM
PID hash table entries: 4096 (order: 3, 32768 bytes)
Dentry cache hash table entries: 131072 (order: 8, 1048576 bytes)
Inode-cache hash table entries: 65536 (order: 7, 524288 bytes)
Checking aperture...
No AGP bridge found
Memory: 1007664k/1048564k available (4743k kernel code, 460k absent, 40440k reserved, 6244k data, 700k init)
Hierarchical RCU implementation.
NR_IRQS:262400 nr_irqs:256 16
Console: colour VGA+ 80x25
console [tty0] enabled
allocated 8388608 bytes of page_cgroup
please try 'cgroup_disable=memory' option if you don't want memory cgroups
hpet clockevent registered
Detected 2393.894 MHz processor.
Calibrating delay loop (skipped) preset value.. 4787.78 BogoMIPS (lpj=2393894)
pid_max: default: 32768 minimum: 301
Mount-cache hash table entries: 256
Initializing cgroup subsys cpuacct
Initializing cgroup subsys memory
Initializing cgroup subsys devices
Initializing cgroup subsys freezer
Initializing cgroup subsys net_cls
Initializing cgroup subsys blkio
mce: CPU supports 10 MCE banks
SMP alternatives: switching to UP code
Freeing SMP alternatives: 20k freed
ACPI: Core revision 20110623
ftrace: allocating 17465 entries in 69 pages
..TIMER: vector=0x30 apic1=0 pin1=2 apic2=-1 pin2=-1
CPU0: Intel QEMU Virtual CPU version 1.0.50 stepping 03
APIC calibration not consistent with PM-Timer: 97ms instead of 100ms
APIC delta adjusted to PM-Timer: 6250906 (6125785)
Performance Events: unsupported p6 CPU model 2 no PMU driver, software events only.
Brought up 1 CPUs
Total of 1 processors activated (4787.78 BogoMIPS).
devtmpfs: initialized
NET: Registered protocol family 16
ACPI: bus type pci registered
PCI: Using configuration type 1 for base access
bio: create slab <bio-0> at 0
ACPI: Added _OSI(Module Device)
ACPI: Added _OSI(Processor Device)
ACPI: Added _OSI(3.0 _SCP Extensions)
ACPI: Added _OSI(Processor Aggregator Device)
ACPI: EC: Look up EC in DSDT
ACPI: Interpreter enabled
ACPI: (supports S0 S3 S4 S5)
ACPI: Using IOAPIC for interrupt routing
ACPI: No dock devices found.
PCI: Ignoring host bridge windows from ACPI; if necessary, use "pci=use_crs" and report a bug
ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-ff])
pci_root PNP0A03:00: host bridge window [io 0x0000-0x0cf7] (ignored)
pci_root PNP0A03:00: host bridge window [io 0x0d00-0xffff] (ignored)
pci_root PNP0A03:00: host bridge window [mem 0x000a0000-0x000bffff] (ignored)
pci_root PNP0A03:00: host bridge window [mem 0xe0000000-0xfebfffff] (ignored)
pci 0000:00:00.0: [8086:1237] type 0 class 0x000600
pci 0000:00:01.0: [8086:7000] type 0 class 0x000601
pci 0000:00:01.1: [8086:7010] type 0 class 0x000101
pci 0000:00:01.1: reg 20: [io 0xc180-0xc18f]
pci 0000:00:01.3: [8086:7113] type 0 class 0x000680
pci 0000:00:01.3: quirk: [io 0xb000-0xb03f] claimed by PIIX4 ACPI
pci 0000:00:01.3: quirk: [io 0xb100-0xb10f] claimed by PIIX4 SMB
pci 0000:00:02.0: [1013:00b8] type 0 class 0x000300
pci 0000:00:02.0: reg 10: [mem 0xfc000000-0xfdffffff pref]
pci 0000:00:02.0: reg 14: [mem 0xfebf0000-0xfebf0fff]
pci 0000:00:02.0: reg 30: [mem 0xfebd0000-0xfebdffff pref]
pci 0000:00:03.0: [10ec:8139] type 0 class 0x000200
pci 0000:00:03.0: reg 10: [io 0xc000-0xc0ff]
pci 0000:00:03.0: reg 14: [mem 0xfebf1000-0xfebf10ff]
pci 0000:00:03.0: reg 30: [mem 0xfebe0000-0xfebeffff pref]
pci 0000:00:08.0: [1af4:1004] type 0 class 0x000100
pci 0000:00:08.0: reg 10: [io 0xc100-0xc13f]
pci 0000:00:08.0: reg 14: [mem 0xfebf2000-0xfebf2fff]
pci 0000:00:09.0: [1af4:1001] type 0 class 0x000100
pci 0000:00:09.0: reg 10: [io 0xc140-0xc17f]
pci 0000:00:09.0: reg 14: [mem 0xfebf3000-0xfebf3fff]
pci_bus 0000:00: on NUMA node 0
ACPI: PCI Interrupt Routing Table [\_SB_.PCI0._PRT]
pci0000:00: Unable to request _OSC control (_OSC support mask: 0x1e)
ACPI: PCI Interrupt Link [LNKA] (IRQs 5 *10 11)
ACPI: PCI Interrupt Link [LNKB] (IRQs 5 *10 11)
ACPI: PCI Interrupt Link [LNKC] (IRQs 5 10 *11)
ACPI: PCI Interrupt Link [LNKD] (IRQs 5 10 *11)
ACPI: PCI Interrupt Link [LNKS] (IRQs 9) *0
vgaarb: device added: PCI:0000:00:02.0,decodes=io+mem,owns=io+mem,locks=none
vgaarb: loaded
vgaarb: bridge control possible 0000:00:02.0
SCSI subsystem initialized
libata version 3.00 loaded.
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
PCI: Using ACPI for IRQ routing
PCI: pci_cache_line_size set to 64 bytes
reserve RAM buffer: 000000000009dc00 - 000000000009ffff
reserve RAM buffer: 000000003fffd000 - 000000003fffffff
HPET: 3 timers in total, 0 timers will be used for per-cpu timer
hpet0: at MMIO 0xfed00000, IRQs 2, 8, 0
hpet0: 3 comparators, 64-bit 100.000000 MHz counter
Switching to clocksource kvm-clock
pnp: PnP ACPI init
ACPI: bus type pnp registered
pnp 00:00: [bus 00-ff]
pnp 00:00: [io 0x0cf8-0x0cff]
pnp 00:00: [io 0x0000-0x0cf7 window]
pnp 00:00: [io 0x0d00-0xffff window]
pnp 00:00: [mem 0x000a0000-0x000bffff window]
pnp 00:00: [mem 0xe0000000-0xfebfffff window]
pnp 00:00: Plug and Play ACPI device, IDs PNP0a03 (active)
pnp 00:01: [io 0x0070-0x0071]
pnp 00:01: [irq 8]
pnp 00:01: [io 0x0072-0x0077]
pnp 00:01: Plug and Play ACPI device, IDs PNP0b00 (active)
pnp 00:02: [io 0x0060]
pnp 00:02: [io 0x0064]
pnp 00:02: [irq 1]
pnp 00:02: Plug and Play ACPI device, IDs PNP0303 (active)
pnp 00:03: [irq 12]
pnp 00:03: Plug and Play ACPI device, IDs PNP0f13 (active)
pnp 00:04: [io 0x03f2-0x03f5]
pnp 00:04: [io 0x03f7]
pnp 00:04: [irq 6]
pnp 00:04: [dma 2]
pnp 00:04: Plug and Play ACPI device, IDs PNP0700 (active)
pnp 00:05: [io 0x0378-0x037f]
pnp 00:05: [irq 7]
pnp 00:05: Plug and Play ACPI device, IDs PNP0400 (active)
pnp 00:06: [io 0x03f8-0x03ff]
pnp 00:06: [irq 4]
pnp 00:06: Plug and Play ACPI device, IDs PNP0501 (active)
pnp 00:07: [mem 0xfed00000-0xfed003ff]
pnp 00:07: Plug and Play ACPI device, IDs PNP0103 (active)
pnp: PnP ACPI: found 8 devices
ACPI: ACPI bus type pnp unregistered
PCI: max bus depth: 0 pci_try_num: 1
pci_bus 0000:00: resource 0 [io 0x0000-0xffff]
pci_bus 0000:00: resource 1 [mem 0x00000000-0xffffffffff]
NET: Registered protocol family 2
IP route cache hash table entries: 32768 (order: 6, 262144 bytes)
TCP established hash table entries: 131072 (order: 9, 2097152 bytes)
TCP bind hash table entries: 65536 (order: 8, 1048576 bytes)
TCP: Hash tables configured (established 131072 bind 65536)
TCP reno registered
UDP hash table entries: 512 (order: 2, 16384 bytes)
UDP-Lite hash table entries: 512 (order: 2, 16384 bytes)
NET: Registered protocol family 1
pci 0000:00:00.0: Limiting direct PCI/PCI transfers
pci 0000:00:01.0: PIIX3: Enabling Passive Release
pci 0000:00:01.0: Activating ISA DMA hang workarounds
pci 0000:00:02.0: Boot video device
PCI: CLS 0 bytes, default 64
Unpacking initramfs...
Freeing initrd memory: 10860k freed
microcode: CPU0 sig=0x623, pf=0x0, revision=0x0
microcode: Microcode Update Driver: v2.00 <tigran@aivazian.fsnet.co.uk>, Peter Oruba
audit: initializing netlink socket (disabled)
type=2000 audit(1326768651.309:1): initialized
HugeTLB registered 2 MB page size, pre-allocated 0 pages
VFS: Disk quotas dquot_6.5.2
Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
msgmni has been set to 1989
Block layer SCSI generic (bsg) driver version 0.4 loaded (major 253)
io scheduler noop registered
io scheduler deadline registered
io scheduler cfq registered (default)
pci_hotplug: PCI Hot Plug PCI Core version: 0.5
pciehp: PCI Express Hot Plug Controller Driver version: 0.4
acpiphp: ACPI Hot Plug PCI Controller Driver version: 0.5
acpiphp: Slot [1] registered
acpiphp: Slot [2] registered
acpiphp: Slot [3] registered
acpiphp: Slot [4] registered
acpiphp: Slot [5] registered
acpiphp: Slot [6] registered
acpiphp: Slot [7] registered
acpiphp: Slot [8] registered
acpiphp: Slot [9] registered
acpiphp: Slot [10] registered
acpiphp: Slot [11] registered
acpiphp: Slot [12] registered
acpiphp: Slot [13] registered
acpiphp: Slot [14] registered
acpiphp: Slot [15] registered
acpiphp: Slot [16] registered
acpiphp: Slot [17] registered
acpiphp: Slot [18] registered
acpiphp: Slot [19] registered
acpiphp: Slot [20] registered
acpiphp: Slot [21] registered
acpiphp: Slot [22] registered
acpiphp: Slot [23] registered
acpiphp: Slot [24] registered
acpiphp: Slot [25] registered
acpiphp: Slot [26] registered
acpiphp: Slot [27] registered
acpiphp: Slot [28] registered
acpiphp: Slot [29] registered
acpiphp: Slot [30] registered
acpiphp: Slot [31] registered
input: Power Button as /devices/LNXSYSTM:00/LNXPWRBN:00/input/input0
ACPI: Power Button [PWRF]
ACPI: PCI Interrupt Link [LNKD] enabled at IRQ 11
virtio-pci 0000:00:08.0: PCI INT A -> Link[LNKD] -> GSI 11 (level, high) -> IRQ 11
virtio-pci 0000:00:08.0: setting latency timer to 64
ACPI: PCI Interrupt Link [LNKA] enabled at IRQ 10
virtio-pci 0000:00:09.0: PCI INT A -> Link[LNKA] -> GSI 10 (level, high) -> IRQ 10
virtio-pci 0000:00:09.0: setting latency timer to 64
Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
00:06: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
Non-volatile memory driver v1.3
loop: module loaded
virtio-pci 0000:00:09.0: irq 40 for MSI/MSI-X
virtio-pci 0000:00:09.0: irq 41 for MSI/MSI-X
vda: vda1 vda2
ata_piix 0000:00:01.1: version 2.13
ata_piix 0000:00:01.1: setting latency timer to 64
scsi0 : ata_piix
scsi1 : ata_piix
ata1: PATA max MWDMA2 cmd 0x1f0 ctl 0x3f6 bmdma 0xc180 irq 14
ata2: PATA max MWDMA2 cmd 0x170 ctl 0x376 bmdma 0xc188 irq 15
ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
uhci_hcd: USB Universal Host Controller Interface driver
i8042: PNP: PS/2 Controller [PNP0303:KBD,PNP0f13:MOU] at 0x60,0x64 irq 1,12
serio: i8042 KBD port at 0x60,0x64 irq 1
serio: i8042 AUX port at 0x60,0x64 irq 12
mousedev: PS/2 mouse device common for all mice
input: AT Translated Set 2 keyboard as /devices/platform/i8042/serio0/input/input1
rtc_cmos 00:01: RTC can wake from S4
rtc_cmos 00:01: rtc core: registered rtc_cmos as rtc0
rtc0: alarms up to one day, 114 bytes nvram, hpet irqs
cpuidle: using governor ladder
cpuidle: using governor menu
EFI Variables Facility v0.08 2004-May-17
usbcore: registered new interface driver usbhid
usbhid: USB HID core driver
TCP cubic registered
Initializing XFRM netlink socket
NET: Registered protocol family 17
registered taskstats version 1
rtc_cmos 00:01: setting system clock to 2012-01-17 02:50:51 UTC (1326768651)
ata2.01: NODEV after polling detection
ata2.00: ATAPI: QEMU DVD-ROM, 1.0.50, max UDMA/100
ata2.00: configured for MWDMA2
scsi 1:0:0:0: CD-ROM QEMU QEMU DVD-ROM 1.0. PQ: 0 ANSI: 5
Freeing unused kernel memory: 700k freed
Write protecting the kernel read-only data: 10240k
Freeing unused kernel memory: 1384k freed
Freeing unused kernel memory: 1912k freed
dracut: dracut-004-256.el6
dracut: rd_NO_LUKS: removing cryptoluks activation
dracut: rd_NO_LVM: removing LVM activation
udev: starting version 147
udevd (64): /proc/64/oom_adj is deprecated, please use /proc/64/oom_score_adj instead.
dracut: Starting plymouth daemon
dracut: rd_NO_DM: removing DM RAID activation
dracut: rd_NO_MD: removing MD RAID activation
input: ImExPS/2 Generic Explorer Mouse as /devices/platform/i8042/serio1/input/input2
virtio-pci 0000:00:08.0: irq 42 for MSI/MSI-X
virtio-pci 0000:00:08.0: irq 43 for MSI/MSI-X
scsi2 : Virtio SCSI HBA
scsi 2:0:2:0: Direct-Access QEMU QEMU HARDDISK 1.0. PQ: 0 ANSI: 5
sd 2:0:2:0: [sda] 125829120 512-byte logical blocks: (64.4 GB/60.0 GiB)
sd 2:0:2:0: [sda] Write Protect is off
sd 2:0:2:0: [sda] Mode Sense: 63 00 00 08
sd 2:0:2:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
sda: unknown partition table
sd 2:0:2:0: [sda] Attached SCSI disk
Refined TSC clocksource calibration: 2394.302 MHz.
sr0: scsi3-mmc drive: 4x/4x cd/rw xa/form2 tray
cdrom: Uniform CD-ROM driver Revision: 3.20
sr 1:0:0:0: Attached scsi CD-ROM sr0
EXT4-fs (vda1): mounted filesystem with ordered data mode. Opts: (null)
dracut: Mounted root filesystem /dev/vda1
dracut: Loading SELinux policy
dracut: /sbin/load_policy: Can't load policy: No such device
dracut: Switching root
readahead: starting
udev: starting version 147
input: PC Speaker as /devices/platform/pcspkr/input/input3
piix4_smbus 0000:00:01.3: SMBus Host Controller at 0xb100, revision 0
8139cp: 8139cp: 10/100 PCI Ethernet driver v1.3 (Mar 22, 2004)
ACPI: PCI Interrupt Link [LNKC] enabled at IRQ 11
8139cp 0000:00:03.0: PCI INT A -> Link[LNKC] -> GSI 11 (level, high) -> IRQ 11
8139cp 0000:00:03.0: eth0: RTL-8139C+ at 0xffffc90000036000, 52:54:00:29:c0:cd, IRQ 11
8139cp 0000:00:03.0: setting latency timer to 64
8139too: 8139too Fast Ethernet driver 0.9.28
sr 1:0:0:0: Attached scsi generic sg0 type 5
sd 2:0:2:0: Attached scsi generic sg1 type 0
EXT4-fs (vda1): re-mounted. Opts: (null)
Adding 1048572k swap on /dev/vda2. Priority:-1 extents:1 across:1048572k
tun: Universal TUN/TAP device driver, 1.6
tun: (C) 1999-2004 Max Krasnyansky <maxk@qualcomm.com>
device virbr0-nic entered promiscuous mode
device virbr0-nic left promiscuous mode
virbr0: port 1(virbr0-nic) entering disabled state
The scan_unevictable_pages sysctl/node-interface has been disabled for lack of a legitimate use case. If you have one, please send an email to linux-mm@kvack.org.
sda: sda1
sd 2:0:2:0: [sda] abort
sd 2:0:2:0: device reset
sd 2:0:2:0: Device offlined - not ready after error recovery
sd 2:0:2:0: [sda] Unhandled error code
sd 2:0:2:0: [sda] Result: hostbyte=DID_OK driverbyte=DRIVER_TIMEOUT
sd 2:0:2:0: [sda] CDB: Write(10): 2a 00 01 2c 04 20 00 03 f0 00
end_request: I/O error, dev sda, sector 19661856
Buffer I/O error on device sda1, logical block 2457728
lost page write due to I/O error on sda1
Buffer I/O error on device sda1, logical block 2457729
lost page write due to I/O error on sda1
Buffer I/O error on device sda1, logical block 2457730
lost page write due to I/O error on sda1
Buffer I/O error on device sda1, logical block 2457731
lost page write due to I/O error on sda1
Buffer I/O error on device sda1, logical block 2457732
lost page write due to I/O error on sda1
Buffer I/O error on device sda1, logical block 2457733
lost page write due to I/O error on sda1
Buffer I/O error on device sda1, logical block 2457734
lost page write due to I/O error on sda1
Buffer I/O error on device sda1, logical block 2457735
lost page write due to I/O error on sda1
Buffer I/O error on device sda1, logical block 2457736
lost page write due to I/O error on sda1
Buffer I/O error on device sda1, logical block 2457737
lost page write due to I/O error on sda1
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: [sda] killing request
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: [sda] Unhandled error code
sd 2:0:2:0: [sda] Result: hostbyte=DID_NO_CONNECT driverbyte=DRIVER_OK
sd 2:0:2:0: [sda] CDB: Write(10): 2a 00 02 20 00 30 00 03 f0 00
end_request: I/O error, dev sda, sector 35651632
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
sd 2:0:2:0: rejecting I/O to offline device
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [Qemu-devel] [PATCH v2 00/15] SCSI s/g + SCSI migration + virtio-scsi
2012-01-30 9:33 ` Hu Tao
@ 2012-01-31 12:36 ` Paolo Bonzini
2012-02-09 5:46 ` Hu Tao
0 siblings, 1 reply; 30+ messages in thread
From: Paolo Bonzini @ 2012-01-31 12:36 UTC (permalink / raw)
To: Hu Tao; +Cc: qemu-devel
On 01/30/2012 10:33 AM, Hu Tao wrote:
>> > I cannot reproduce this with a 100G qcow2 image (created with
>> > "qemu-img create scsi.qcow2 100G" just before launching the host),
>> > with a partition starting at sector 2048 and extending to the end of
>> > the disk. mkfs (ext4) takes less than 1 minute and extends the
>> > qcow2 file to a little less than 2 gigs.
>
> I've re-tested today, with host kernel 2.6.35.6-45.fc14.x86_64,
> 2.6.32-71.el6.x86_64, 3.1.0 and 3.3.0-rc1+, qemu version and guest
> configuration remain the same, including guest kernel. It apears
> that the problem appears only when the host kernel version is 3.1.0.
There are two parts in the bug:
1) I/O cancellation doesn't actually cancel anything on qcow2 (and maybe
others) since the coroutine transition. This makes exception handling
basically unusable in the virtio-scsi guest driver. I have been working
on this but I don't have patches ready for testing yet.
2) Something unknown in the kernel is causing writes to take a longer
time than usual. This appears to be a problem only with 3.1.0 guest
kernels.
I think we can wait until (1) causes problems elsewhere. Thanks for
testing!
Paolo
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [Qemu-devel] [PATCH v2 00/15] SCSI s/g + SCSI migration + virtio-scsi
2012-01-31 12:36 ` Paolo Bonzini
@ 2012-02-09 5:46 ` Hu Tao
2012-02-09 7:13 ` Paolo Bonzini
0 siblings, 1 reply; 30+ messages in thread
From: Hu Tao @ 2012-02-09 5:46 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: qemu-devel
On Tue, Jan 31, 2012 at 01:36:04PM +0100, Paolo Bonzini wrote:
> On 01/30/2012 10:33 AM, Hu Tao wrote:
> >>> I cannot reproduce this with a 100G qcow2 image (created with
> >>> "qemu-img create scsi.qcow2 100G" just before launching the host),
> >>> with a partition starting at sector 2048 and extending to the end of
> >>> the disk. mkfs (ext4) takes less than 1 minute and extends the
> >>> qcow2 file to a little less than 2 gigs.
> >
> >I've re-tested today, with host kernel 2.6.35.6-45.fc14.x86_64,
> >2.6.32-71.el6.x86_64, 3.1.0 and 3.3.0-rc1+, qemu version and guest
> >configuration remain the same, including guest kernel. It apears
> >that the problem appears only when the host kernel version is 3.1.0.
Sorry, forget about the kernel versions. With very heavy IO load, it's
easy to reproduce the problem. In my case, 300 disks were attached to a
virtio-scsi HBA, and 300 dd processes were launched at the same time,
each for a disk.
tests also done for raw disk image, but no such problem.
>
> There are two parts in the bug:
>
> 1) I/O cancellation doesn't actually cancel anything on qcow2 (and
> maybe others) since the coroutine transition. This makes exception
> handling basically unusable in the virtio-scsi guest driver. I have
> been working on this but I don't have patches ready for testing yet.
>
> 2) Something unknown in the kernel is causing writes to take a
> longer time than usual. This appears to be a problem only with
> 3.1.0 guest kernels.
>
> I think we can wait until (1) causes problems elsewhere. Thanks for
> testing!
>
> Paolo
--
Thanks,
Hu Tao
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [Qemu-devel] [PATCH v2 00/15] SCSI s/g + SCSI migration + virtio-scsi
2012-02-09 5:46 ` Hu Tao
@ 2012-02-09 7:13 ` Paolo Bonzini
2012-02-09 8:08 ` Hu Tao
0 siblings, 1 reply; 30+ messages in thread
From: Paolo Bonzini @ 2012-02-09 7:13 UTC (permalink / raw)
To: Hu Tao; +Cc: qemu-devel
On 02/09/2012 06:46 AM, Hu Tao wrote:
>>> > >I've re-tested today, with host kernel 2.6.35.6-45.fc14.x86_64,
>>> > >2.6.32-71.el6.x86_64, 3.1.0 and 3.3.0-rc1+, qemu version and guest
>>> > >configuration remain the same, including guest kernel. It apears
>>> > >that the problem appears only when the host kernel version is 3.1.0.
> Sorry, forget about the kernel versions. With very heavy IO load, it's
> easy to reproduce the problem. In my case, 300 disks were attached to a
> virtio-scsi HBA, and 300 dd processes were launched at the same time,
> each for a disk.
Yes, we're not yet optimizing for _that_ kind of scalability. :) That
raw works is already surprising enough to me!
What disk was it? Can you try on an SSD?
Paolo
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [Qemu-devel] [PATCH v2 00/15] SCSI s/g + SCSI migration + virtio-scsi
2012-02-09 7:13 ` Paolo Bonzini
@ 2012-02-09 8:08 ` Hu Tao
0 siblings, 0 replies; 30+ messages in thread
From: Hu Tao @ 2012-02-09 8:08 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: qemu-devel
On Thu, Feb 09, 2012 at 08:13:52AM +0100, Paolo Bonzini wrote:
> On 02/09/2012 06:46 AM, Hu Tao wrote:
> >>>> >I've re-tested today, with host kernel 2.6.35.6-45.fc14.x86_64,
> >>>> >2.6.32-71.el6.x86_64, 3.1.0 and 3.3.0-rc1+, qemu version and guest
> >>>> >configuration remain the same, including guest kernel. It apears
> >>>> >that the problem appears only when the host kernel version is 3.1.0.
> >Sorry, forget about the kernel versions. With very heavy IO load, it's
> >easy to reproduce the problem. In my case, 300 disks were attached to a
> >virtio-scsi HBA, and 300 dd processes were launched at the same time,
> >each for a disk.
>
> Yes, we're not yet optimizing for _that_ kind of scalability. :)
> That raw works is already surprising enough to me!
Well, I'd like to say thanks for your works on virtio-scsi!
>
> What disk was it? Can you try on an SSD?
A Hitachi HDS721010CLA332, SATA II, 7200rpm. I'm afraid I can't test on
SSD since I have no SSD on hand.(and I don't think I'll have a SSD in
the near future :| )
--
Thanks,
Hu Tao
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [Qemu-devel] [PATCH 05/15] scsi: pass residual amount to command_complete
2012-01-16 16:30 ` [Qemu-devel] [PATCH 05/15] scsi: pass residual amount to command_complete Paolo Bonzini
@ 2012-02-10 11:44 ` Stefan Hajnoczi
2012-02-10 11:58 ` Paolo Bonzini
0 siblings, 1 reply; 30+ messages in thread
From: Stefan Hajnoczi @ 2012-02-10 11:44 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: qemu-devel
On Mon, Jan 16, 2012 at 4:30 PM, Paolo Bonzini <pbonzini@redhat.com> wrote:
> -static void esp_command_complete(SCSIRequest *req, uint32_t status)
> +static void esp_command_complete(SCSIRequest *req, uint32_t status,
> + int32_t resid)
Is there a reason to use a signed type for resid? (I expected
uint32_t to be safer and more natural.)
Stefan
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [Qemu-devel] [PATCH 05/15] scsi: pass residual amount to command_complete
2012-02-10 11:44 ` Stefan Hajnoczi
@ 2012-02-10 11:58 ` Paolo Bonzini
0 siblings, 0 replies; 30+ messages in thread
From: Paolo Bonzini @ 2012-02-10 11:58 UTC (permalink / raw)
To: Stefan Hajnoczi; +Cc: qemu-devel
On 02/10/2012 12:44 PM, Stefan Hajnoczi wrote:
>> > +static void esp_command_complete(SCSIRequest *req, uint32_t status,
>> > + int32_t resid)
> Is there a reason to use a signed type for resid? (I expected
> uint32_t to be safer and more natural.)
It's a mess; req->cmd.xfer is a size_t, but it should be an uint64_t
with tests that it doesn't overflow (for example if you ask to transfer
more than 2^55 logical blocks!).
scsi_req_enqueue returns an int32_t, so you cannot transfer more than
31-bits per command right now, but you're right that resid is computed
as size_t - int32_t and in principle could overflow the 32-bit value.
I plan to change all of this to 64-bit, but I'm not working too much on
SCSI because I'd rather not inflict even more virtio-scsi rebase pain on
myself.
Paolo
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [Qemu-devel] [PATCH 11/15] virtio-scsi: Add virtio-scsi stub device
2012-01-16 16:30 ` [Qemu-devel] [PATCH 11/15] virtio-scsi: Add virtio-scsi stub device Paolo Bonzini
@ 2012-02-10 12:41 ` Stefan Hajnoczi
2012-02-10 12:46 ` Paolo Bonzini
0 siblings, 1 reply; 30+ messages in thread
From: Stefan Hajnoczi @ 2012-02-10 12:41 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: qemu-devel, Stefan Hajnoczi
On Mon, Jan 16, 2012 at 4:30 PM, Paolo Bonzini <pbonzini@redhat.com> wrote:
> +static void virtio_scsi_get_config(VirtIODevice *vdev,
> + uint8_t *config)
> +{
> + VirtIOSCSIConfig *scsiconf = (VirtIOSCSIConfig *)config;
> + VirtIOSCSI *s = (VirtIOSCSI *)vdev;
> +
> + stl_raw(&scsiconf->num_queues, s->conf->num_queues);
> + stl_raw(&scsiconf->seg_max, 128 - 2);
> + stl_raw(&scsiconf->max_sectors, s->conf->max_sectors);
> + stl_raw(&scsiconf->cmd_per_lun, s->conf->cmd_per_lun);
> + stl_raw(&scsiconf->event_info_size, sizeof(VirtIOSCSIEvent));
> + stl_raw(&scsiconf->sense_size, s->sense_size);
> + stl_raw(&scsiconf->cdb_size, s->cdb_size);
> + stl_raw(&scsiconf->max_channel, VIRTIO_SCSI_MAX_CHANNEL);
> + stl_raw(&scsiconf->max_target, VIRTIO_SCSI_MAX_TARGET);
> + stl_raw(&scsiconf->max_lun, VIRTIO_SCSI_MAX_LUN);
At this early stage we still have the option of designing the device
to be little- or big-endian. I'm in favour of a fixed endianness even
though existing virtio devices tend to use guest-endian.
What do you think?
Stefan
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [Qemu-devel] [PATCH 11/15] virtio-scsi: Add virtio-scsi stub device
2012-02-10 12:41 ` Stefan Hajnoczi
@ 2012-02-10 12:46 ` Paolo Bonzini
0 siblings, 0 replies; 30+ messages in thread
From: Paolo Bonzini @ 2012-02-10 12:46 UTC (permalink / raw)
To: Stefan Hajnoczi; +Cc: qemu-devel, Stefan Hajnoczi
On 02/10/2012 01:41 PM, Stefan Hajnoczi wrote:
> At this early stage we still have the option of designing the device
> to be little- or big-endian. I'm in favour of a fixed endianness even
> though existing virtio devices tend to use guest-endian.
>
> What do you think?
Interesting idea, but I'd say no for three reasons:
1) The virtqueue would remain in guest-endianness.
2) Even if the result is better, it is still different from every other
device, so right now it would be a one-off exception (and it would
likely remain so; it's not like there are new virtio devices every week :)).
3) I'm afraid of breaking something else, for example pSeries virtio is
doing complicated things that I don't really understand to split the I/O
BAR in two parts, the first in PCI endianness and the second in native
endianness.
Paolo
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [Qemu-devel] [PATCH v2 00/15] SCSI s/g + SCSI migration + virtio-scsi
2012-01-16 16:30 [Qemu-devel] [PATCH v2 00/15] SCSI s/g + SCSI migration + virtio-scsi Paolo Bonzini
` (15 preceding siblings ...)
2012-01-18 7:39 ` [Qemu-devel] [PATCH v2 00/15] SCSI s/g + SCSI migration + virtio-scsi Hu Tao
@ 2012-02-10 14:01 ` Stefan Hajnoczi
2012-02-10 14:15 ` Paolo Bonzini
16 siblings, 1 reply; 30+ messages in thread
From: Stefan Hajnoczi @ 2012-02-10 14:01 UTC (permalink / raw)
To: Paolo Bonzini; +Cc: qemu-devel
On Mon, Jan 16, 2012 at 4:30 PM, Paolo Bonzini <pbonzini@redhat.com> wrote:
> Here is v2 (three counting the RFC) of the virtio-scsi driver.
> Unlike previous versions, it includes migration support.
>
> The only change in the spec has been s/UNDERRUN/OVERRUN/g.
>
> Paolo Bonzini (13):
> dma-helpers: make QEMUSGList target independent
> dma-helpers: add dma_buf_read and dma_buf_write
> dma-helpers: add accounting wrappers
> ahci: use new DMA helpers
> scsi: pass residual amount to command_complete
> scsi: add scatter/gather functionality
> scsi-disk: enable scatter/gather functionality
> scsi: add SCSIDevice vmstate definitions
> scsi-generic: add migration support
> scsi-disk: add migration support
> virtio-scsi: add basic SCSI bus operation
> virtio-scsi: process control queue requests
> virtio-scsi: add migration support
>
> Stefan Hajnoczi (2):
> virtio-scsi: Add virtio-scsi stub device
> virtio-scsi: Add basic request processing infrastructure
>
> Makefile.target | 1 +
> default-configs/pci.mak | 1 +
> default-configs/s390x-softmmu.mak | 1 +
> dma-helpers.c | 36 +++
> dma.h | 20 +-
> hw/esp.c | 3 +-
> hw/ide/ahci.c | 82 +-----
> hw/lsi53c895a.c | 2 +-
> hw/pci.h | 1 +
> hw/s390-virtio-bus.c | 24 ++
> hw/s390-virtio-bus.h | 2 +
> hw/scsi-bus.c | 143 +++++++++-
> hw/scsi-disk.c | 120 +++++++-
> hw/scsi-generic.c | 25 ++
> hw/scsi.h | 22 ++-
> hw/spapr_vscsi.c | 2 +-
> hw/usb-msd.c | 2 +-
> hw/virtio-pci.c | 42 +++
> hw/virtio-pci.h | 2 +
> hw/virtio-scsi.c | 607 +++++++++++++++++++++++++++++++++++++
> hw/virtio-scsi.h | 36 +++
> hw/virtio.h | 3 +
> 22 files changed, 1074 insertions(+), 103 deletions(-)
> create mode 100644 hw/virtio-scsi.c
> create mode 100644 hw/virtio-scsi.h
The virtio-scsi portions look good.
Stefan
^ permalink raw reply [flat|nested] 30+ messages in thread
* Re: [Qemu-devel] [PATCH v2 00/15] SCSI s/g + SCSI migration + virtio-scsi
2012-02-10 14:01 ` Stefan Hajnoczi
@ 2012-02-10 14:15 ` Paolo Bonzini
0 siblings, 0 replies; 30+ messages in thread
From: Paolo Bonzini @ 2012-02-10 14:15 UTC (permalink / raw)
To: Stefan Hajnoczi; +Cc: qemu-devel
On 02/10/2012 03:01 PM, Stefan Hajnoczi wrote:
> The virtio-scsi portions look good.
Thanks, I'll rebase and resubmit!
Paolo
^ permalink raw reply [flat|nested] 30+ messages in thread
end of thread, other threads:[~2012-02-10 14:16 UTC | newest]
Thread overview: 30+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-01-16 16:30 [Qemu-devel] [PATCH v2 00/15] SCSI s/g + SCSI migration + virtio-scsi Paolo Bonzini
2012-01-16 16:30 ` [Qemu-devel] [PATCH 01/15] dma-helpers: make QEMUSGList target independent Paolo Bonzini
2012-01-16 16:30 ` [Qemu-devel] [PATCH 02/15] dma-helpers: add dma_buf_read and dma_buf_write Paolo Bonzini
2012-01-16 16:30 ` [Qemu-devel] [PATCH 03/15] dma-helpers: add accounting wrappers Paolo Bonzini
2012-01-16 16:30 ` [Qemu-devel] [PATCH 04/15] ahci: use new DMA helpers Paolo Bonzini
2012-01-16 16:30 ` [Qemu-devel] [PATCH 05/15] scsi: pass residual amount to command_complete Paolo Bonzini
2012-02-10 11:44 ` Stefan Hajnoczi
2012-02-10 11:58 ` Paolo Bonzini
2012-01-16 16:30 ` [Qemu-devel] [PATCH 06/15] scsi: add scatter/gather functionality Paolo Bonzini
2012-01-16 16:30 ` [Qemu-devel] [PATCH 07/15] scsi-disk: enable " Paolo Bonzini
2012-01-16 16:30 ` [Qemu-devel] [PATCH 08/15] scsi: add SCSIDevice vmstate definitions Paolo Bonzini
2012-01-16 16:30 ` [Qemu-devel] [PATCH 09/15] scsi-generic: add migration support Paolo Bonzini
2012-01-16 16:30 ` [Qemu-devel] [PATCH 10/15] scsi-disk: " Paolo Bonzini
2012-01-16 16:30 ` [Qemu-devel] [PATCH 11/15] virtio-scsi: Add virtio-scsi stub device Paolo Bonzini
2012-02-10 12:41 ` Stefan Hajnoczi
2012-02-10 12:46 ` Paolo Bonzini
2012-01-16 16:30 ` [Qemu-devel] [PATCH 12/15] virtio-scsi: Add basic request processing infrastructure Paolo Bonzini
2012-01-16 16:30 ` [Qemu-devel] [PATCH 13/15] virtio-scsi: add basic SCSI bus operation Paolo Bonzini
2012-01-16 16:30 ` [Qemu-devel] [PATCH 14/15] virtio-scsi: process control queue requests Paolo Bonzini
2012-01-16 16:30 ` [Qemu-devel] [PATCH 15/15] virtio-scsi: add migration support Paolo Bonzini
2012-01-18 7:39 ` [Qemu-devel] [PATCH v2 00/15] SCSI s/g + SCSI migration + virtio-scsi Hu Tao
2012-01-19 15:53 ` Paolo Bonzini
2012-01-23 13:36 ` Paolo Bonzini
2012-01-30 9:33 ` Hu Tao
2012-01-31 12:36 ` Paolo Bonzini
2012-02-09 5:46 ` Hu Tao
2012-02-09 7:13 ` Paolo Bonzini
2012-02-09 8:08 ` Hu Tao
2012-02-10 14:01 ` Stefan Hajnoczi
2012-02-10 14:15 ` Paolo Bonzini
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).