Re: [PATCH] [media] dib0700: Return -EINTR and unlock mutex if locking attempts fails.
Can anyone please review it ? regards Santosh On Fri, Mar 16, 2012 at 6:15 PM, santosh nayak santoshprasadna...@gmail.com wrote: From: Santosh Nayak santoshprasadna...@gmail.com 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 return 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. Signed-off-by: Santosh Nayak santoshprasadna...@gmail.com --- drivers/media/dvb/dvb-usb/dib0700_core.c | 20 +++- 1 files changed, 11 insertions(+), 9 deletions(-) diff --git a/drivers/media/dvb/dvb-usb/dib0700_core.c b/drivers/media/dvb/dvb-usb/dib0700_core.c index 070e82a..1a6ddbc 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; @@ -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; @@ -274,7 +275,8 @@ static int dib0700_i2c_xfer_legacy(struct i2c_adapter *adap, return -EAGAIN; 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; -- 1.7.4.4 -- To unsubscribe from this list: send the line unsubscribe linux-media in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
RE: [PATCH] [media] dib0700: Return -EINTR and unlock mutex if locking attempts fails.
Hello, I agree with the patch. But you could also add: diff --git a/drivers/media/dvb/dvb-usb/dib0700_core.c b/drivers/media/dvb/dvb-usb/dib0700_core.c index 1a6ddbc..a271203 100644 --- a/drivers/media/dvb/dvb-usb/dib0700_core.c +++ b/drivers/media/dvb/dvb-usb/dib0700_core.c @@ -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) { @@ -272,7 +272,7 @@ 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); mutex_unlock(d-i2c_mutex); regards, Olivier From: santosh prasad nayak [santoshprasadna...@gmail.com] Sent: Monday, March 19, 2012 9:47 AM To: mche...@infradead.org Cc: Olivier GRENIE; pboettc...@kernellabs.com; flor...@mickler.org; gre...@linuxfoundation.org; linux-media@vger.kernel.org Subject: Re: [PATCH] [media] dib0700: Return -EINTR and unlock mutex if locking attempts fails. Can anyone please review it ? regards Santosh On Fri, Mar 16, 2012 at 6:15 PM, santosh nayak santoshprasadna...@gmail.com wrote: From: Santosh Nayak santoshprasadna...@gmail.com 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 return 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. Signed-off-by: Santosh Nayak santoshprasadna...@gmail.com --- drivers/media/dvb/dvb-usb/dib0700_core.c | 20 +++- 1 files changed, 11 insertions(+), 9 deletions(-) diff --git a/drivers/media/dvb/dvb-usb/dib0700_core.c b/drivers/media/dvb/dvb-usb/dib0700_core.c index 070e82a..1a6ddbc 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; @@ -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; @@ -274,7 +275,8 @@ static int dib0700_i2c_xfer_legacy(struct i2c_adapter *adap, return -EAGAIN; 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
Re: [PATCH] [media] dib0700: Return -EINTR and unlock mutex if locking attempts fails.
Hi Olivier, Included your suggestion and sent a new patch. Please review it. regards Santosh On Mon, Mar 19, 2012 at 3:58 PM, Olivier GRENIE olivier.gre...@parrot.com wrote: Hello, I agree with the patch. But you could also add: diff --git a/drivers/media/dvb/dvb-usb/dib0700_core.c b/drivers/media/dvb/dvb-usb/dib0700_core.c index 1a6ddbc..a271203 100644 --- a/drivers/media/dvb/dvb-usb/dib0700_core.c +++ b/drivers/media/dvb/dvb-usb/dib0700_core.c @@ -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) { @@ -272,7 +272,7 @@ 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); mutex_unlock(d-i2c_mutex); regards, Olivier From: santosh prasad nayak [santoshprasadna...@gmail.com] Sent: Monday, March 19, 2012 9:47 AM To: mche...@infradead.org Cc: Olivier GRENIE; pboettc...@kernellabs.com; flor...@mickler.org; gre...@linuxfoundation.org; linux-media@vger.kernel.org Subject: Re: [PATCH] [media] dib0700: Return -EINTR and unlock mutex if locking attempts fails. Can anyone please review it ? regards Santosh On Fri, Mar 16, 2012 at 6:15 PM, santosh nayak santoshprasadna...@gmail.com wrote: From: Santosh Nayak santoshprasadna...@gmail.com 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 return 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. Signed-off-by: Santosh Nayak santoshprasadna...@gmail.com --- drivers/media/dvb/dvb-usb/dib0700_core.c | 20 +++- 1 files changed, 11 insertions(+), 9 deletions(-) diff --git a/drivers/media/dvb/dvb-usb/dib0700_core.c b/drivers/media/dvb/dvb-usb/dib0700_core.c index 070e82a..1a6ddbc 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; @@ -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; @@ -274,7 +275,8 @@ static int dib0700_i2c_xfer_legacy(struct i2c_adapter *adap, return -EAGAIN; 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