scst: Fix a race condition between LUN translation and LUN removal

git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@8496 d57e44dd-8a1f-0410-8b47-8ef2f437770f
This commit is contained in:
Bart Van Assche
2019-08-05 01:43:41 +00:00
parent bb7a0fca23
commit 5da933cc47

View File

@@ -4996,6 +4996,9 @@ static int scst_translate_lun(struct scst_cmd *cmd)
rcu_read_lock();
tgt_dev = scst_lookup_tgt_dev(cmd->sess, cmd->lun);
if (tgt_dev &&
!atomic_inc_not_zero(&tgt_dev->tgt_dev_cmd_count))
tgt_dev = NULL;
rcu_read_unlock();
if (tgt_dev) {
@@ -5014,6 +5017,7 @@ static int scst_translate_lun(struct scst_cmd *cmd)
"the device will not be visible remotely",
(unsigned long long)cmd->lun);
nul_dev = true;
scst_tgt_dev_dec_cmd_count(tgt_dev);
}
}
if (unlikely(res != 0)) {
@@ -5142,7 +5146,7 @@ static int __scst_init_cmd(struct scst_cmd *cmd)
scst_set_cmd_state(cmd, SCST_CMD_STATE_PARSE);
cnt = atomic_inc_return(&tgt_dev->tgt_dev_cmd_count) - 1;
cnt = atomic_read(&tgt_dev->tgt_dev_cmd_count) - 1;
if (unlikely(cnt > dev->max_tgt_dev_commands)) {
TRACE(TRACE_FLOW_CONTROL,
"Too many pending commands (%d) in "