You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
[SCSI] improved eh timeout handler
When a command runs into a timeout we need to send an 'ABORT TASK' TMF. This is typically done by the 'eh_abort_handler' LLDD callback. Conceptually, however, this function is a normal SCSI command, so there is no need to enter the error handler. This patch implements a new scsi_abort_command() function which invokes an asynchronous function scsi_eh_abort_handler() to abort the commands via the usual 'eh_abort_handler'. If abort succeeds the command is either retried or terminated, depending on the number of allowed retries. However, 'eh_eflags' records the abort, so if the retry would fail again the command is pushed onto the error handler without trying to abort it (again); it'll be cleared up from SCSI EH. [hare: smatch detected stray switch fixed] Signed-off-by: Hannes Reinecke <hare@suse.de> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
This commit is contained in:
committed by
James Bottomley
parent
2451079bc2
commit
e494f6a728
@@ -19,6 +19,7 @@ struct scsi_nl_hdr;
|
||||
* Scsi Error Handler Flags
|
||||
*/
|
||||
#define SCSI_EH_CANCEL_CMD 0x0001 /* Cancel this cmd */
|
||||
#define SCSI_EH_ABORT_SCHEDULED 0x0002 /* Abort has been scheduled */
|
||||
|
||||
#define SCSI_SENSE_VALID(scmd) \
|
||||
(((scmd)->sense_buffer[0] & 0x70) == 0x70)
|
||||
@@ -66,6 +67,7 @@ extern int __init scsi_init_devinfo(void);
|
||||
extern void scsi_exit_devinfo(void);
|
||||
|
||||
/* scsi_error.c */
|
||||
extern void scmd_eh_abort_handler(struct work_struct *work);
|
||||
extern enum blk_eh_timer_return scsi_times_out(struct request *req);
|
||||
extern int scsi_error_handler(void *host);
|
||||
extern int scsi_decide_disposition(struct scsi_cmnd *cmd);
|
||||
|
||||
Reference in New Issue
Block a user