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);
 }