diff options
author | Markus Elfring <elfring@users.sourceforge.net> | 2018-03-28 10:34:27 -0400 |
---|---|---|
committer | Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com> | 2018-03-28 10:34:27 -0400 |
commit | daa0524bc0a07048e33fdb61cae30467ef4ceff7 (patch) | |
tree | cf6817acd27a627678111944c8d96cc87c2c97b7 | |
parent | 3c097b069bb82391fcad73373eccbca8400636e7 (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.c | 46 |
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 | ||
1738 | error: | 1736 | error: |
1739 | if (dev) { | 1737 | fb_dealloc_cmap(&info->cmap); |
1740 | if (info) { | 1738 | destroy_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); | 1743 | put_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 | |||
1748 | e_nomem: | ||
1749 | retval = -ENOMEM; | ||
1750 | goto put_ref; | ||
1759 | } | 1751 | } |
1760 | 1752 | ||
1761 | static void ufx_usb_disconnect(struct usb_interface *interface) | 1753 | static void ufx_usb_disconnect(struct usb_interface *interface) |