vhost-user-scsi: reset the device if supported
If the vhost-user-scsi backend supports the VHOST_USER_F_RESET_DEVICE protocol feature, then the device can be reset when requested. If this feature is not supported, do not try a reset as this will send a VHOST_USER_RESET_OWNER that the backend is not expecting, potentially putting into an inoperable state. Signed-off-by: David Vrabel <david.vrabel@nutanix.com> Signed-off-by: Raphael Norwitz <raphael.norwitz@nutanix.com> Message-Id: <1572385083-5254-3-git-send-email-raphael.norwitz@nutanix.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
d91d57e604
commit
f047243938
@ -39,6 +39,10 @@ static const int user_feature_bits[] = {
|
|||||||
VHOST_INVALID_FEATURE_BIT
|
VHOST_INVALID_FEATURE_BIT
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum VhostUserProtocolFeature {
|
||||||
|
VHOST_USER_PROTOCOL_F_RESET_DEVICE = 13,
|
||||||
|
};
|
||||||
|
|
||||||
static void vhost_user_scsi_set_status(VirtIODevice *vdev, uint8_t status)
|
static void vhost_user_scsi_set_status(VirtIODevice *vdev, uint8_t status)
|
||||||
{
|
{
|
||||||
VHostUserSCSI *s = (VHostUserSCSI *)vdev;
|
VHostUserSCSI *s = (VHostUserSCSI *)vdev;
|
||||||
@ -62,6 +66,25 @@ static void vhost_user_scsi_set_status(VirtIODevice *vdev, uint8_t status)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void vhost_user_scsi_reset(VirtIODevice *vdev)
|
||||||
|
{
|
||||||
|
VHostSCSICommon *vsc = VHOST_SCSI_COMMON(vdev);
|
||||||
|
struct vhost_dev *dev = &vsc->dev;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Historically, reset was not implemented so only reset devices
|
||||||
|
* that are expecting it.
|
||||||
|
*/
|
||||||
|
if (!virtio_has_feature(dev->protocol_features,
|
||||||
|
VHOST_USER_PROTOCOL_F_RESET_DEVICE)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dev->vhost_ops->vhost_reset_device) {
|
||||||
|
dev->vhost_ops->vhost_reset_device(dev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void vhost_dummy_handle_output(VirtIODevice *vdev, VirtQueue *vq)
|
static void vhost_dummy_handle_output(VirtIODevice *vdev, VirtQueue *vq)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -182,6 +205,7 @@ static void vhost_user_scsi_class_init(ObjectClass *klass, void *data)
|
|||||||
vdc->get_features = vhost_scsi_common_get_features;
|
vdc->get_features = vhost_scsi_common_get_features;
|
||||||
vdc->set_config = vhost_scsi_common_set_config;
|
vdc->set_config = vhost_scsi_common_set_config;
|
||||||
vdc->set_status = vhost_user_scsi_set_status;
|
vdc->set_status = vhost_user_scsi_set_status;
|
||||||
|
vdc->reset = vhost_user_scsi_reset;
|
||||||
fwc->get_dev_path = vhost_scsi_common_get_fw_dev_path;
|
fwc->get_dev_path = vhost_scsi_common_get_fw_dev_path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user