umh: creds: convert call_usermodehelper_keys() to use subprocess_info->init()
[safe/jmp/linux-2.6] / virt / kvm / coalesced_mmio.c
index d68e6c6..5385017 100644 (file)
@@ -10,6 +10,7 @@
 #include "iodev.h"
 
 #include <linux/kvm_host.h>
+#include <linux/slab.h>
 #include <linux/kvm.h>
 
 #include "coalesced_mmio.h"
@@ -110,15 +111,19 @@ int kvm_coalesced_mmio_init(struct kvm *kvm)
        dev->kvm = kvm;
        kvm->coalesced_mmio_dev = dev;
 
-       ret = kvm_io_bus_register_dev(kvm, &kvm->mmio_bus, &dev->dev);
+       mutex_lock(&kvm->slots_lock);
+       ret = kvm_io_bus_register_dev(kvm, KVM_MMIO_BUS, &dev->dev);
+       mutex_unlock(&kvm->slots_lock);
        if (ret < 0)
                goto out_free_dev;
 
        return ret;
 
 out_free_dev:
+       kvm->coalesced_mmio_dev = NULL;
        kfree(dev);
 out_free_page:
+       kvm->coalesced_mmio_ring = NULL;
        __free_page(page);
 out_err:
        return ret;
@@ -131,23 +136,23 @@ void kvm_coalesced_mmio_free(struct kvm *kvm)
 }
 
 int kvm_vm_ioctl_register_coalesced_mmio(struct kvm *kvm,
-                                        struct kvm_coalesced_mmio_zone *zone)
+                                        struct kvm_coalesced_mmio_zone *zone)
 {
        struct kvm_coalesced_mmio_dev *dev = kvm->coalesced_mmio_dev;
 
        if (dev == NULL)
-               return -EINVAL;
+               return -ENXIO;
 
-       down_write(&kvm->slots_lock);
+       mutex_lock(&kvm->slots_lock);
        if (dev->nb_zones >= KVM_COALESCED_MMIO_ZONE_MAX) {
-               up_write(&kvm->slots_lock);
+               mutex_unlock(&kvm->slots_lock);
                return -ENOBUFS;
        }
 
        dev->zone[dev->nb_zones] = *zone;
        dev->nb_zones++;
 
-       up_write(&kvm->slots_lock);
+       mutex_unlock(&kvm->slots_lock);
        return 0;
 }
 
@@ -159,12 +164,12 @@ int kvm_vm_ioctl_unregister_coalesced_mmio(struct kvm *kvm,
        struct kvm_coalesced_mmio_zone *z;
 
        if (dev == NULL)
-               return -EINVAL;
+               return -ENXIO;
 
-       down_write(&kvm->slots_lock);
+       mutex_lock(&kvm->slots_lock);
 
        i = dev->nb_zones;
-       while(i) {
+       while (i) {
                z = &dev->zone[i - 1];
 
                /* unregister all zones
@@ -179,7 +184,7 @@ int kvm_vm_ioctl_unregister_coalesced_mmio(struct kvm *kvm,
                i--;
        }
 
-       up_write(&kvm->slots_lock);
+       mutex_unlock(&kvm->slots_lock);
 
        return 0;
 }