Explorar o código

Merge tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost

Pull virtio fixes from Michael Tsirkin:
 "This includes a bugfix for virtio 9p fs. It also fixes hybernation for
  s390 guests with virtio devices"

* tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost:
  virtio/s390: implement PM operations for virtio_ccw
  9p/trans_virtio: discard zero-length reply
Linus Torvalds %!s(int64=7) %!d(string=hai) anos
pai
achega
2439f9766d
Modificáronse 2 ficheiros con 31 adicións e 1 borrados
  1. 29 0
      drivers/s390/virtio/virtio_ccw.c
  2. 2 1
      net/9p/trans_virtio.c

+ 29 - 0
drivers/s390/virtio/virtio_ccw.c

@@ -1297,6 +1297,9 @@ static int virtio_ccw_cio_notify(struct ccw_device *cdev, int event)
 		vcdev->device_lost = true;
 		vcdev->device_lost = true;
 		rc = NOTIFY_DONE;
 		rc = NOTIFY_DONE;
 		break;
 		break;
+	case CIO_OPER:
+		rc = NOTIFY_OK;
+		break;
 	default:
 	default:
 		rc = NOTIFY_DONE;
 		rc = NOTIFY_DONE;
 		break;
 		break;
@@ -1309,6 +1312,27 @@ static struct ccw_device_id virtio_ids[] = {
 	{},
 	{},
 };
 };
 
 
+#ifdef CONFIG_PM_SLEEP
+static int virtio_ccw_freeze(struct ccw_device *cdev)
+{
+	struct virtio_ccw_device *vcdev = dev_get_drvdata(&cdev->dev);
+
+	return virtio_device_freeze(&vcdev->vdev);
+}
+
+static int virtio_ccw_restore(struct ccw_device *cdev)
+{
+	struct virtio_ccw_device *vcdev = dev_get_drvdata(&cdev->dev);
+	int ret;
+
+	ret = virtio_ccw_set_transport_rev(vcdev);
+	if (ret)
+		return ret;
+
+	return virtio_device_restore(&vcdev->vdev);
+}
+#endif
+
 static struct ccw_driver virtio_ccw_driver = {
 static struct ccw_driver virtio_ccw_driver = {
 	.driver = {
 	.driver = {
 		.owner = THIS_MODULE,
 		.owner = THIS_MODULE,
@@ -1321,6 +1345,11 @@ static struct ccw_driver virtio_ccw_driver = {
 	.set_online = virtio_ccw_online,
 	.set_online = virtio_ccw_online,
 	.notify = virtio_ccw_cio_notify,
 	.notify = virtio_ccw_cio_notify,
 	.int_class = IRQIO_VIR,
 	.int_class = IRQIO_VIR,
+#ifdef CONFIG_PM_SLEEP
+	.freeze = virtio_ccw_freeze,
+	.thaw = virtio_ccw_restore,
+	.restore = virtio_ccw_restore,
+#endif
 };
 };
 
 
 static int __init pure_hex(char **cp, unsigned int *val, int min_digit,
 static int __init pure_hex(char **cp, unsigned int *val, int min_digit,

+ 2 - 1
net/9p/trans_virtio.c

@@ -160,7 +160,8 @@ static void req_done(struct virtqueue *vq)
 		spin_unlock_irqrestore(&chan->lock, flags);
 		spin_unlock_irqrestore(&chan->lock, flags);
 		/* Wakeup if anyone waiting for VirtIO ring space. */
 		/* Wakeup if anyone waiting for VirtIO ring space. */
 		wake_up(chan->vc_wq);
 		wake_up(chan->vc_wq);
-		p9_client_cb(chan->client, req, REQ_STATUS_RCVD);
+		if (len)
+			p9_client_cb(chan->client, req, REQ_STATUS_RCVD);
 	}
 	}
 }
 }