VMCI: fix error handling path when registering guest driver
authorDmitry Torokhov <dtor@vmware.com>
Fri, 10 Jan 2014 00:02:33 +0000 (16:02 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 10 Jan 2014 00:16:15 +0000 (16:16 -0800)
When host capabilities check failed or when we were unable to register doorbell
bitmap we were forgetting to set error code and were returning 0 which would
make upper layers believe that probe was successful.

Reported-by: Julia Lawall <julia.lawall@lip6.fr>
Acked-by: Andy King <acking@vmware.com>
Signed-off-by: Dmitry Torokhov <dtor@vmware.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/misc/vmw_vmci/vmci_guest.c

index c98b03b993537aa62ff1e38242b6ad9dbc59b96d..d35cda06b5e866c98fe722fa7bc1e49a00a1de24 100644 (file)
@@ -165,7 +165,7 @@ static void vmci_guest_cid_update(u32 sub_id,
  * true if required hypercalls (or fallback hypercalls) are
  * supported by the host, false otherwise.
  */
-static bool vmci_check_host_caps(struct pci_dev *pdev)
+static int vmci_check_host_caps(struct pci_dev *pdev)
 {
        bool result;
        struct vmci_resource_query_msg *msg;
@@ -176,7 +176,7 @@ static bool vmci_check_host_caps(struct pci_dev *pdev)
        check_msg = kmalloc(msg_size, GFP_KERNEL);
        if (!check_msg) {
                dev_err(&pdev->dev, "%s: Insufficient memory\n", __func__);
-               return false;
+               return -ENOMEM;
        }
 
        check_msg->dst = vmci_make_handle(VMCI_HYPERVISOR_CONTEXT_ID,
@@ -196,7 +196,7 @@ static bool vmci_check_host_caps(struct pci_dev *pdev)
                __func__, result ? "PASSED" : "FAILED");
 
        /* We need the vector. There are no fallbacks. */
-       return result;
+       return result ? 0 : -ENXIO;
 }
 
 /*
@@ -564,12 +564,14 @@ static int vmci_guest_probe_device(struct pci_dev *pdev,
                        dev_warn(&pdev->dev,
                                 "VMCI device unable to register notification bitmap with PPN 0x%x\n",
                                 (u32) bitmap_ppn);
+                       error = -ENXIO;
                        goto err_remove_vmci_dev_g;
                }
        }
 
        /* Check host capabilities. */
-       if (!vmci_check_host_caps(pdev))
+       error = vmci_check_host_caps(pdev);
+       if (error)
                goto err_remove_bitmap;
 
        /* Enable device. */