[SCSI] mpt2sas: fix double mutex lock in NON_BLOCKING state
If state is NON_BLOCKING and mutex_trylock is succeed, the control flow goes to mutex_lock_interruptible() that is a deadlock. [jejb: fixed coding style problems] Signed-off-by: Alexey Khoroshilov <khoroshilov@ispras.ru> Acked-by: "Sreekanth Reddy" <sreekanth.reddy@lsi.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
This commit is contained in:
parent
f2b0599de5
commit
b656688a90
1 changed files with 5 additions and 3 deletions
|
@ -2181,10 +2181,12 @@ _ctl_ioctl_main(struct file *file, unsigned int cmd, void __user *arg,
|
||||||
return -EAGAIN;
|
return -EAGAIN;
|
||||||
|
|
||||||
state = (file->f_flags & O_NONBLOCK) ? NON_BLOCKING : BLOCKING;
|
state = (file->f_flags & O_NONBLOCK) ? NON_BLOCKING : BLOCKING;
|
||||||
if (state == NON_BLOCKING && !mutex_trylock(&ioc->ctl_cmds.mutex))
|
if (state == NON_BLOCKING) {
|
||||||
|
if (!mutex_trylock(&ioc->ctl_cmds.mutex))
|
||||||
return -EAGAIN;
|
return -EAGAIN;
|
||||||
else if (mutex_lock_interruptible(&ioc->ctl_cmds.mutex))
|
} else if (mutex_lock_interruptible(&ioc->ctl_cmds.mutex)) {
|
||||||
return -ERESTARTSYS;
|
return -ERESTARTSYS;
|
||||||
|
}
|
||||||
|
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
case MPT2IOCINFO:
|
case MPT2IOCINFO:
|
||||||
|
|
Reference in a new issue