David Jeffery 733ab7e1b5 scsi: fnic: Finish scsi_cmnd before dropping the spinlock
When aborting a SCSI command through fnic, there is a race with the fnic
interrupt handler which can result in the SCSI command and its request
being completed twice. If the interrupt handler claims the command by
setting CMD_SP to NULL first, the abort handler assumes the interrupt
handler has completed the command and returns SUCCESS, causing the request
for the scsi_cmnd to be re-queued.

But the interrupt handler may not have finished the command yet. After it
drops the spinlock protecting CMD_SP, it does memory cleanup before finally
calling scsi_done() to complete the scsi_cmnd. If the call to scsi_done
occurs after the abort handler finishes and re-queues the request, the
completion of the scsi_cmnd will advance and try to double complete a
request already queued for retry.

This patch fixes the issue by moving scsi_done() and any other use of
scsi_cmnd to before the spinlock is released by the interrupt handler.

Link: https://lore.kernel.org/r/20220311184359.2345319-1-djeffery@redhat.com
Reviewed-by: Laurence Oberman <loberman@redhat.com>
Reviewed-by: Ming Lei <ming.lei@redhat.com>
Signed-off-by: David Jeffery <djeffery@redhat.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
2022-03-15 14:01:28 -04:00
..
2020-03-11 23:07:59 -04:00
2021-11-05 08:42:02 -07:00
2022-01-14 14:37:34 +01:00
2021-01-22 21:14:08 -05:00
2021-01-22 21:14:07 -05:00
2021-01-22 21:14:08 -05:00
2022-01-14 14:37:34 +01:00
2020-03-11 23:07:59 -04:00
2020-09-02 22:49:06 -04:00
2021-10-16 21:45:56 -04:00
2021-04-13 00:20:48 -04:00
2020-12-07 20:24:09 -05:00
2021-10-16 21:29:15 -04:00
2022-01-25 00:09:41 -05:00
2020-12-07 20:24:09 -05:00
2021-05-21 16:59:33 -04:00
2021-03-24 23:03:43 -04:00
2022-01-14 14:37:34 +01:00
2022-01-22 10:24:02 +02:00
2022-01-22 08:33:37 +02:00
2022-01-14 14:37:34 +01:00
2022-01-22 10:24:02 +02:00
2021-12-22 23:41:13 -05:00
2022-01-14 14:37:34 +01:00
2020-02-24 15:01:57 -05:00
2021-08-23 12:54:30 -06:00
2021-04-13 00:20:48 -04:00