USB: gadget: Drop NULL test on list_entry result
authorJulia Lawall <julia@diku.dk>
Sun, 12 Jul 2009 07:43:52 +0000 (09:43 +0200)
committerGreg Kroah-Hartman <gregkh@suse.de>
Wed, 23 Sep 2009 13:46:28 +0000 (06:46 -0700)
list_entry, which is an alias for container_of, cannot return NULL, as
there is no way to add a NULL value to a doubly linked list.

A simplified version of the semantic match that findds this problem is as
follows:
(http://www.emn.fr/x-info/coccinelle/)

// <smpl>
@r@
expression x,E;
statement S1,S2;
position p,p1;
@@

*x = list_entry@p(...)
... when != x = E
*if@p1 (x == NULL) S1 else S2
// </smpl>

Signed-off-by: Julia Lawall <julia@diku.dk>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/usb/gadget/amd5536udc.c

index 77352ccc245e0ab3a456b22ce0ed6a8b2f7e411b..d5b65962dd36a0bf9050cd61c51140979f9ca3d2 100644 (file)
@@ -2378,40 +2378,34 @@ static irqreturn_t udc_data_in_isr(struct udc *dev, int ep_ix)
                if (!ep->cancel_transfer && !list_empty(&ep->queue)) {
                        req = list_entry(ep->queue.next,
                                        struct udc_request, queue);
-                       if (req) {
-                               /*
-                                * length bytes transfered
-                                * check dma done of last desc. in PPBDU mode
-                                */
-                               if (use_dma_ppb_du) {
-                                       td = udc_get_last_dma_desc(req);
-                                       if (td) {
-                                               dma_done =
-                                                       AMD_GETBITS(td->status,
-                                                       UDC_DMA_IN_STS_BS);
-                                               /* don't care DMA done */
-                                               req->req.actual =
-                                                       req->req.length;
-                                       }
-                               } else {
-                                       /* assume all bytes transferred */
+                       /*
+                        * length bytes transfered
+                        * check dma done of last desc. in PPBDU mode
+                        */
+                       if (use_dma_ppb_du) {
+                               td = udc_get_last_dma_desc(req);
+                               if (td) {
+                                       dma_done =
+                                               AMD_GETBITS(td->status,
+                                               UDC_DMA_IN_STS_BS);
+                                       /* don't care DMA done */
                                        req->req.actual = req->req.length;
                                }
+                       } else {
+                               /* assume all bytes transferred */
+                               req->req.actual = req->req.length;
+                       }
 
-                               if (req->req.actual == req->req.length) {
-                                       /* complete req */
-                                       complete_req(ep, req, 0);
-                                       req->dma_going = 0;
-                                       /* further request available ? */
-                                       if (list_empty(&ep->queue)) {
-                                               /* disable interrupt */
-                                               tmp = readl(
-                                                       &dev->regs->ep_irqmsk);
-                                               tmp |= AMD_BIT(ep->num);
-                                               writel(tmp,
-                                                       &dev->regs->ep_irqmsk);
-                                       }
-
+                       if (req->req.actual == req->req.length) {
+                               /* complete req */
+                               complete_req(ep, req, 0);
+                               req->dma_going = 0;
+                               /* further request available ? */
+                               if (list_empty(&ep->queue)) {
+                                       /* disable interrupt */
+                                       tmp = readl(&dev->regs->ep_irqmsk);
+                                       tmp |= AMD_BIT(ep->num);
+                                       writel(tmp, &dev->regs->ep_irqmsk);
                                }
                        }
                }