virtio-scsi.c (019adbd3715e98b5a09fab1370cc2c6904f79b6d) virtio-scsi.c (ef546f1275f6563e8934dd5e338d29d9f9909ca6)
1/*
2 * Virtio SCSI HBA
3 *
4 * Copyright IBM, Corp. 2010
5 * Copyright Red Hat, Inc. 2011
6 *
7 * Authors:
8 * Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>

--- 131 unchanged lines hidden (view full) ---

140 * request/response, making the payload start at the second element
141 * of the iovec.
142 *
143 * The actual length of the response header, stored in req->resp_size,
144 * does not change.
145 *
146 * TODO: always disable this workaround for virtio 1.0 devices.
147 */
1/*
2 * Virtio SCSI HBA
3 *
4 * Copyright IBM, Corp. 2010
5 * Copyright Red Hat, Inc. 2011
6 *
7 * Authors:
8 * Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>

--- 131 unchanged lines hidden (view full) ---

140 * request/response, making the payload start at the second element
141 * of the iovec.
142 *
143 * The actual length of the response header, stored in req->resp_size,
144 * does not change.
145 *
146 * TODO: always disable this workaround for virtio 1.0 devices.
147 */
148 if ((vdev->guest_features & (1 << VIRTIO_F_ANY_LAYOUT)) == 0) {
148 if (!virtio_has_feature(vdev, VIRTIO_F_ANY_LAYOUT)) {
149 req_size = req->elem.out_sg[0].iov_len;
150 resp_size = req->elem.in_sg[0].iov_len;
151 }
152
153 out_size = qemu_sgl_concat(req, req->elem.out_sg,
154 &req->elem.out_addr[0], req->elem.out_num,
155 req_size);
156 in_size = qemu_sgl_concat(req, req->elem.in_sg,

--- 587 unchanged lines hidden (view full) ---

744 }
745}
746
747static void virtio_scsi_change(SCSIBus *bus, SCSIDevice *dev, SCSISense sense)
748{
749 VirtIOSCSI *s = container_of(bus, VirtIOSCSI, bus);
750 VirtIODevice *vdev = VIRTIO_DEVICE(s);
751
149 req_size = req->elem.out_sg[0].iov_len;
150 resp_size = req->elem.in_sg[0].iov_len;
151 }
152
153 out_size = qemu_sgl_concat(req, req->elem.out_sg,
154 &req->elem.out_addr[0], req->elem.out_num,
155 req_size);
156 in_size = qemu_sgl_concat(req, req->elem.in_sg,

--- 587 unchanged lines hidden (view full) ---

744 }
745}
746
747static void virtio_scsi_change(SCSIBus *bus, SCSIDevice *dev, SCSISense sense)
748{
749 VirtIOSCSI *s = container_of(bus, VirtIOSCSI, bus);
750 VirtIODevice *vdev = VIRTIO_DEVICE(s);
751
752 if (((vdev->guest_features >> VIRTIO_SCSI_F_CHANGE) & 1) &&
752 if (virtio_has_feature(vdev, VIRTIO_SCSI_F_CHANGE) &&
753 dev->type != TYPE_ROM) {
754 virtio_scsi_push_event(s, dev, VIRTIO_SCSI_T_PARAM_CHANGE,
755 sense.asc | (sense.ascq << 8));
756 }
757}
758
759static void virtio_scsi_hotplug(HotplugHandler *hotplug_dev, DeviceState *dev,
760 Error **errp)

--- 4 unchanged lines hidden (view full) ---

765
766 if (s->ctx && !s->dataplane_disabled) {
767 if (blk_op_is_blocked(sd->conf.blk, BLOCK_OP_TYPE_DATAPLANE, errp)) {
768 return;
769 }
770 blk_op_block_all(sd->conf.blk, s->blocker);
771 }
772
753 dev->type != TYPE_ROM) {
754 virtio_scsi_push_event(s, dev, VIRTIO_SCSI_T_PARAM_CHANGE,
755 sense.asc | (sense.ascq << 8));
756 }
757}
758
759static void virtio_scsi_hotplug(HotplugHandler *hotplug_dev, DeviceState *dev,
760 Error **errp)

--- 4 unchanged lines hidden (view full) ---

765
766 if (s->ctx && !s->dataplane_disabled) {
767 if (blk_op_is_blocked(sd->conf.blk, BLOCK_OP_TYPE_DATAPLANE, errp)) {
768 return;
769 }
770 blk_op_block_all(sd->conf.blk, s->blocker);
771 }
772
773 if ((vdev->guest_features >> VIRTIO_SCSI_F_HOTPLUG) & 1) {
773 if (virtio_has_feature(vdev, VIRTIO_SCSI_F_HOTPLUG)) {
774 virtio_scsi_push_event(s, sd,
775 VIRTIO_SCSI_T_TRANSPORT_RESET,
776 VIRTIO_SCSI_EVT_RESET_RESCAN);
777 }
778}
779
780static void virtio_scsi_hotunplug(HotplugHandler *hotplug_dev, DeviceState *dev,
781 Error **errp)
782{
783 VirtIODevice *vdev = VIRTIO_DEVICE(hotplug_dev);
784 VirtIOSCSI *s = VIRTIO_SCSI(vdev);
785 SCSIDevice *sd = SCSI_DEVICE(dev);
786
774 virtio_scsi_push_event(s, sd,
775 VIRTIO_SCSI_T_TRANSPORT_RESET,
776 VIRTIO_SCSI_EVT_RESET_RESCAN);
777 }
778}
779
780static void virtio_scsi_hotunplug(HotplugHandler *hotplug_dev, DeviceState *dev,
781 Error **errp)
782{
783 VirtIODevice *vdev = VIRTIO_DEVICE(hotplug_dev);
784 VirtIOSCSI *s = VIRTIO_SCSI(vdev);
785 SCSIDevice *sd = SCSI_DEVICE(dev);
786
787 if ((vdev->guest_features >> VIRTIO_SCSI_F_HOTPLUG) & 1) {
787 if (virtio_has_feature(vdev, VIRTIO_SCSI_F_HOTPLUG)) {
788 virtio_scsi_push_event(s, sd,
789 VIRTIO_SCSI_T_TRANSPORT_RESET,
790 VIRTIO_SCSI_EVT_RESET_REMOVED);
791 }
792
793 if (s->ctx) {
794 blk_op_unblock_all(sd->conf.blk, s->blocker);
795 }

--- 201 unchanged lines hidden ---
788 virtio_scsi_push_event(s, sd,
789 VIRTIO_SCSI_T_TRANSPORT_RESET,
790 VIRTIO_SCSI_EVT_RESET_REMOVED);
791 }
792
793 if (s->ctx) {
794 blk_op_unblock_all(sd->conf.blk, s->blocker);
795 }

--- 201 unchanged lines hidden ---