scsi: target: core: Flush submission work during TMR processing
authorMike Christie <michael.christie@oracle.com>
Sat, 27 Feb 2021 17:00:05 +0000 (11:00 -0600)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 4 Mar 2021 22:37:02 +0000 (17:37 -0500)
If a cmd is on the submission workqueue then the TMR code will miss it, and
end up returning task not found or success for LUN resets. The fabric
driver might then tell the initiator that the running cmds have been
handled when they are about to run.

This adds a flush when we are processing TMRs to make sure queued cmds do
not run after returning the TMR response.

Link: https://lore.kernel.org/r/20210227170006.5077-25-michael.christie@oracle.com
Tested-by: Laurence Oberman <loberman@redhat.com>
Reviewed-by: Bodo Stroesser <bostroesser@gmail.com>
Signed-off-by: Mike Christie <michael.christie@oracle.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/target/target_core_tmr.c

index 7347285471faf6284b114199d43dee4e87f7fb68..e7fcbc09f9dbc3eb2173e2886126f5c840a6d112 100644 (file)
@@ -124,6 +124,8 @@ void core_tmr_abort_task(
        int i;
 
        for (i = 0; i < dev->queue_cnt; i++) {
+               flush_work(&dev->queues[i].sq.work);
+
                spin_lock_irqsave(&dev->queues[i].lock, flags);
                list_for_each_entry_safe(se_cmd, next, &dev->queues[i].state_list,
                                         state_list) {
@@ -302,6 +304,8 @@ static void core_tmr_drain_state_list(
         * in the Control Mode Page.
         */
        for (i = 0; i < dev->queue_cnt; i++) {
+               flush_work(&dev->queues[i].sq.work);
+
                spin_lock_irqsave(&dev->queues[i].lock, flags);
                list_for_each_entry_safe(cmd, next, &dev->queues[i].state_list,
                                         state_list) {