diff options
author | Paul Bolle <pebolle@tiscali.nl> | 2014-02-20 03:07:52 -0500 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2014-03-13 15:02:05 -0400 |
commit | 1e3ab99da66312f503b3b28c98173168008a8605 (patch) | |
tree | 5abb26cae6db63c91af8936ed229e2f8cfb8f78c /drivers/target | |
parent | 5aad2145ac42a12ae8bf8383d2e0319c172d99a7 (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.c | 95 |
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 | ||
458 | static inline int core_alua_state_nonoptimized( | 458 | static 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 | |||
474 | static 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 | ||
474 | static inline int core_alua_state_lba_dependent( | 488 | static 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 | ||
549 | static inline int core_alua_state_standby( | 562 | static 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 | ||
598 | static inline int core_alua_state_unavailable( | 610 | static 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 | ||
639 | static inline int core_alua_state_transition( | 650 | static 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 | ||
760 | out: | ||
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 | ||