if (!down_read_trylock(&hba->clk_scaling_lock))
return SCSI_MLQUEUE_HOST_BUSY;
+ /*
+ * Allows the UFS error handler to wait for prior ufshcd_queuecommand()
+ * calls.
+ */
+ rcu_read_lock();
+
switch (hba->ufshcd_state) {
case UFSHCD_STATE_OPERATIONAL:
break;
}
ufshcd_send_command(hba, tag);
+
out:
+ rcu_read_unlock();
+
up_read(&hba->clk_scaling_lock);
if (ufs_trigger_eh()) {
}
ufshcd_scsi_block_requests(hba);
/* Drain ufshcd_queuecommand() */
- down_write(&hba->clk_scaling_lock);
- up_write(&hba->clk_scaling_lock);
+ synchronize_rcu();
cancel_work_sync(&hba->eeh_work);
}