@@ -485,43 +485,17 @@ static int set_mode_select(struct scsi_device *sdev, struct rdac_dh_data *h)
485485static int mode_select_handle_sense (struct scsi_device * sdev ,
486486 struct scsi_sense_hdr * sense_hdr )
487487{
488- int err = SCSI_DH_IO ;
489488 struct rdac_dh_data * h = sdev -> handler_data ;
490489
491490 if (!scsi_sense_valid (sense_hdr ))
492- goto done ;
493-
494- switch (sense_hdr -> sense_key ) {
495- case NO_SENSE :
496- case ABORTED_COMMAND :
497- case UNIT_ATTENTION :
498- err = SCSI_DH_RETRY ;
499- break ;
500- case NOT_READY :
501- if (sense_hdr -> asc == 0x04 && sense_hdr -> ascq == 0x01 )
502- /* LUN Not Ready and is in the Process of Becoming
503- * Ready
504- */
505- err = SCSI_DH_RETRY ;
506- break ;
507- case ILLEGAL_REQUEST :
508- if (sense_hdr -> asc == 0x91 && sense_hdr -> ascq == 0x36 )
509- /*
510- * Command Lock contention
511- */
512- err = SCSI_DH_IMM_RETRY ;
513- break ;
514- default :
515- break ;
516- }
491+ return SCSI_DH_IO ;
517492
518493 RDAC_LOG (RDAC_LOG_FAILOVER , sdev , "array %s, ctlr %d, "
519494 "MODE_SELECT returned with sense %02x/%02x/%02x" ,
520495 (char * ) h -> ctlr -> array_name , h -> ctlr -> index ,
521496 sense_hdr -> sense_key , sense_hdr -> asc , sense_hdr -> ascq );
522497
523- done :
524- return err ;
498+ return SCSI_DH_IO ;
525499}
526500
527501static void send_mode_select (struct work_struct * work )
@@ -530,16 +504,57 @@ static void send_mode_select(struct work_struct *work)
530504 container_of (work , struct rdac_controller , ms_work );
531505 struct scsi_device * sdev = ctlr -> ms_sdev ;
532506 struct rdac_dh_data * h = sdev -> handler_data ;
533- int rc , err , retry_cnt = RDAC_RETRY_COUNT ;
507+ int rc , err ;
534508 struct rdac_queue_data * tmp , * qdata ;
535509 LIST_HEAD (list );
536510 unsigned char cdb [MAX_COMMAND_SIZE ];
537511 struct scsi_sense_hdr sshdr ;
538512 unsigned int data_size ;
539513 blk_opf_t opf = REQ_OP_DRV_OUT | REQ_FAILFAST_DEV |
540514 REQ_FAILFAST_TRANSPORT | REQ_FAILFAST_DRIVER ;
515+ struct scsi_failure failure_defs [] = {
516+ {
517+ .sense = NO_SENSE ,
518+ .asc = SCMD_FAILURE_ASC_ANY ,
519+ .ascq = SCMD_FAILURE_ASCQ_ANY ,
520+ .result = SAM_STAT_CHECK_CONDITION ,
521+ },
522+ {
523+ .sense = ABORTED_COMMAND ,
524+ .asc = SCMD_FAILURE_ASC_ANY ,
525+ .ascq = SCMD_FAILURE_ASCQ_ANY ,
526+ .result = SAM_STAT_CHECK_CONDITION ,
527+ },
528+ {
529+ .sense = UNIT_ATTENTION ,
530+ .asc = SCMD_FAILURE_ASC_ANY ,
531+ .ascq = SCMD_FAILURE_ASCQ_ANY ,
532+ .result = SAM_STAT_CHECK_CONDITION ,
533+ },
534+ /* LUN Not Ready and is in the Process of Becoming Ready */
535+ {
536+ .sense = NOT_READY ,
537+ .asc = 0x04 ,
538+ .ascq = 0x01 ,
539+ .result = SAM_STAT_CHECK_CONDITION ,
540+ },
541+ /* Command Lock contention */
542+ {
543+ .sense = ILLEGAL_REQUEST ,
544+ .asc = 0x91 ,
545+ .ascq = 0x36 ,
546+ .allowed = SCMD_FAILURE_NO_LIMIT ,
547+ .result = SAM_STAT_CHECK_CONDITION ,
548+ },
549+ {}
550+ };
551+ struct scsi_failures failures = {
552+ .total_allowed = RDAC_RETRY_COUNT ,
553+ .failure_definitions = failure_defs ,
554+ };
541555 const struct scsi_exec_args exec_args = {
542556 .sshdr = & sshdr ,
557+ .failures = & failures ,
543558 };
544559
545560 spin_lock (& ctlr -> ms_lock );
@@ -548,15 +563,12 @@ static void send_mode_select(struct work_struct *work)
548563 ctlr -> ms_sdev = NULL ;
549564 spin_unlock (& ctlr -> ms_lock );
550565
551- retry :
552566 memset (cdb , 0 , sizeof (cdb ));
553567
554568 data_size = rdac_failover_get (ctlr , & list , cdb );
555569
556- RDAC_LOG (RDAC_LOG_FAILOVER , sdev , "array %s, ctlr %d, "
557- "%s MODE_SELECT command" ,
558- (char * ) h -> ctlr -> array_name , h -> ctlr -> index ,
559- (retry_cnt == RDAC_RETRY_COUNT ) ? "queueing" : "retrying" );
570+ RDAC_LOG (RDAC_LOG_FAILOVER , sdev , "array %s, ctlr %d, queueing MODE_SELECT command" ,
571+ (char * )h -> ctlr -> array_name , h -> ctlr -> index );
560572
561573 rc = scsi_execute_cmd (sdev , cdb , opf , & h -> ctlr -> mode_select , data_size ,
562574 RDAC_TIMEOUT * HZ , RDAC_RETRIES , & exec_args );
@@ -570,10 +582,6 @@ static void send_mode_select(struct work_struct *work)
570582 err = SCSI_DH_IO ;
571583 } else {
572584 err = mode_select_handle_sense (sdev , & sshdr );
573- if (err == SCSI_DH_RETRY && retry_cnt -- )
574- goto retry ;
575- if (err == SCSI_DH_IMM_RETRY )
576- goto retry ;
577585 }
578586
579587 list_for_each_entry_safe (qdata , tmp , & list , entry ) {
0 commit comments