aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/target
diff options
context:
space:
mode:
authorPaul Bolle <pebolle@tiscali.nl>2014-02-20 03:07:52 -0500
committerNicholas Bellinger <nab@linux-iscsi.org>2014-03-13 15:02:05 -0400
commit1e3ab99da66312f503b3b28c98173168008a8605 (patch)
tree5abb26cae6db63c91af8936ed229e2f8cfb8f78c /drivers/target
parent5aad2145ac42a12ae8bf8383d2e0319c172d99a7 (diff)
target: silence GCC warning in target_alua_state_check
Building target_core_alua.o triggers a GCC warning: drivers/target/target_core_alua.c: In function ‘target_alua_state_check’: drivers/target/target_core_alua.c:773:18: warning: ‘alua_ascq’ may be used uninitialized in this function [-Wmaybe-uninitialized] cmd->scsi_ascq = alua_ascq; ^ This is a false positive. A little trial and error shows it is apparently caused by core_alua_state_lba_dependent(). It must be hard for GCC to track the branches of a switch statement, inside a list_for_each_entry loop, inside a while loop. But if we add a small (inline) helper function we can reorganize the code a bit. That also allows to drop alua_ascq which, obviously, gets rid of this warning. Signed-off-by: Paul Bolle <pebolle@tiscali.nl> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers/target')
-rw-r--r--drivers/target/target_core_alua.c95
1 files changed, 44 insertions, 51 deletions
diff --git a/drivers/target/target_core_alua.c b/drivers/target/target_core_alua.c
index c3d9df6aaf5f..fcbe6125b73e 100644
--- a/drivers/target/target_core_alua.c
+++ b/drivers/target/target_core_alua.c
@@ -455,11 +455,26 @@ out:
455 return rc; 455 return rc;
456} 456}
457 457
458static inline int core_alua_state_nonoptimized( 458static inline void set_ascq(struct se_cmd *cmd, u8 alua_ascq)
459{
460 /*
461 * Set SCSI additional sense code (ASC) to 'LUN Not Accessible';
462 * The ALUA additional sense code qualifier (ASCQ) is determined
463 * by the ALUA primary or secondary access state..
464 */
465 pr_debug("[%s]: ALUA TG Port not available, "
466 "SenseKey: NOT_READY, ASC/ASCQ: "
467 "0x04/0x%02x\n",
468 cmd->se_tfo->get_fabric_name(), alua_ascq);
469
470 cmd->scsi_asc = 0x04;
471 cmd->scsi_ascq = alua_ascq;
472}
473
474static inline void core_alua_state_nonoptimized(
459 struct se_cmd *cmd, 475 struct se_cmd *cmd,
460 unsigned char *cdb, 476 unsigned char *cdb,
461 int nonop_delay_msecs, 477 int nonop_delay_msecs)
462 u8 *alua_ascq)
463{ 478{
464 /* 479 /*
465 * Set SCF_ALUA_NON_OPTIMIZED here, this value will be checked 480 * Set SCF_ALUA_NON_OPTIMIZED here, this value will be checked
@@ -468,13 +483,11 @@ static inline int core_alua_state_nonoptimized(
468 */ 483 */
469 cmd->se_cmd_flags |= SCF_ALUA_NON_OPTIMIZED; 484 cmd->se_cmd_flags |= SCF_ALUA_NON_OPTIMIZED;
470 cmd->alua_nonop_delay = nonop_delay_msecs; 485 cmd->alua_nonop_delay = nonop_delay_msecs;
471 return 0;
472} 486}
473 487
474static inline int core_alua_state_lba_dependent( 488static inline int core_alua_state_lba_dependent(
475 struct se_cmd *cmd, 489 struct se_cmd *cmd,
476 struct t10_alua_tg_pt_gp *tg_pt_gp, 490 struct t10_alua_tg_pt_gp *tg_pt_gp)
477 u8 *alua_ascq)
478{ 491{
479 struct se_device *dev = cmd->se_dev; 492 struct se_device *dev = cmd->se_dev;
480 u64 segment_size, segment_mult, sectors, lba; 493 u64 segment_size, segment_mult, sectors, lba;
@@ -520,7 +533,7 @@ static inline int core_alua_state_lba_dependent(
520 } 533 }
521 if (!cur_map) { 534 if (!cur_map) {
522 spin_unlock(&dev->t10_alua.lba_map_lock); 535 spin_unlock(&dev->t10_alua.lba_map_lock);
523 *alua_ascq = ASCQ_04H_ALUA_TG_PT_UNAVAILABLE; 536 set_ascq(cmd, ASCQ_04H_ALUA_TG_PT_UNAVAILABLE);
524 return 1; 537 return 1;
525 } 538 }
526 list_for_each_entry(map_mem, &cur_map->lba_map_mem_list, 539 list_for_each_entry(map_mem, &cur_map->lba_map_mem_list,
@@ -531,11 +544,11 @@ static inline int core_alua_state_lba_dependent(
531 switch(map_mem->lba_map_mem_alua_state) { 544 switch(map_mem->lba_map_mem_alua_state) {
532 case ALUA_ACCESS_STATE_STANDBY: 545 case ALUA_ACCESS_STATE_STANDBY:
533 spin_unlock(&dev->t10_alua.lba_map_lock); 546 spin_unlock(&dev->t10_alua.lba_map_lock);
534 *alua_ascq = ASCQ_04H_ALUA_TG_PT_STANDBY; 547 set_ascq(cmd, ASCQ_04H_ALUA_TG_PT_STANDBY);
535 return 1; 548 return 1;
536 case ALUA_ACCESS_STATE_UNAVAILABLE: 549 case ALUA_ACCESS_STATE_UNAVAILABLE:
537 spin_unlock(&dev->t10_alua.lba_map_lock); 550 spin_unlock(&dev->t10_alua.lba_map_lock);
538 *alua_ascq = ASCQ_04H_ALUA_TG_PT_UNAVAILABLE; 551 set_ascq(cmd, ASCQ_04H_ALUA_TG_PT_UNAVAILABLE);
539 return 1; 552 return 1;
540 default: 553 default:
541 break; 554 break;
@@ -548,8 +561,7 @@ static inline int core_alua_state_lba_dependent(
548 561
549static inline int core_alua_state_standby( 562static inline int core_alua_state_standby(
550 struct se_cmd *cmd, 563 struct se_cmd *cmd,
551 unsigned char *cdb, 564 unsigned char *cdb)
552 u8 *alua_ascq)
553{ 565{
554 /* 566 /*
555 * Allowed CDBs for ALUA_ACCESS_STATE_STANDBY as defined by 567 * Allowed CDBs for ALUA_ACCESS_STATE_STANDBY as defined by
@@ -570,7 +582,7 @@ static inline int core_alua_state_standby(
570 case MI_REPORT_TARGET_PGS: 582 case MI_REPORT_TARGET_PGS:
571 return 0; 583 return 0;
572 default: 584 default:
573 *alua_ascq = ASCQ_04H_ALUA_TG_PT_STANDBY; 585 set_ascq(cmd, ASCQ_04H_ALUA_TG_PT_STANDBY);
574 return 1; 586 return 1;
575 } 587 }
576 case MAINTENANCE_OUT: 588 case MAINTENANCE_OUT:
@@ -578,7 +590,7 @@ static inline int core_alua_state_standby(
578 case MO_SET_TARGET_PGS: 590 case MO_SET_TARGET_PGS:
579 return 0; 591 return 0;
580 default: 592 default:
581 *alua_ascq = ASCQ_04H_ALUA_TG_PT_STANDBY; 593 set_ascq(cmd, ASCQ_04H_ALUA_TG_PT_STANDBY);
582 return 1; 594 return 1;
583 } 595 }
584 case REQUEST_SENSE: 596 case REQUEST_SENSE:
@@ -588,7 +600,7 @@ static inline int core_alua_state_standby(
588 case WRITE_BUFFER: 600 case WRITE_BUFFER:
589 return 0; 601 return 0;
590 default: 602 default:
591 *alua_ascq = ASCQ_04H_ALUA_TG_PT_STANDBY; 603 set_ascq(cmd, ASCQ_04H_ALUA_TG_PT_STANDBY);
592 return 1; 604 return 1;
593 } 605 }
594 606
@@ -597,8 +609,7 @@ static inline int core_alua_state_standby(
597 609
598static inline int core_alua_state_unavailable( 610static inline int core_alua_state_unavailable(
599 struct se_cmd *cmd, 611 struct se_cmd *cmd,
600 unsigned char *cdb, 612 unsigned char *cdb)
601 u8 *alua_ascq)
602{ 613{
603 /* 614 /*
604 * Allowed CDBs for ALUA_ACCESS_STATE_UNAVAILABLE as defined by 615 * Allowed CDBs for ALUA_ACCESS_STATE_UNAVAILABLE as defined by
@@ -613,7 +624,7 @@ static inline int core_alua_state_unavailable(
613 case MI_REPORT_TARGET_PGS: 624 case MI_REPORT_TARGET_PGS:
614 return 0; 625 return 0;
615 default: 626 default:
616 *alua_ascq = ASCQ_04H_ALUA_TG_PT_UNAVAILABLE; 627 set_ascq(cmd, ASCQ_04H_ALUA_TG_PT_UNAVAILABLE);
617 return 1; 628 return 1;
618 } 629 }
619 case MAINTENANCE_OUT: 630 case MAINTENANCE_OUT:
@@ -621,7 +632,7 @@ static inline int core_alua_state_unavailable(
621 case MO_SET_TARGET_PGS: 632 case MO_SET_TARGET_PGS:
622 return 0; 633 return 0;
623 default: 634 default:
624 *alua_ascq = ASCQ_04H_ALUA_TG_PT_UNAVAILABLE; 635 set_ascq(cmd, ASCQ_04H_ALUA_TG_PT_UNAVAILABLE);
625 return 1; 636 return 1;
626 } 637 }
627 case REQUEST_SENSE: 638 case REQUEST_SENSE:
@@ -629,7 +640,7 @@ static inline int core_alua_state_unavailable(
629 case WRITE_BUFFER: 640 case WRITE_BUFFER:
630 return 0; 641 return 0;
631 default: 642 default:
632 *alua_ascq = ASCQ_04H_ALUA_TG_PT_UNAVAILABLE; 643 set_ascq(cmd, ASCQ_04H_ALUA_TG_PT_UNAVAILABLE);
633 return 1; 644 return 1;
634 } 645 }
635 646
@@ -638,8 +649,7 @@ static inline int core_alua_state_unavailable(
638 649
639static inline int core_alua_state_transition( 650static inline int core_alua_state_transition(
640 struct se_cmd *cmd, 651 struct se_cmd *cmd,
641 unsigned char *cdb, 652 unsigned char *cdb)
642 u8 *alua_ascq)
643{ 653{
644 /* 654 /*
645 * Allowed CDBs for ALUA_ACCESS_STATE_TRANSITION as defined by 655 * Allowed CDBs for ALUA_ACCESS_STATE_TRANSITION as defined by
@@ -654,7 +664,7 @@ static inline int core_alua_state_transition(
654 case MI_REPORT_TARGET_PGS: 664 case MI_REPORT_TARGET_PGS:
655 return 0; 665 return 0;
656 default: 666 default:
657 *alua_ascq = ASCQ_04H_ALUA_STATE_TRANSITION; 667 set_ascq(cmd, ASCQ_04H_ALUA_STATE_TRANSITION);
658 return 1; 668 return 1;
659 } 669 }
660 case REQUEST_SENSE: 670 case REQUEST_SENSE:
@@ -662,7 +672,7 @@ static inline int core_alua_state_transition(
662 case WRITE_BUFFER: 672 case WRITE_BUFFER:
663 return 0; 673 return 0;
664 default: 674 default:
665 *alua_ascq = ASCQ_04H_ALUA_STATE_TRANSITION; 675 set_ascq(cmd, ASCQ_04H_ALUA_STATE_TRANSITION);
666 return 1; 676 return 1;
667 } 677 }
668 678
@@ -684,8 +694,6 @@ target_alua_state_check(struct se_cmd *cmd)
684 struct t10_alua_tg_pt_gp *tg_pt_gp; 694 struct t10_alua_tg_pt_gp *tg_pt_gp;
685 struct t10_alua_tg_pt_gp_member *tg_pt_gp_mem; 695 struct t10_alua_tg_pt_gp_member *tg_pt_gp_mem;
686 int out_alua_state, nonop_delay_msecs; 696 int out_alua_state, nonop_delay_msecs;
687 u8 alua_ascq;
688 int ret;
689 697
690 if (dev->se_hba->hba_flags & HBA_FLAGS_INTERNAL_USE) 698 if (dev->se_hba->hba_flags & HBA_FLAGS_INTERNAL_USE)
691 return 0; 699 return 0;
@@ -701,9 +709,8 @@ target_alua_state_check(struct se_cmd *cmd)
701 if (atomic_read(&port->sep_tg_pt_secondary_offline)) { 709 if (atomic_read(&port->sep_tg_pt_secondary_offline)) {
702 pr_debug("ALUA: Got secondary offline status for local" 710 pr_debug("ALUA: Got secondary offline status for local"
703 " target port\n"); 711 " target port\n");
704 alua_ascq = ASCQ_04H_ALUA_OFFLINE; 712 set_ascq(cmd, ASCQ_04H_ALUA_OFFLINE);
705 ret = 1; 713 return TCM_CHECK_CONDITION_NOT_READY;
706 goto out;
707 } 714 }
708 /* 715 /*
709 * Second, obtain the struct t10_alua_tg_pt_gp_member pointer to the 716 * Second, obtain the struct t10_alua_tg_pt_gp_member pointer to the
@@ -731,20 +738,23 @@ target_alua_state_check(struct se_cmd *cmd)
731 738
732 switch (out_alua_state) { 739 switch (out_alua_state) {
733 case ALUA_ACCESS_STATE_ACTIVE_NON_OPTIMIZED: 740 case ALUA_ACCESS_STATE_ACTIVE_NON_OPTIMIZED:
734 ret = core_alua_state_nonoptimized(cmd, cdb, 741 core_alua_state_nonoptimized(cmd, cdb, nonop_delay_msecs);
735 nonop_delay_msecs, &alua_ascq);
736 break; 742 break;
737 case ALUA_ACCESS_STATE_STANDBY: 743 case ALUA_ACCESS_STATE_STANDBY:
738 ret = core_alua_state_standby(cmd, cdb, &alua_ascq); 744 if (core_alua_state_standby(cmd, cdb))
745 return TCM_CHECK_CONDITION_NOT_READY;
739 break; 746 break;
740 case ALUA_ACCESS_STATE_UNAVAILABLE: 747 case ALUA_ACCESS_STATE_UNAVAILABLE:
741 ret = core_alua_state_unavailable(cmd, cdb, &alua_ascq); 748 if (core_alua_state_unavailable(cmd, cdb))
749 return TCM_CHECK_CONDITION_NOT_READY;
742 break; 750 break;
743 case ALUA_ACCESS_STATE_TRANSITION: 751 case ALUA_ACCESS_STATE_TRANSITION:
744 ret = core_alua_state_transition(cmd, cdb, &alua_ascq); 752 if (core_alua_state_transition(cmd, cdb))
753 return TCM_CHECK_CONDITION_NOT_READY;
745 break; 754 break;
746 case ALUA_ACCESS_STATE_LBA_DEPENDENT: 755 case ALUA_ACCESS_STATE_LBA_DEPENDENT:
747 ret = core_alua_state_lba_dependent(cmd, tg_pt_gp, &alua_ascq); 756 if (core_alua_state_lba_dependent(cmd, tg_pt_gp))
757 return TCM_CHECK_CONDITION_NOT_READY;
748 break; 758 break;
749 /* 759 /*
750 * OFFLINE is a secondary ALUA target port group access state, that is 760 * OFFLINE is a secondary ALUA target port group access state, that is
@@ -757,23 +767,6 @@ target_alua_state_check(struct se_cmd *cmd)
757 return TCM_INVALID_CDB_FIELD; 767 return TCM_INVALID_CDB_FIELD;
758 } 768 }
759 769
760out:
761 if (ret > 0) {
762 /*
763 * Set SCSI additional sense code (ASC) to 'LUN Not Accessible';
764 * The ALUA additional sense code qualifier (ASCQ) is determined
765 * by the ALUA primary or secondary access state..
766 */
767 pr_debug("[%s]: ALUA TG Port not available, "
768 "SenseKey: NOT_READY, ASC/ASCQ: "
769 "0x04/0x%02x\n",
770 cmd->se_tfo->get_fabric_name(), alua_ascq);
771
772 cmd->scsi_asc = 0x04;
773 cmd->scsi_ascq = alua_ascq;
774 return TCM_CHECK_CONDITION_NOT_READY;
775 }
776
777 return 0; 770 return 0;
778} 771}
779 772