]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - drivers/virtio/virtio_pci.c
virtio: find_vqs/del_vqs virtio operations
[net-next-2.6.git] / drivers / virtio / virtio_pci.c
index be4047abd5ba9f2b8dcf9401de6a1337a4a91f28..027f13fbe493fd61fafb97cc7fce67463c87146f 100644 (file)
@@ -276,11 +276,7 @@ static void vp_del_vq(struct virtqueue *vq)
 {
        struct virtio_pci_device *vp_dev = to_vp_device(vq->vdev);
        struct virtio_pci_vq_info *info = vq->priv;
-       unsigned long flags, size;
-
-       spin_lock_irqsave(&vp_dev->lock, flags);
-       list_del(&info->node);
-       spin_unlock_irqrestore(&vp_dev->lock, flags);
+       unsigned long size;
 
        vring_del_virtqueue(vq);
 
@@ -293,14 +289,41 @@ static void vp_del_vq(struct virtqueue *vq)
        kfree(info);
 }
 
+static void vp_del_vqs(struct virtio_device *vdev)
+{
+       struct virtqueue *vq, *n;
+
+       list_for_each_entry_safe(vq, n, &vdev->vqs, list)
+               vp_del_vq(vq);
+}
+
+static int vp_find_vqs(struct virtio_device *vdev, unsigned nvqs,
+                      struct virtqueue *vqs[],
+                      vq_callback_t *callbacks[],
+                      const char *names[])
+{
+       int i;
+
+       for (i = 0; i < nvqs; ++i) {
+               vqs[i] = vp_find_vq(vdev, i, callbacks[i], names[i]);
+               if (IS_ERR(vqs[i]))
+                       goto error;
+       }
+       return 0;
+
+error:
+       vp_del_vqs(vdev);
+       return PTR_ERR(vqs[i]);
+}
+
 static struct virtio_config_ops virtio_pci_config_ops = {
        .get            = vp_get,
        .set            = vp_set,
        .get_status     = vp_get_status,
        .set_status     = vp_set_status,
        .reset          = vp_reset,
-       .find_vq        = vp_find_vq,
-       .del_vq         = vp_del_vq,
+       .find_vqs       = vp_find_vqs,
+       .del_vqs        = vp_del_vqs,
        .get_features   = vp_get_features,
        .finalize_features = vp_finalize_features,
 };