From patchwork Mon Feb 19 18:11:56 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: SF Markus Elfring X-Patchwork-Id: 10228473 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 35F42602B1 for ; Mon, 19 Feb 2018 18:13:58 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 25F3F28B2A for ; Mon, 19 Feb 2018 18:13:58 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 191AE28B36; Mon, 19 Feb 2018 18:13:58 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=unavailable version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A3ADF28B2A for ; Mon, 19 Feb 2018 18:13:56 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753464AbeBSSNq (ORCPT ); Mon, 19 Feb 2018 13:13:46 -0500 Received: from mout.web.de ([212.227.17.12]:40403 "EHLO mout.web.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753185AbeBSSNn (ORCPT ); Mon, 19 Feb 2018 13:13:43 -0500 Received: from [192.168.1.2] ([77.182.62.182]) by smtp.web.de (mrweb101 [213.165.67.124]) with ESMTPSA (Nemesis) id 0LbaBL-1eKahZ13uN-00lF2I; Mon, 19 Feb 2018 19:12:06 +0100 To: linux-media@vger.kernel.org, Al Viro , Andi Shyti , Andrew Morton , Andrey Utkin , Arvind Yadav , Bhumika Goyal , Bjorn Helgaas , Brian Johnson , =?UTF-8?Q?Christoph_B=c3=b6hmwalder?= , Christophe Jaillet , Colin Ian King , Daniele Nicolodi , =?UTF-8?Q?David_H=c3=a4rdeman?= , Devendra Sharma , "Gustavo A. R. Silva" , Hans Verkuil , Inki Dae , Joe Perches , Kees Cook , Laurent Pinchart , Masahiro Yamada , Mauro Carvalho Chehab , Max Kellermann , Mike Isely , Philippe Ombredanne , Sakari Ailus , Santosh Kumar Singh , Satendra Singh Thakur , Sean Young , Seung-Woo Kim , Shyam Saini , Thomas Gleixner , Todor Tomov , Wei Yongjun Cc: LKML , kernel-janitors@vger.kernel.org From: SF Markus Elfring Subject: [PATCH v2] [media] Use common error handling code in 20 functions Message-ID: <227d2d7c-5aee-1190-1624-26596a048d9c@users.sourceforge.net> Date: Mon, 19 Feb 2018 19:11:56 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.6.0 MIME-Version: 1.0 Content-Language: en-GB X-Provags-ID: V03:K0:gCe89BucL7Mj3yDXmZD/aGdwJYkH7n5vLux0HID03BnVmhtb7Of KGvlei3U6hOkvPkoXuk8I8F6Rw1E467Vv4rsJ3wYdZqTy/b0M5683dlqexjIJ0xFXpSSm3+ lylkgrR0M0L0Lje9Cs30ObsIXKCUSHm3Oh8ThELle9Snc6ZlxWkgBNmxUZg1jTVlfSE0a1L B7S3ij0hWRT9wXjnwFBiQ== X-UI-Out-Filterresults: notjunk:1; V01:K0:tzBoXiKs+jw=:0Sjy5Xfa1zW9l/l/FeQTc2 Jq0SGA+hQlneKvc0Xt69f0wBWzElWDrYnRxnQbK5LpOzqj6p6lfcqFYRFa1CF/Gd2IBMwP/MX hQfvdIc88fH7Qy2cy8gGeGIDXepxe8Y8r2kwXtUeWaydgWR7Yi8jaw05kGlA0jdhgwz9pOvUo kQGgw5J2rm8EzmcxVFh6wS0Et0JTA09WVWAnXkwT9p8O1MI2nEJa5zvPRtFFRTQsNvOAJyNzt gc/fEVpA5biZ5Qk/iu/hRPMgeRZSd8BgGssggzAu44pj4RON649XzWO1uvMQpmBbp6WPBF0UK yYGKb0rHu0D9azH1Km5UvDAjkMCdAVCEHLzQQ6YYeQij7v6yTf2elKAI4y8/q3JWT6lWuuAay 8hNiLxucp2aWK2xuC6wbN9TFtJoM4W/OdmGv9wjkB0e+MgzoIz+xY2gSQgxtribHuISIbSWxX scBPOQ9FtRnRPFESY1+IxiMLGLaFcUd4S3MQkRLlEsmMoLF36sDJb36xxfzls80QN+W4imle6 1TjVSDiJZ0vl6L7cqoAz7/7IYiO8fiqJzLNld9jLfmFj9E3zaCIJv+uvYADKHsTJefopEkzyN GK0KfpvG1EhUwoVetuWo5F7Ra1vHXP/4kWSSutLFwgA1Lv71CMhcKzwQc7pUnydK/kTC9KEKe 9+bQB+9VXhLlUZb5SL8PXOP0BUzoquGLEVteyod5af6Of6Yu5B7693tMiQF7Dgix7r80Z89Ji jWTNXCzDKWIDaAtNf14aftyZ2huHwpTL7tpP2qo9pI2g+5OupKnMRBTkbSOcr1N456+u8lYjB otH+8MvfuB5wwa5R5bvzgCS9hwGH9fEiwjNk3HD4/vBBWAhsDzvxgHHRiGkN0EJ1Tg85Jnyeg GCS+VAkDfElg/vhyMz9taIo7RchkRX27iAkj4SUAIIRgc21MMet5wGMY7v2+nT Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Markus Elfring Date: Mon, 19 Feb 2018 18:50:40 +0100 Adjust jump targets so that a bit of exception handling can be better reused at the end of these functions. This issue was partly detected by using the Coccinelle software. Signed-off-by: Markus Elfring Nacked-by: Laurent Pinchart --- v2: Hans Verkuil insisted on patch squashing. Thus several changes were recombined based on source files from Linux next-20180216. The implementation of the function "tda8261_set_params" was improved after a notification by Christoph Böhmwalder on 2017-09-26. drivers/media/dvb-core/dmxdev.c | 16 ++++---- drivers/media/dvb-frontends/tda1004x.c | 20 ++++++---- drivers/media/dvb-frontends/tda8261.c | 19 ++++++---- drivers/media/pci/bt8xx/dst.c | 19 ++++++---- drivers/media/pci/bt8xx/dst_ca.c | 30 +++++++-------- drivers/media/pci/cx88/cx88-input.c | 17 +++++---- drivers/media/platform/omap3isp/ispvideo.c | 29 +++++++-------- .../media/platform/qcom/camss-8x16/camss-csid.c | 20 +++++----- drivers/media/tuners/tuner-xc2028.c | 30 +++++++-------- drivers/media/usb/cpia2/cpia2_usb.c | 13 ++++--- drivers/media/usb/gspca/gspca.c | 17 +++++---- drivers/media/usb/gspca/sn9c20x.c | 17 +++++---- drivers/media/usb/pvrusb2/pvrusb2-ioread.c | 10 +++-- drivers/media/usb/tm6000/tm6000-cards.c | 7 ++-- drivers/media/usb/tm6000/tm6000-dvb.c | 11 ++++-- drivers/media/usb/tm6000/tm6000-video.c | 13 ++++--- drivers/media/usb/ttusb-budget/dvb-ttusb-budget.c | 13 +++---- drivers/media/usb/ttusb-dec/ttusb_dec.c | 43 ++++++++-------------- drivers/media/usb/uvc/uvc_v4l2.c | 13 ++++--- 19 files changed, 180 insertions(+), 177 deletions(-) diff --git a/drivers/media/dvb-core/dmxdev.c b/drivers/media/dvb-core/dmxdev.c index 6d53af00190e..6a0411c91195 100644 --- a/drivers/media/dvb-core/dmxdev.c +++ b/drivers/media/dvb-core/dmxdev.c @@ -645,18 +645,18 @@ static int dvb_dmxdev_start_feed(struct dmxdev *dmxdev, tsfeed->priv = filter; ret = tsfeed->set(tsfeed, feed->pid, ts_type, ts_pes, timeout); - if (ret < 0) { - dmxdev->demux->release_ts_feed(dmxdev->demux, tsfeed); - return ret; - } + if (ret < 0) + goto release_feed; ret = tsfeed->start_filtering(tsfeed); - if (ret < 0) { - dmxdev->demux->release_ts_feed(dmxdev->demux, tsfeed); - return ret; - } + if (ret < 0) + goto release_feed; return 0; + +release_feed: + dmxdev->demux->release_ts_feed(dmxdev->demux, tsfeed); + return ret; } static int dvb_dmxdev_filter_start(struct dmxdev_filter *filter) diff --git a/drivers/media/dvb-frontends/tda1004x.c b/drivers/media/dvb-frontends/tda1004x.c index 58e3beff5adc..85ca111fc8c4 100644 --- a/drivers/media/dvb-frontends/tda1004x.c +++ b/drivers/media/dvb-frontends/tda1004x.c @@ -1299,20 +1299,22 @@ struct dvb_frontend* tda10045_attach(const struct tda1004x_config* config, id = tda1004x_read_byte(state, TDA1004X_CHIPID); if (id < 0) { printk(KERN_ERR "tda10045: chip is not answering. Giving up.\n"); - kfree(state); - return NULL; + goto free_state; } if (id != 0x25) { printk(KERN_ERR "Invalid tda1004x ID = 0x%02x. Can't proceed\n", id); - kfree(state); - return NULL; + goto free_state; } /* create dvb_frontend */ memcpy(&state->frontend.ops, &tda10045_ops, sizeof(struct dvb_frontend_ops)); state->frontend.demodulator_priv = state; return &state->frontend; + +free_state: + kfree(state); + return NULL; } static const struct dvb_frontend_ops tda10046_ops = { @@ -1369,19 +1371,21 @@ struct dvb_frontend* tda10046_attach(const struct tda1004x_config* config, id = tda1004x_read_byte(state, TDA1004X_CHIPID); if (id < 0) { printk(KERN_ERR "tda10046: chip is not answering. Giving up.\n"); - kfree(state); - return NULL; + goto free_state; } if (id != 0x46) { printk(KERN_ERR "Invalid tda1004x ID = 0x%02x. Can't proceed\n", id); - kfree(state); - return NULL; + goto free_state; } /* create dvb_frontend */ memcpy(&state->frontend.ops, &tda10046_ops, sizeof(struct dvb_frontend_ops)); state->frontend.demodulator_priv = state; return &state->frontend; + +free_state: + kfree(state); + return NULL; } module_param(debug, int, 0644); diff --git a/drivers/media/dvb-frontends/tda8261.c b/drivers/media/dvb-frontends/tda8261.c index f72a54e7eb23..7b9a29939b74 100644 --- a/drivers/media/dvb-frontends/tda8261.c +++ b/drivers/media/dvb-frontends/tda8261.c @@ -129,18 +129,17 @@ static int tda8261_set_params(struct dvb_frontend *fe) /* Set params */ err = tda8261_write(state, buf); - if (err < 0) { - pr_err("%s: I/O Error\n", __func__); - return err; - } + if (err < 0) + goto report_failure; + /* sleep for some time */ pr_debug("%s: Waiting to Phase LOCK\n", __func__); msleep(20); /* check status */ - if ((err = tda8261_get_status(fe, &status)) < 0) { - pr_err("%s: I/O Error\n", __func__); - return err; - } + err = tda8261_get_status(fe, &status); + if (err < 0) + goto report_failure; + if (status == 1) { pr_debug("%s: Tuner Phase locked: status=%d\n", __func__, status); @@ -150,6 +149,10 @@ static int tda8261_set_params(struct dvb_frontend *fe) } return 0; + +report_failure: + pr_err("%s: I/O Error\n", __func__); + return err; } static void tda8261_release(struct dvb_frontend *fe) diff --git a/drivers/media/pci/bt8xx/dst.c b/drivers/media/pci/bt8xx/dst.c index 4f0bba9e4c48..7014cb6a0ad6 100644 --- a/drivers/media/pci/bt8xx/dst.c +++ b/drivers/media/pci/bt8xx/dst.c @@ -134,17 +134,20 @@ EXPORT_SYMBOL(rdc_reset_state); static int rdc_8820_reset(struct dst_state *state) { dprintk(3, "Resetting DST\n"); - if (dst_gpio_outb(state, RDC_8820_RESET, RDC_8820_RESET, 0, NO_DELAY) < 0) { - pr_err("dst_gpio_outb ERROR !\n"); - return -1; - } + if (dst_gpio_outb(state, RDC_8820_RESET, RDC_8820_RESET, 0, NO_DELAY) + < 0) + goto report_failure; + udelay(1000); - if (dst_gpio_outb(state, RDC_8820_RESET, RDC_8820_RESET, RDC_8820_RESET, DELAY) < 0) { - pr_err("dst_gpio_outb ERROR !\n"); - return -1; - } + if (dst_gpio_outb(state, RDC_8820_RESET, RDC_8820_RESET, + RDC_8820_RESET, DELAY) < 0) + goto report_failure; return 0; + +report_failure: + pr_err("dst_gpio_outb ERROR !\n"); + return -1; } static int dst_pio_enable(struct dst_state *state) diff --git a/drivers/media/pci/bt8xx/dst_ca.c b/drivers/media/pci/bt8xx/dst_ca.c index 0a7623c0fc8e..26e05a8457e6 100644 --- a/drivers/media/pci/bt8xx/dst_ca.c +++ b/drivers/media/pci/bt8xx/dst_ca.c @@ -83,33 +83,33 @@ static int dst_ci_command(struct dst_state* state, u8 * data, u8 *ca_string, u8 if (write_dst(state, data, len)) { dprintk(verbose, DST_CA_INFO, 1, " Write not successful, trying to recover"); - dst_error_recovery(state); - goto error; + goto error_recovery; } if ((dst_pio_disable(state)) < 0) { dprintk(verbose, DST_CA_ERROR, 1, " DST PIO disable failed."); - goto error; - } - if (read_dst(state, &reply, GET_ACK) < 0) { - dprintk(verbose, DST_CA_INFO, 1, " Read not successful, trying to recover"); - dst_error_recovery(state); - goto error; + goto unlock; } + if (read_dst(state, &reply, GET_ACK) < 0) + goto report_read_failure; + if (read) { if (! dst_wait_dst_ready(state, LONG_DELAY)) { dprintk(verbose, DST_CA_NOTICE, 1, " 8820 not ready"); - goto error; - } - if (read_dst(state, ca_string, 128) < 0) { /* Try to make this dynamic */ - dprintk(verbose, DST_CA_INFO, 1, " Read not successful, trying to recover"); - dst_error_recovery(state); - goto error; + goto unlock; } + /* Try to make this dynamic */ + if (read_dst(state, ca_string, 128) < 0) + goto report_read_failure; } mutex_unlock(&state->dst_mutex); return 0; -error: +report_read_failure: + dprintk(verbose, DST_CA_INFO, 1, + " Read not successful, trying to recover"); +error_recovery: + dst_error_recovery(state); +unlock: mutex_unlock(&state->dst_mutex); return -EIO; } diff --git a/drivers/media/pci/cx88/cx88-input.c b/drivers/media/pci/cx88/cx88-input.c index 4e9953e61a12..c972efcd6bb6 100644 --- a/drivers/media/pci/cx88/cx88-input.c +++ b/drivers/media/pci/cx88/cx88-input.c @@ -566,20 +566,17 @@ static int get_key_pvr2000(struct IR_i2c *ir, enum rc_proto *protocol, /* poll IR chip */ flags = i2c_smbus_read_byte_data(ir->c, 0x10); - if (flags < 0) { - dprintk("read error\n"); - return 0; - } + if (flags < 0) + goto report_read_failure; + /* key pressed ? */ if (0 == (flags & 0x80)) return 0; /* read actual key code */ code = i2c_smbus_read_byte_data(ir->c, 0x00); - if (code < 0) { - dprintk("read error\n"); - return 0; - } + if (code < 0) + goto report_read_failure; dprintk("IR Key/Flags: (0x%02x/0x%02x)\n", code & 0xff, flags & 0xff); @@ -588,6 +585,10 @@ static int get_key_pvr2000(struct IR_i2c *ir, enum rc_proto *protocol, *scancode = code & 0xff; *toggle = 0; return 1; + +report_read_failure: + dprintk("read error\n"); + return 0; } void cx88_i2c_init_ir(struct cx88_core *core) diff --git a/drivers/media/platform/omap3isp/ispvideo.c b/drivers/media/platform/omap3isp/ispvideo.c index a751c89a3ea8..2ddcac736402 100644 --- a/drivers/media/platform/omap3isp/ispvideo.c +++ b/drivers/media/platform/omap3isp/ispvideo.c @@ -1315,14 +1315,12 @@ static int isp_video_open(struct file *file) /* If this is the first user, initialise the pipeline. */ if (omap3isp_get(video->isp) == NULL) { ret = -EBUSY; - goto done; + goto delete_fh; } ret = v4l2_pipeline_pm_use(&video->video.entity, 1); - if (ret < 0) { - omap3isp_put(video->isp); - goto done; - } + if (ret < 0) + goto put_isp; queue = &handle->queue; queue->type = video->type; @@ -1335,10 +1333,8 @@ static int isp_video_open(struct file *file) queue->dev = video->isp->dev; ret = vb2_queue_init(&handle->queue); - if (ret < 0) { - omap3isp_put(video->isp); - goto done; - } + if (ret < 0) + goto put_isp; memset(&handle->format, 0, sizeof(handle->format)); handle->format.type = video->type; @@ -1346,14 +1342,15 @@ static int isp_video_open(struct file *file) handle->video = video; file->private_data = &handle->vfh; + goto exit; -done: - if (ret < 0) { - v4l2_fh_del(&handle->vfh); - v4l2_fh_exit(&handle->vfh); - kfree(handle); - } - +put_isp: + omap3isp_put(video->isp); +delete_fh: + v4l2_fh_del(&handle->vfh); + v4l2_fh_exit(&handle->vfh); + kfree(handle); +exit: return ret; } diff --git a/drivers/media/platform/qcom/camss-8x16/camss-csid.c b/drivers/media/platform/qcom/camss-8x16/camss-csid.c index 64df82817de3..92d4dc6b4a66 100644 --- a/drivers/media/platform/qcom/camss-8x16/camss-csid.c +++ b/drivers/media/platform/qcom/camss-8x16/camss-csid.c @@ -328,16 +328,12 @@ static int csid_set_power(struct v4l2_subdev *sd, int on) return ret; ret = csid_set_clock_rates(csid); - if (ret < 0) { - regulator_disable(csid->vdda); - return ret; - } + if (ret < 0) + goto disable_regulator; ret = camss_enable_clocks(csid->nclocks, csid->clock, dev); - if (ret < 0) { - regulator_disable(csid->vdda); - return ret; - } + if (ret < 0) + goto disable_regulator; enable_irq(csid->irq); @@ -345,8 +341,7 @@ static int csid_set_power(struct v4l2_subdev *sd, int on) if (ret < 0) { disable_irq(csid->irq); camss_disable_clocks(csid->nclocks, csid->clock); - regulator_disable(csid->vdda); - return ret; + goto disable_regulator; } hw_version = readl_relaxed(csid->base + CAMSS_CSID_HW_VERSION); @@ -357,6 +352,11 @@ static int csid_set_power(struct v4l2_subdev *sd, int on) ret = regulator_disable(csid->vdda); } + goto exit; + +disable_regulator: + regulator_disable(csid->vdda); +exit: return ret; } diff --git a/drivers/media/tuners/tuner-xc2028.c b/drivers/media/tuners/tuner-xc2028.c index fca85e08ebd7..2199b04c0ba9 100644 --- a/drivers/media/tuners/tuner-xc2028.c +++ b/drivers/media/tuners/tuner-xc2028.c @@ -571,7 +571,7 @@ static int load_firmware(struct dvb_frontend *fe, unsigned int type, /* Checks if there's enough bytes to read */ if (p + sizeof(size) > endp) { tuner_err("Firmware chunk size is wrong\n"); - return -EINVAL; + goto e_inval; } size = le16_to_cpu(*(__le16 *) p); @@ -583,28 +583,23 @@ static int load_firmware(struct dvb_frontend *fe, unsigned int type, if (!size) { /* Special callback command received */ rc = do_tuner_callback(fe, XC2028_TUNER_RESET, 0); - if (rc < 0) { - tuner_err("Error at RESET code %d\n", - (*p) & 0x7f); - return -EINVAL; - } + if (rc < 0) + goto report_failure; + continue; } if (size >= 0xff00) { switch (size) { case 0xff00: rc = do_tuner_callback(fe, XC2028_RESET_CLK, 0); - if (rc < 0) { - tuner_err("Error at RESET code %d\n", - (*p) & 0x7f); - return -EINVAL; - } + if (rc < 0) + goto report_failure; + break; default: tuner_info("Invalid RESET code %d\n", size & 0x7f); - return -EINVAL; - + goto e_inval; } continue; } @@ -618,7 +613,7 @@ static int load_firmware(struct dvb_frontend *fe, unsigned int type, if ((size + p > endp)) { tuner_err("missing bytes: need %d, have %d\n", size, (int)(endp - p)); - return -EINVAL; + goto e_inval; } buf[0] = *p; @@ -635,7 +630,7 @@ static int load_firmware(struct dvb_frontend *fe, unsigned int type, rc = i2c_send(priv, buf, len + 1); if (rc < 0) { tuner_err("%d returned from send\n", rc); - return -EINVAL; + goto e_inval; } p += len; @@ -650,6 +645,11 @@ static int load_firmware(struct dvb_frontend *fe, unsigned int type, } } return 0; + +report_failure: + tuner_err("Error at RESET code %d\n", (*p) & 0x7f); +e_inval: + return -EINVAL; } static int load_scode(struct dvb_frontend *fe, unsigned int type, diff --git a/drivers/media/usb/cpia2/cpia2_usb.c b/drivers/media/usb/cpia2/cpia2_usb.c index f3a1e5b1e57c..c6eaecbac831 100644 --- a/drivers/media/usb/cpia2/cpia2_usb.c +++ b/drivers/media/usb/cpia2/cpia2_usb.c @@ -848,15 +848,13 @@ static int cpia2_usb_probe(struct usb_interface *intf, ret = set_alternate(cam, USBIF_CMDONLY); if (ret < 0) { ERR("%s: usb_set_interface error (ret = %d)\n", __func__, ret); - kfree(cam); - return ret; + goto free_data; } if((ret = cpia2_init_camera(cam)) < 0) { ERR("%s: failed to initialize cpia2 camera (ret = %d)\n", __func__, ret); - kfree(cam); - return ret; + goto free_data; } LOG(" CPiA Version: %d.%02d (%d.%d)\n", cam->params.version.firmware_revision_hi, @@ -876,11 +874,14 @@ static int cpia2_usb_probe(struct usb_interface *intf, ret = cpia2_register_camera(cam); if (ret < 0) { ERR("%s: Failed to register cpia2 camera (ret = %d)\n", __func__, ret); - kfree(cam); - return ret; + goto free_data; } return 0; + +free_data: + kfree(cam); + return ret; } /****************************************************************************** diff --git a/drivers/media/usb/gspca/gspca.c b/drivers/media/usb/gspca/gspca.c index d29773b8f696..7ca44e109a69 100644 --- a/drivers/media/usb/gspca/gspca.c +++ b/drivers/media/usb/gspca/gspca.c @@ -907,10 +907,8 @@ static int gspca_init_transfer(struct gspca_dev *gspca_dev) ret = create_urbs(gspca_dev, alt_xfer(&intf->altsetting[alt], xfer, gspca_dev->xfer_ep)); - if (ret < 0) { - destroy_urbs(gspca_dev); - goto out; - } + if (ret < 0) + goto destroy_urbs; } /* clear the bulk endpoint */ @@ -920,10 +918,9 @@ static int gspca_init_transfer(struct gspca_dev *gspca_dev) /* start the cam */ ret = gspca_dev->sd_desc->start(gspca_dev); - if (ret < 0) { - destroy_urbs(gspca_dev); - goto out; - } + if (ret < 0) + goto destroy_urbs; + gspca_dev->streaming = 1; v4l2_ctrl_handler_setup(gspca_dev->vdev.ctrl_handler); @@ -974,6 +971,10 @@ static int gspca_init_transfer(struct gspca_dev *gspca_dev) out: gspca_input_create_urb(gspca_dev); return ret; + +destroy_urbs: + destroy_urbs(gspca_dev); + goto out; } static void gspca_set_default_mode(struct gspca_dev *gspca_dev) diff --git a/drivers/media/usb/gspca/sn9c20x.c b/drivers/media/usb/gspca/sn9c20x.c index cfa2a04d9f3f..06ec3a3253e1 100644 --- a/drivers/media/usb/gspca/sn9c20x.c +++ b/drivers/media/usb/gspca/sn9c20x.c @@ -1788,10 +1788,8 @@ static int sd_init(struct gspca_dev *gspca_dev) for (i = 0; i < ARRAY_SIZE(bridge_init); i++) { value = bridge_init[i][1]; reg_w(gspca_dev, bridge_init[i][0], &value, 1); - if (gspca_dev->usb_err < 0) { - pr_err("Device initialization failed\n"); - return gspca_dev->usb_err; - } + if (gspca_dev->usb_err < 0) + goto report_failure; } if (sd->flags & LED_REVERSE) @@ -1800,10 +1798,8 @@ static int sd_init(struct gspca_dev *gspca_dev) reg_w1(gspca_dev, 0x1006, 0x20); reg_w(gspca_dev, 0x10c0, i2c_init, 9); - if (gspca_dev->usb_err < 0) { - pr_err("Device initialization failed\n"); - return gspca_dev->usb_err; - } + if (gspca_dev->usb_err < 0) + goto report_failure; switch (sd->sensor) { case SENSOR_OV9650: @@ -1869,6 +1865,11 @@ static int sd_init(struct gspca_dev *gspca_dev) pr_err("Unsupported sensor\n"); gspca_dev->usb_err = -ENODEV; } + goto exit; + +report_failure: + pr_err("Device initialization failed\n"); +exit: return gspca_dev->usb_err; } diff --git a/drivers/media/usb/pvrusb2/pvrusb2-ioread.c b/drivers/media/usb/pvrusb2/pvrusb2-ioread.c index 602097bdcf14..0218614ce988 100644 --- a/drivers/media/usb/pvrusb2/pvrusb2-ioread.c +++ b/drivers/media/usb/pvrusb2/pvrusb2-ioread.c @@ -266,8 +266,7 @@ static int pvr2_ioread_get_buffer(struct pvr2_ioread *cp) pvr2_trace(PVR2_TRACE_DATA_FLOW, "/*---TRACE_READ---*/ pvr2_ioread_read id=%p queue_error=%d", cp,stat); - pvr2_ioread_stop(cp); - return 0; + goto stop_read; } cp->c_buf = NULL; cp->c_data_ptr = NULL; @@ -286,9 +285,8 @@ static int pvr2_ioread_get_buffer(struct pvr2_ioread *cp) pvr2_trace(PVR2_TRACE_DATA_FLOW, "/*---TRACE_READ---*/ pvr2_ioread_read id=%p buffer_error=%d", cp,stat); - pvr2_ioread_stop(cp); // Give up. - return 0; + goto stop_read; } // Start over... continue; @@ -298,6 +296,10 @@ static int pvr2_ioread_get_buffer(struct pvr2_ioread *cp) pvr2_buffer_get_id(cp->c_buf)]; } return !0; + +stop_read: + pvr2_ioread_stop(cp); + return 0; } static void pvr2_ioread_filter(struct pvr2_ioread *cp) diff --git a/drivers/media/usb/tm6000/tm6000-cards.c b/drivers/media/usb/tm6000/tm6000-cards.c index 4d5f4cc4887e..e5c376a6495a 100644 --- a/drivers/media/usb/tm6000/tm6000-cards.c +++ b/drivers/media/usb/tm6000/tm6000-cards.c @@ -861,15 +861,14 @@ int tm6000_cards_setup(struct tm6000_core *dev) for (i = 0; i < 2; i++) { rc = tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, dev->gpio.tuner_reset, 0x00); - if (rc < 0) { - printk(KERN_ERR "Error %i doing tuner reset\n", rc); - return rc; - } + if (rc < 0) + goto report_failure; msleep(10); /* Just to be conservative */ rc = tm6000_set_reg(dev, REQ_03_SET_GET_MCU_PIN, dev->gpio.tuner_reset, 0x01); if (rc < 0) { +report_failure: printk(KERN_ERR "Error %i doing tuner reset\n", rc); return rc; } diff --git a/drivers/media/usb/tm6000/tm6000-dvb.c b/drivers/media/usb/tm6000/tm6000-dvb.c index c811fc6cf48a..7cc5c5aa08c2 100644 --- a/drivers/media/usb/tm6000/tm6000-dvb.c +++ b/drivers/media/usb/tm6000/tm6000-dvb.c @@ -134,8 +134,8 @@ static int tm6000_start_stream(struct tm6000_core *dev) dvb->bulk_urb->transfer_buffer = kzalloc(size, GFP_KERNEL); if (!dvb->bulk_urb->transfer_buffer) { - usb_free_urb(dvb->bulk_urb); - return -ENOMEM; + ret = -ENOMEM; + goto free_urb; } usb_fill_bulk_urb(dvb->bulk_urb, dev->udev, pipe, @@ -160,11 +160,14 @@ static int tm6000_start_stream(struct tm6000_core *dev) ret); kfree(dvb->bulk_urb->transfer_buffer); - usb_free_urb(dvb->bulk_urb); - return ret; + goto free_urb; } return 0; + +free_urb: + usb_free_urb(dvb->bulk_urb); + return ret; } static void tm6000_stop_stream(struct tm6000_core *dev) diff --git a/drivers/media/usb/tm6000/tm6000-video.c b/drivers/media/usb/tm6000/tm6000-video.c index 8314d3fa9241..7c1d5e259ea3 100644 --- a/drivers/media/usb/tm6000/tm6000-video.c +++ b/drivers/media/usb/tm6000/tm6000-video.c @@ -589,10 +589,8 @@ static int tm6000_prepare_isoc(struct tm6000_core *dev) dev->isoc_ctl.transfer_buffer = kmalloc(sizeof(void *)*num_bufs, GFP_KERNEL); - if (!dev->isoc_ctl.transfer_buffer) { - kfree(dev->isoc_ctl.urb); - return -ENOMEM; - } + if (!dev->isoc_ctl.transfer_buffer) + goto free_urb; dprintk(dev, V4L2_DEBUG_QUEUE, "Allocating %d x %d packets (%d bytes) of %d bytes each to handle %u size\n", max_packets, num_bufs, sb_size, @@ -604,9 +602,8 @@ static int tm6000_prepare_isoc(struct tm6000_core *dev) /* call free, as some buffers might have been allocated */ tm6000_free_urb_buffers(dev); - kfree(dev->isoc_ctl.urb); kfree(dev->isoc_ctl.transfer_buffer); - return -ENOMEM; + goto free_urb; } /* allocate urbs and transfer buffers */ @@ -636,6 +633,10 @@ static int tm6000_prepare_isoc(struct tm6000_core *dev) } return 0; + +free_urb: + kfree(dev->isoc_ctl.urb); + return -ENOMEM; } static int tm6000_start_thread(struct tm6000_core *dev) diff --git a/drivers/media/usb/ttusb-budget/dvb-ttusb-budget.c b/drivers/media/usb/ttusb-budget/dvb-ttusb-budget.c index eed56895c2b9..b093a843644b 100644 --- a/drivers/media/usb/ttusb-budget/dvb-ttusb-budget.c +++ b/drivers/media/usb/ttusb-budget/dvb-ttusb-budget.c @@ -1665,8 +1665,7 @@ static int ttusb_probe(struct usb_interface *intf, const struct usb_device_id *i if (result < 0) { dprintk("%s: ttusb_alloc_iso_urbs - failed\n", __func__); mutex_unlock(&ttusb->semi2c); - kfree(ttusb); - return result; + goto err_free_usb; } if (ttusb_init_controller(ttusb)) @@ -1677,11 +1676,9 @@ static int ttusb_probe(struct usb_interface *intf, const struct usb_device_id *i result = dvb_register_adapter(&ttusb->adapter, "Technotrend/Hauppauge Nova-USB", THIS_MODULE, &udev->dev, adapter_nr); - if (result < 0) { - ttusb_free_iso_urbs(ttusb); - kfree(ttusb); - return result; - } + if (result < 0) + goto err_free_iso_urbs; + ttusb->adapter.priv = ttusb; /* i2c */ @@ -1752,7 +1749,9 @@ static int ttusb_probe(struct usb_interface *intf, const struct usb_device_id *i i2c_del_adapter(&ttusb->i2c_adap); err_unregister_adapter: dvb_unregister_adapter (&ttusb->adapter); +err_free_iso_urbs: ttusb_free_iso_urbs(ttusb); +err_free_usb: kfree(ttusb); return result; } diff --git a/drivers/media/usb/ttusb-dec/ttusb_dec.c b/drivers/media/usb/ttusb-dec/ttusb_dec.c index a8900f5571f7..99095b025859 100644 --- a/drivers/media/usb/ttusb-dec/ttusb_dec.c +++ b/drivers/media/usb/ttusb-dec/ttusb_dec.c @@ -1498,10 +1498,7 @@ static int ttusb_dec_init_dvb(struct ttusb_dec *dec) if ((result = dvb_dmx_init(&dec->demux)) < 0) { printk("%s: dvb_dmx_init failed: error %d\n", __func__, result); - - dvb_unregister_adapter(&dec->adapter); - - return result; + goto unregister_adapter; } dec->dmxdev.filternum = 32; @@ -1511,43 +1508,33 @@ static int ttusb_dec_init_dvb(struct ttusb_dec *dec) if ((result = dvb_dmxdev_init(&dec->dmxdev, &dec->adapter)) < 0) { printk("%s: dvb_dmxdev_init failed: error %d\n", __func__, result); - - dvb_dmx_release(&dec->demux); - dvb_unregister_adapter(&dec->adapter); - - return result; + goto release_demux; } dec->frontend.source = DMX_FRONTEND_0; - if ((result = dec->demux.dmx.add_frontend(&dec->demux.dmx, - &dec->frontend)) < 0) { - printk("%s: dvb_dmx_init failed: error %d\n", __func__, - result); - - dvb_dmxdev_release(&dec->dmxdev); - dvb_dmx_release(&dec->demux); - dvb_unregister_adapter(&dec->adapter); - - return result; - } + result = dec->demux.dmx.add_frontend(&dec->demux.dmx, &dec->frontend); + if (result < 0) + goto report_failure; if ((result = dec->demux.dmx.connect_frontend(&dec->demux.dmx, &dec->frontend)) < 0) { - printk("%s: dvb_dmx_init failed: error %d\n", __func__, - result); - dec->demux.dmx.remove_frontend(&dec->demux.dmx, &dec->frontend); - dvb_dmxdev_release(&dec->dmxdev); - dvb_dmx_release(&dec->demux); - dvb_unregister_adapter(&dec->adapter); - - return result; + goto report_failure; } dvb_net_init(&dec->adapter, &dec->dvb_net, &dec->demux.dmx); return 0; + +report_failure: + printk("%s: dvb_dmx_init failed: error %d\n", __func__, result); + dvb_dmxdev_release(&dec->dmxdev); +release_demux: + dvb_dmx_release(&dec->demux); +unregister_adapter: + dvb_unregister_adapter(&dec->adapter); + return result; } static void ttusb_dec_exit_dvb(struct ttusb_dec *dec) diff --git a/drivers/media/usb/uvc/uvc_v4l2.c b/drivers/media/usb/uvc/uvc_v4l2.c index a13ad4e178be..f64c851adea2 100644 --- a/drivers/media/usb/uvc/uvc_v4l2.c +++ b/drivers/media/usb/uvc/uvc_v4l2.c @@ -994,10 +994,8 @@ static int uvc_ioctl_g_ext_ctrls(struct file *file, void *fh, struct v4l2_queryctrl qc = { .id = ctrl->id }; ret = uvc_query_v4l2_ctrl(chain, &qc); - if (ret < 0) { - ctrls->error_idx = i; - return ret; - } + if (ret < 0) + goto set_index; ctrl->value = qc.default_value; } @@ -1013,14 +1011,17 @@ static int uvc_ioctl_g_ext_ctrls(struct file *file, void *fh, ret = uvc_ctrl_get(chain, ctrl); if (ret < 0) { uvc_ctrl_rollback(handle); - ctrls->error_idx = i; - return ret; + goto set_index; } } ctrls->error_idx = 0; return uvc_ctrl_rollback(handle); + +set_index: + ctrls->error_idx = i; + return ret; } static int uvc_ioctl_s_try_ext_ctrls(struct uvc_fh *handle,