This fixes the following warning:

  BUG: sleeping function called from invalid context at mm/slub.c:940
  in_atomic(): 1, irqs_disabled(): 1, pid: 17, name: khubd
  CPU: 0 PID: 17 Comm: khubd Not tainted 3.12.0-00004-g938dd60-dirty #1

   __might_sleep+0xbe/0xc0
   kmem_cache_alloc_trace+0x36/0x170
   c67x00_urb_enqueue+0x5c/0x254
   usb_hcd_submit_urb+0x66e/0x724
   usb_submit_urb+0x2ac/0x308
   usb_start_wait_urb+0x2c/0xb8
   usb_control_msg+0x8c/0xa8
   hub_port_init+0x191/0x718
   hub_thread+0x804/0xe14
   kthread+0x72/0x78
   ret_from_kernel_thread+0x8/0xc

Signed-off-by: Max Filippov <jcmvb...@gmail.com>
Acked-by: Peter Korsgaard <pe...@korsgaard.com>
---
 drivers/usb/c67x00/c67x00-sched.c | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/drivers/usb/c67x00/c67x00-sched.c 
b/drivers/usb/c67x00/c67x00-sched.c
index aa49162..d9cfe50 100644
--- a/drivers/usb/c67x00/c67x00-sched.c
+++ b/drivers/usb/c67x00/c67x00-sched.c
@@ -372,6 +372,13 @@ int c67x00_urb_enqueue(struct usb_hcd *hcd,
        struct c67x00_hcd *c67x00 = hcd_to_c67x00_hcd(hcd);
        int port = get_root_port(urb->dev)-1;
 
+       /* Allocate and initialize urb private data */
+       urbp = kzalloc(sizeof(*urbp), mem_flags);
+       if (!urbp) {
+               ret = -ENOMEM;
+               goto err_urbp;
+       }
+
        spin_lock_irqsave(&c67x00->lock, flags);
 
        /* Make sure host controller is running */
@@ -384,13 +391,6 @@ int c67x00_urb_enqueue(struct usb_hcd *hcd,
        if (ret)
                goto err_not_linked;
 
-       /* Allocate and initialize urb private data */
-       urbp = kzalloc(sizeof(*urbp), mem_flags);
-       if (!urbp) {
-               ret = -ENOMEM;
-               goto err_urbp;
-       }
-
        INIT_LIST_HEAD(&urbp->hep_node);
        urbp->urb = urb;
        urbp->port = port;
@@ -453,11 +453,11 @@ int c67x00_urb_enqueue(struct usb_hcd *hcd,
        return 0;
 
 err_epdata:
-       kfree(urbp);
-err_urbp:
        usb_hcd_unlink_urb_from_ep(hcd, urb);
 err_not_linked:
        spin_unlock_irqrestore(&c67x00->lock, flags);
+       kfree(urbp);
+err_urbp:
 
        return ret;
 }
-- 
1.8.1.4

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to