mirror of
https://github.com/torvalds/linux.git
synced 2026-08-01 12:11:59 +02:00
[SCSI] bnx2fc: Fixed a SCSI CMD cmpl race condition between ABTS and CLEANUP
In the case when a SCSI_CMD times out, bnx2fc will initiate the sending of the
ABTS. However, if the SCSI layer's SCSI command timer also times out, it'll
instantiate a task abort of the same xid.
The race condition this patch tries to fix is as follows:
SCSI_CMD timeout (20s)
thread 1 thread 2
send ABTS
rx ABTS cmpl
task abort_eh
explicit LOGO since ABTS was engaged
CLEANUP cmpl
SCSI_CMD cmpl (ABTS cmpl)
instantiate RRQ
wait 10s
attempt to send RRQ (because of LOGO, it wouldn't continue)
Note that there is no call to scsi_done for this SCSI_CMD cmpletion
in this path.
The patch changes the path of execution to call scsi_done immediately
instead of instantiating the RRQ.
Signed-off-by: Eddie Wai <eddie.wai@broadcom.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
This commit is contained in:
parent
97c2730cb8
commit
2183789609
|
|
@ -1246,6 +1246,12 @@ int bnx2fc_eh_abort(struct scsi_cmnd *sc_cmd)
|
|||
kref_put(&io_req->refcount,
|
||||
bnx2fc_cmd_release); /* drop timer hold */
|
||||
rc = bnx2fc_expl_logo(lport, io_req);
|
||||
/* This only occurs when an task abort was requested while ABTS
|
||||
is in progress. Setting the IO_CLEANUP flag will skip the
|
||||
RRQ process in the case when the fw generated SCSI_CMD cmpl
|
||||
was a result from the ABTS request rather than the CLEANUP
|
||||
request */
|
||||
set_bit(BNX2FC_FLAG_IO_CLEANUP, &io_req->req_flags);
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user