aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarkus Elfring <elfring@users.sourceforge.net>2018-03-28 10:34:27 -0400
committerBartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>2018-03-28 10:34:27 -0400
commitdaa0524bc0a07048e33fdb61cae30467ef4ceff7 (patch)
treecf6817acd27a627678111944c8d96cc87c2c97b7
parent3c097b069bb82391fcad73373eccbca8400636e7 (diff)
video: smscufx: Less checks in ufx_usb_probe() after error detection
Up to four checks could be repeated by the ufx_usb_probe() function during error handling even if the relevant properties can be determined for the involved variables before by source code analysis. * Return directly after a call of the function "kzalloc" failed at the beginning. * Adjust jump targets so that extra checks can be omitted at the end. * Delete initialisations for the variables "info" and "retval" which became unnecessary with this refactoring. Signed-off-by: Markus Elfring <elfring@users.sourceforge.net> Cc: Steve Glendinning <steve.glendinning@shawell.net> Signed-off-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
-rw-r--r--drivers/video/fbdev/smscufx.c46
1 files changed, 19 insertions, 27 deletions
diff --git a/drivers/video/fbdev/smscufx.c b/drivers/video/fbdev/smscufx.c
index 8db7085e5d1a..893daeb1ffd9 100644
--- a/drivers/video/fbdev/smscufx.c
+++ b/drivers/video/fbdev/smscufx.c
@@ -1620,8 +1620,8 @@ static int ufx_usb_probe(struct usb_interface *interface,
1620{ 1620{
1621 struct usb_device *usbdev; 1621 struct usb_device *usbdev;
1622 struct ufx_data *dev; 1622 struct ufx_data *dev;
1623 struct fb_info *info = NULL; 1623 struct fb_info *info;
1624 int retval = -ENOMEM; 1624 int retval;
1625 u32 id_rev, fpga_rev; 1625 u32 id_rev, fpga_rev;
1626 1626
1627 /* usb initialization */ 1627 /* usb initialization */
@@ -1631,7 +1631,7 @@ static int ufx_usb_probe(struct usb_interface *interface,
1631 dev = kzalloc(sizeof(*dev), GFP_KERNEL); 1631 dev = kzalloc(sizeof(*dev), GFP_KERNEL);
1632 if (dev == NULL) { 1632 if (dev == NULL) {
1633 dev_err(&usbdev->dev, "ufx_usb_probe: failed alloc of dev struct\n"); 1633 dev_err(&usbdev->dev, "ufx_usb_probe: failed alloc of dev struct\n");
1634 goto error; 1634 return -ENOMEM;
1635 } 1635 }
1636 1636
1637 /* we need to wait for both usb and fbdev to spin down on disconnect */ 1637 /* we need to wait for both usb and fbdev to spin down on disconnect */
@@ -1652,9 +1652,8 @@ static int ufx_usb_probe(struct usb_interface *interface,
1652 dev_dbg(dev->gdev, "fb_defio enable=%d\n", fb_defio); 1652 dev_dbg(dev->gdev, "fb_defio enable=%d\n", fb_defio);
1653 1653
1654 if (!ufx_alloc_urb_list(dev, WRITES_IN_FLIGHT, MAX_TRANSFER)) { 1654 if (!ufx_alloc_urb_list(dev, WRITES_IN_FLIGHT, MAX_TRANSFER)) {
1655 retval = -ENOMEM;
1656 dev_err(dev->gdev, "ufx_alloc_urb_list failed\n"); 1655 dev_err(dev->gdev, "ufx_alloc_urb_list failed\n");
1657 goto error; 1656 goto e_nomem;
1658 } 1657 }
1659 1658
1660 /* We don't register a new USB class. Our client interface is fbdev */ 1659 /* We don't register a new USB class. Our client interface is fbdev */
@@ -1662,9 +1661,8 @@ static int ufx_usb_probe(struct usb_interface *interface,
1662 /* allocates framebuffer driver structure, not framebuffer memory */ 1661 /* allocates framebuffer driver structure, not framebuffer memory */
1663 info = framebuffer_alloc(0, &usbdev->dev); 1662 info = framebuffer_alloc(0, &usbdev->dev);
1664 if (!info) { 1663 if (!info) {
1665 retval = -ENOMEM;
1666 dev_err(dev->gdev, "framebuffer_alloc failed\n"); 1664 dev_err(dev->gdev, "framebuffer_alloc failed\n");
1667 goto error; 1665 goto e_nomem;
1668 } 1666 }
1669 1667
1670 dev->info = info; 1668 dev->info = info;
@@ -1675,7 +1673,7 @@ static int ufx_usb_probe(struct usb_interface *interface,
1675 retval = fb_alloc_cmap(&info->cmap, 256, 0); 1673 retval = fb_alloc_cmap(&info->cmap, 256, 0);
1676 if (retval < 0) { 1674 if (retval < 0) {
1677 dev_err(dev->gdev, "fb_alloc_cmap failed %x\n", retval); 1675 dev_err(dev->gdev, "fb_alloc_cmap failed %x\n", retval);
1678 goto error; 1676 goto destroy_modedb;
1679 } 1677 }
1680 1678
1681 INIT_DELAYED_WORK(&dev->free_framebuffer_work, 1679 INIT_DELAYED_WORK(&dev->free_framebuffer_work,
@@ -1736,26 +1734,20 @@ static int ufx_usb_probe(struct usb_interface *interface,
1736 return 0; 1734 return 0;
1737 1735
1738error: 1736error:
1739 if (dev) { 1737 fb_dealloc_cmap(&info->cmap);
1740 if (info) { 1738destroy_modedb:
1741 if (info->cmap.len != 0) 1739 fb_destroy_modedb(info->monspecs.modedb);
1742 fb_dealloc_cmap(&info->cmap); 1740 vfree(info->screen_base);
1743 if (info->monspecs.modedb) 1741 fb_destroy_modelist(&info->modelist);
1744 fb_destroy_modedb(info->monspecs.modedb); 1742 framebuffer_release(info);
1745 vfree(info->screen_base); 1743put_ref:
1746 1744 kref_put(&dev->kref, ufx_free); /* ref for framebuffer */
1747 fb_destroy_modelist(&info->modelist); 1745 kref_put(&dev->kref, ufx_free); /* last ref from kref_init */
1748
1749 framebuffer_release(info);
1750 }
1751
1752 kref_put(&dev->kref, ufx_free); /* ref for framebuffer */
1753 kref_put(&dev->kref, ufx_free); /* last ref from kref_init */
1754
1755 /* dev has been deallocated. Do not dereference */
1756 }
1757
1758 return retval; 1746 return retval;
1747
1748e_nomem:
1749 retval = -ENOMEM;
1750 goto put_ref;
1759} 1751}
1760 1752
1761static void ufx_usb_disconnect(struct usb_interface *interface) 1753static void ufx_usb_disconnect(struct usb_interface *interface)