static int virtio_pci_vector_unmask(PCIDevice *dev, unsigned vector,

                                    MSIMessage msg)

{

    VirtIOPCIProxy *proxy = container_of(dev, VirtIOPCIProxy, pci_dev);

    VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);

    VirtQueue *vq = virtio_vector_first_queue(vdev, vector);

    int ret, index, unmasked = 0;



    while (vq) {

        index = virtio_get_queue_index(vq);

        if (!virtio_queue_get_num(vdev, index)) {

            break;

        }

        ret = virtio_pci_vq_vector_unmask(proxy, index, vector, msg);

        if (ret < 0) {

            goto undo;

        }

        vq = virtio_vector_next_queue(vq);

        ++unmasked;

    }



    return 0;



undo:

    vq = virtio_vector_first_queue(vdev, vector);

    while (vq && --unmasked >= 0) {

        index = virtio_get_queue_index(vq);

        virtio_pci_vq_vector_mask(proxy, index, vector);

        vq = virtio_vector_next_queue(vq);

    }

    return ret;

}

static int virtio_pci_vector_unmask(PCIDevice *dev, unsigned vector,

                                    MSIMessage msg)

{

    VirtIOPCIProxy *proxy = container_of(dev, VirtIOPCIProxy, pci_dev);

    VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);

    VirtQueue *vq = virtio_vector_first_queue(vdev, vector);

    int ret, index, unmasked = 0;



    while (vq) {

        index = virtio_get_queue_index(vq);

        if (!virtio_queue_get_num(vdev, index)) {

            break;

        }

        ret = virtio_pci_vq_vector_unmask(proxy, index, vector, msg);

        if (ret < 0) {

            goto undo;

        }

        vq = virtio_vector_next_queue(vq);

        ++unmasked;

    }



    return 0;



undo:

    vq = virtio_vector_first_queue(vdev, vector);

    while (vq && --unmasked >= 0) {

        index = virtio_get_queue_index(vq);

        virtio_pci_vq_vector_mask(proxy, index, vector);

        vq = virtio_vector_next_queue(vq);

    }

    return ret;

}

static int FUNC_0(PCIDevice *VAR_0, unsigned VAR_1,

                                    MSIMessage VAR_2)

{

    VirtIOPCIProxy *proxy = container_of(VAR_0, VirtIOPCIProxy, pci_dev);

    VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus);

    VirtQueue *vq = virtio_vector_first_queue(vdev, VAR_1);

    int VAR_3, VAR_4, VAR_5 = 0;



    while (vq) {

        VAR_4 = virtio_get_queue_index(vq);

        if (!virtio_queue_get_num(vdev, VAR_4)) {

            break;

        }

        VAR_3 = virtio_pci_vq_vector_unmask(proxy, VAR_4, VAR_1, VAR_2);

        if (VAR_3 < 0) {

            goto undo;

        }

        vq = virtio_vector_next_queue(vq);

        ++VAR_5;

    }



    return 0;



undo:

    vq = virtio_vector_first_queue(vdev, VAR_1);

    while (vq && --VAR_5 >= 0) {

        VAR_4 = virtio_get_queue_index(vq);

        virtio_pci_vq_vector_mask(proxy, VAR_4, VAR_1);

        vq = virtio_vector_next_queue(vq);

    }

    return VAR_3;

}

static int FUNC_0(PCIDevice *VAR_0, unsigned VAR_1,
MSIMessage VAR_2)
{ VirtIOPCIProxy *proxy = container_of(VAR_0, VirtIOPCIProxy, pci_dev); VirtIODevice *vdev = virtio_bus_get_device(&proxy->bus); VirtQueue *vq = virtio_vector_first_queue(vdev, VAR_1); int VAR_3, VAR_4, VAR_5 = 0; while (vq) { VAR_4 = virtio_get_queue_index(vq); if (!virtio_queue_get_num(vdev, VAR_4)) { break; } VAR_3 = virtio_pci_vq_vector_unmask(proxy, VAR_4, VAR_1, VAR_2); if (VAR_3 < 0) { goto undo; } vq = virtio_vector_next_queue(vq); ++VAR_5; } return 0; undo:
vq = virtio_vector_first_queue(vdev, VAR_1); while (vq && --VAR_5 >= 0) { VAR_4 = virtio_get_queue_index(vq); virtio_pci_vq_vector_mask(proxy, VAR_4, VAR_1); vq = virtio_vector_next_queue(vq); } return VAR_3; }