Staging: heci: fix wrong order of device_lock and file_lock
When the two locks are nested, the code should always first acquire file_lock, and then acquire device_lock in order not to generate dead-lock race. Signed-off-by: Dongxiao Xu <dongxiao.xu@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
36e844671c
commit
171df63819
@@ -277,14 +277,16 @@ int heci_ioctl_connect_client(struct iamt_heci_device *dev, int if_num,
|
|||||||
}
|
}
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
spin_unlock_bh(&dev->device_lock);
|
||||||
|
|
||||||
spin_lock(&file_ext->file_lock);
|
spin_lock(&file_ext->file_lock);
|
||||||
|
spin_lock_bh(&dev->device_lock);
|
||||||
if (file_ext->state != HECI_FILE_CONNECTING) {
|
if (file_ext->state != HECI_FILE_CONNECTING) {
|
||||||
rets = -ENODEV;
|
rets = -ENODEV;
|
||||||
spin_unlock(&file_ext->file_lock);
|
|
||||||
spin_unlock_bh(&dev->device_lock);
|
spin_unlock_bh(&dev->device_lock);
|
||||||
|
spin_unlock(&file_ext->file_lock);
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
spin_unlock(&file_ext->file_lock);
|
|
||||||
/* prepare the output buffer */
|
/* prepare the output buffer */
|
||||||
client = (struct heci_client *) res_msg.data;
|
client = (struct heci_client *) res_msg.data;
|
||||||
client->max_msg_length = dev->me_clients[i].props.max_msg_length;
|
client->max_msg_length = dev->me_clients[i].props.max_msg_length;
|
||||||
@@ -312,6 +314,7 @@ int heci_ioctl_connect_client(struct iamt_heci_device *dev, int if_num,
|
|||||||
&dev->ctrl_wr_list.heci_cb.cb_list);
|
&dev->ctrl_wr_list.heci_cb.cb_list);
|
||||||
}
|
}
|
||||||
spin_unlock_bh(&dev->device_lock);
|
spin_unlock_bh(&dev->device_lock);
|
||||||
|
spin_unlock(&file_ext->file_lock);
|
||||||
err = wait_event_timeout(dev->wait_recvd_msg,
|
err = wait_event_timeout(dev->wait_recvd_msg,
|
||||||
(HECI_FILE_CONNECTED == file_ext->state
|
(HECI_FILE_CONNECTED == file_ext->state
|
||||||
|| HECI_FILE_DISCONNECTED == file_ext->state),
|
|| HECI_FILE_DISCONNECTED == file_ext->state),
|
||||||
|
|||||||
Reference in New Issue
Block a user