]> xenbits.xensource.com Git - people/royger/linux-2.6.18-xen.git/commitdiff
usbback: check return value of xenbus_register in usbback_init().
authorKeir Fraser <keir.fraser@citrix.com>
Fri, 23 Oct 2009 09:06:48 +0000 (10:06 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Fri, 23 Oct 2009 09:06:48 +0000 (10:06 +0100)
Signed-off-by: Noboru Iwamatsu <n_iwamatsu@jp.fujitsu.com>
drivers/xen/usbback/usbback.c
drivers/xen/usbback/usbback.h
drivers/xen/usbback/usbstub.c
drivers/xen/usbback/xenbus.c

index de60468d27c6ed414ee83fd1a04655dedd4f19d9..3c26214f3407264460206e9ba6a1cfdad9f95221 100644 (file)
@@ -1093,13 +1093,11 @@ void detach_device_without_lock(usbif_t *usbif, struct usbstub *stub)
 static int __init usbback_init(void)
 {
        int i, mmap_pages;
+       int err = 0;
 
        if (!is_running_on_xen())
                return -ENODEV;
 
-       if (usbstub_init())
-               return -ENODEV;
-
        mmap_pages = usbif_reqs * USBIF_MAX_SEGMENTS_PER_REQUEST;
        pending_reqs = kmalloc(sizeof(pending_reqs[0]) *
                        usbif_reqs, GFP_KERNEL);
@@ -1107,8 +1105,10 @@ static int __init usbback_init(void)
                        mmap_pages, GFP_KERNEL);
        pending_pages = alloc_empty_pages_and_pagevec(mmap_pages);
 
-       if (!pending_reqs || !pending_grant_handles || !pending_pages)
-               goto out_of_memory;
+       if (!pending_reqs || !pending_grant_handles || !pending_pages) {
+               err = -ENOMEM;
+               goto out_mem;
+       }
 
        for (i = 0; i < mmap_pages; i++)
                pending_grant_handles[i] = USBBACK_INVALID_HANDLE;
@@ -1119,16 +1119,23 @@ static int __init usbback_init(void)
        for (i = 0; i < usbif_reqs; i++)
                list_add_tail(&pending_reqs[i].free_list, &pending_free);
 
-       usbback_xenbus_init();
+       err = usbstub_init();
+       if (err)
+               goto out_mem;
+
+       err = usbback_xenbus_init();
+       if (err)
+               goto out_xenbus;
 
        return 0;
 
- out_of_memory:
-        kfree(pending_reqs);
-        kfree(pending_grant_handles);
-        free_empty_pages_and_pagevec(pending_pages, mmap_pages);
-        printk("%s: out of memory\n", __FUNCTION__);
-        return -ENOMEM;
+out_xenbus:
+       usbstub_exit();
+out_mem:
+       kfree(pending_reqs);
+       kfree(pending_grant_handles);
+       free_empty_pages_and_pagevec(pending_pages, mmap_pages);
+       return err;
 }
 
 static void __exit usbback_exit(void)
index 42eb3cf59d2790382745493c4e9b722bb5c65506..c92819bb41ed6c2ca1d56f1c537e45d6238570e4 100644 (file)
@@ -145,7 +145,7 @@ int usbif_map(usbif_t *usbif, unsigned long urb_ring_ref,
        } while (0)
 
 usbif_t *find_usbif(domid_t domid, unsigned int handle);
-void usbback_xenbus_init(void);
+int usbback_xenbus_init(void);
 void usbback_xenbus_exit(void);
 struct vusb_port_id *find_portid_by_busid(const char *busid);
 struct vusb_port_id *find_portid(const domid_t domid,
index f9344fdabddb04d6b483d4e0560e37782d72300c..003ef0283b07dab2395c3a03896b56622cc528c5 100644 (file)
@@ -317,7 +317,7 @@ out:
        return err;
 }
 
-void __exit usbstub_exit(void)
+void usbstub_exit(void)
 {
        driver_remove_file(&usbback_usb_driver.driver,
                                &driver_attr_port_ids);
index a030f60d70678b28c7ae15f1878b8aaef1a06e34..34156675251b174c1c394e8915eb83b4174e7e7c 100644 (file)
@@ -327,12 +327,12 @@ static struct xenbus_driver usbback_driver = {
        .remove = usbback_remove,
 };
 
-void usbback_xenbus_init(void)
+int __init usbback_xenbus_init(void)
 {
-       xenbus_register_backend(&usbback_driver);
+       return xenbus_register_backend(&usbback_driver);
 }
 
-void usbback_xenbus_exit(void)
+void __exit usbback_xenbus_exit(void)
 {
        xenbus_unregister_driver(&usbback_driver);
 }