From patchwork Mon Mar 19 11:27:37 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: santosh nayak X-Patchwork-Id: 10399 Received: from mail.tu-berlin.de ([130.149.7.33]) by www.linuxtv.org with esmtp (Exim 4.72) (envelope-from ) id 1S9amF-00008C-4n for patchwork@linuxtv.org; Mon, 19 Mar 2012 12:29:27 +0100 X-tubIT-Incoming-IP: 209.132.180.67 Received: from vger.kernel.org ([209.132.180.67]) by mail.tu-berlin.de (exim-4.75/mailfrontend-2) with esmtp for id 1S9amE-0007Bv-HO; Mon, 19 Mar 2012 12:29:26 +0100 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753120Ab2CSL3H (ORCPT ); Mon, 19 Mar 2012 07:29:07 -0400 Received: from mail-pb0-f46.google.com ([209.85.160.46]:48518 "EHLO mail-pb0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751073Ab2CSL3F (ORCPT ); Mon, 19 Mar 2012 07:29:05 -0400 Received: by pbcun15 with SMTP id un15so1063139pbc.19 for ; Mon, 19 Mar 2012 04:29:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:x-mailer; bh=S3zCLSg3GqAfMqkl9EOFxoamxhEFV61fG1lXVi0AwjI=; b=DZiJLz56TqT07ggUTm0VSbM7iD/hGLwzGqhVl/Po7Y2KCsLujz9Y2ZTfoqHOVbDhdP cGiPG4yM2+6PwtiEqEYmiVMsW3TFQTyQQeZQywBWL5whirUQ7ff1E/MJ3Ig/Tvjko5OH HLMhi+aVmZ7o1V9dhEW9vz5/edOiBekYQCIfUc9lJ/YaMHaZLq0HnPi2QWJ9BPO7qsiS +E5LuBRuSe+RO71dXjpAhu+oX0CQEU2ekVORI5Oh9VaVxYmaaBi+GWnV6KI5tGVvMmd+ 5Eql5vlpv79I37PZUaLVjkrNPH7n+M5bredHBKonkAMwJvpFDwUhw1QNMGYrQmQo3mzW PgHA== Received: by 10.68.130.163 with SMTP id of3mr32022901pbb.85.1332156544465; Mon, 19 Mar 2012 04:29:04 -0700 (PDT) Received: from localhost.localdomain ([64.103.156.72]) by mx.google.com with ESMTPS id f5sm11167888pbe.26.2012.03.19.04.29.00 (version=TLSv1/SSLv3 cipher=OTHER); Mon, 19 Mar 2012 04:29:03 -0700 (PDT) From: santosh nayak To: mchehab@infradead.org Cc: olivier.grenie@parrot.com, olivier.grenie@dibcom.fr, pboettcher@kernellabs.com, florian@mickler.org, gregkh@linuxfoundation.org, linux-media@vger.kernel.org, Santosh Nayak Subject: [PATCH] [media] dib0700: Return -EINTR and unlock mutex if locking attempts fails. Date: Mon, 19 Mar 2012 16:57:37 +0530 Message-Id: <1332156457-18180-1-git-send-email-santoshprasadnayak@gmail.com> X-Mailer: git-send-email 1.7.4.4 Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org X-PMX-Version: 5.6.1.2065439, Antispam-Engine: 2.7.2.376379, Antispam-Data: 2012.3.19.111515 X-PMX-Spam: Gauge=IIIIIIIII, Probability=9%, Report=' FORGED_FROM_GMAIL 0.1, MULTIPLE_RCPTS 0.1, HTML_00_01 0.05, HTML_00_10 0.05, BODY_SIZE_4000_4999 0, BODY_SIZE_5000_LESS 0, BODY_SIZE_7000_LESS 0, __ANY_URI 0, __CP_URI_IN_BODY 0, __FRAUD_BODY_WEBMAIL 0, __FRAUD_WEBMAIL 0, __FRAUD_WEBMAIL_FROM 0, __FROM_GMAIL 0, __HAS_MSGID 0, __HAS_X_MAILER 0, __HAS_X_MAILING_LIST 0, __MIME_TEXT_ONLY 0, __MULTIPLE_RCPTS_CC_X2 0, __PHISH_SPEAR_STRUCTURE_1 0, __SANE_MSGID 0, __TO_MALFORMED_2 0, __TO_NO_NAME 0, __URI_NO_WWW 0, __URI_NS ' From: Santosh Nayak In 'dib0700_i2c_xfer_new()' and 'dib0700_i2c_xfer_legacy()' we are taking two locks: 1. i2c_mutex 2. usb_mutex If attempt to take 'usb_mutex' lock fails then the previously taken lock 'i2c_mutex' should be unlocked and -EINTR should be returned so that caller can take appropriate action. If locking attempt was interrupted by a signal then we should return -EINTR. At present we are returning '0' for such scenarios which is wrong. Replace -EAGAIN by -EINTR as a return type for the the scenario where locking attempt was interrupted by signal. Signed-off-by: Santosh Nayak --- drivers/media/dvb/dvb-usb/dib0700_core.c | 24 +++++++++++++----------- 1 files changed, 13 insertions(+), 11 deletions(-) diff --git a/drivers/media/dvb/dvb-usb/dib0700_core.c b/drivers/media/dvb/dvb-usb/dib0700_core.c index 070e82a..a271203 100644 --- a/drivers/media/dvb/dvb-usb/dib0700_core.c +++ b/drivers/media/dvb/dvb-usb/dib0700_core.c @@ -32,7 +32,7 @@ int dib0700_get_version(struct dvb_usb_device *d, u32 *hwversion, if (mutex_lock_interruptible(&d->usb_mutex) < 0) { err("could not acquire lock"); - return 0; + return -EINTR; } ret = usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev, 0), @@ -118,7 +118,7 @@ int dib0700_set_gpio(struct dvb_usb_device *d, enum dib07x0_gpios gpio, u8 gpio_ if (mutex_lock_interruptible(&d->usb_mutex) < 0) { err("could not acquire lock"); - return 0; + return -EINTR; } st->buf[0] = REQUEST_SET_GPIO; @@ -139,7 +139,7 @@ static int dib0700_set_usb_xfer_len(struct dvb_usb_device *d, u16 nb_ts_packets) if (st->fw_version >= 0x10201) { if (mutex_lock_interruptible(&d->usb_mutex) < 0) { err("could not acquire lock"); - return 0; + return -EINTR; } st->buf[0] = REQUEST_SET_USB_XFER_LEN; @@ -178,7 +178,7 @@ static int dib0700_i2c_xfer_new(struct i2c_adapter *adap, struct i2c_msg *msg, /* Ensure nobody else hits the i2c bus while we're sending our sequence of messages, (such as the remote control thread) */ if (mutex_lock_interruptible(&d->i2c_mutex) < 0) - return -EAGAIN; + return -EINTR; for (i = 0; i < num; i++) { if (i == 0) { @@ -228,7 +228,8 @@ static int dib0700_i2c_xfer_new(struct i2c_adapter *adap, struct i2c_msg *msg, /* Write request */ if (mutex_lock_interruptible(&d->usb_mutex) < 0) { err("could not acquire lock"); - return 0; + mutex_unlock(&d->i2c_mutex); + return -EINTR; } st->buf[0] = REQUEST_NEW_I2C_WRITE; st->buf[1] = msg[i].addr << 1; @@ -271,10 +272,11 @@ static int dib0700_i2c_xfer_legacy(struct i2c_adapter *adap, int i,len; if (mutex_lock_interruptible(&d->i2c_mutex) < 0) - return -EAGAIN; + return -EINTR; if (mutex_lock_interruptible(&d->usb_mutex) < 0) { err("could not acquire lock"); - return 0; + mutex_unlock(&d->i2c_mutex); + return -EINTR; } for (i = 0; i < num; i++) { @@ -369,7 +371,7 @@ static int dib0700_set_clock(struct dvb_usb_device *d, u8 en_pll, if (mutex_lock_interruptible(&d->usb_mutex) < 0) { err("could not acquire lock"); - return 0; + return -EINTR; } st->buf[0] = REQUEST_SET_CLOCK; @@ -401,7 +403,7 @@ int dib0700_set_i2c_speed(struct dvb_usb_device *d, u16 scl_kHz) if (mutex_lock_interruptible(&d->usb_mutex) < 0) { err("could not acquire lock"); - return 0; + return -EINTR; } st->buf[0] = REQUEST_SET_I2C_PARAM; @@ -561,7 +563,7 @@ int dib0700_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff) if (mutex_lock_interruptible(&adap->dev->usb_mutex) < 0) { err("could not acquire lock"); - return 0; + return -EINTR; } st->buf[0] = REQUEST_ENABLE_VIDEO; @@ -611,7 +613,7 @@ int dib0700_change_protocol(struct rc_dev *rc, u64 rc_type) if (mutex_lock_interruptible(&d->usb_mutex) < 0) { err("could not acquire lock"); - return 0; + return -EINTR; } st->buf[0] = REQUEST_SET_RC;