diff options
Diffstat (limited to 'drivers/scsi')
| -rw-r--r-- | drivers/scsi/qla2xxx/tcm_qla2xxx.c | 153 |
1 files changed, 51 insertions, 102 deletions
diff --git a/drivers/scsi/qla2xxx/tcm_qla2xxx.c b/drivers/scsi/qla2xxx/tcm_qla2xxx.c index ac65cb7b4886..3ba2e9564b9a 100644 --- a/drivers/scsi/qla2xxx/tcm_qla2xxx.c +++ b/drivers/scsi/qla2xxx/tcm_qla2xxx.c | |||
| @@ -43,8 +43,6 @@ | |||
| 43 | #include <scsi/scsi_cmnd.h> | 43 | #include <scsi/scsi_cmnd.h> |
| 44 | #include <target/target_core_base.h> | 44 | #include <target/target_core_base.h> |
| 45 | #include <target/target_core_fabric.h> | 45 | #include <target/target_core_fabric.h> |
| 46 | #include <target/target_core_fabric_configfs.h> | ||
| 47 | #include <target/configfs_macros.h> | ||
| 48 | 46 | ||
| 49 | #include "qla_def.h" | 47 | #include "qla_def.h" |
| 50 | #include "qla_target.h" | 48 | #include "qla_target.h" |
| @@ -729,23 +727,23 @@ static int tcm_qla2xxx_init_nodeacl(struct se_node_acl *se_nacl, | |||
| 729 | 727 | ||
| 730 | #define DEF_QLA_TPG_ATTRIB(name) \ | 728 | #define DEF_QLA_TPG_ATTRIB(name) \ |
| 731 | \ | 729 | \ |
| 732 | static ssize_t tcm_qla2xxx_tpg_attrib_show_##name( \ | 730 | static ssize_t tcm_qla2xxx_tpg_attrib_##name##_show( \ |
| 733 | struct se_portal_group *se_tpg, \ | 731 | struct config_item *item, char *page) \ |
| 734 | char *page) \ | ||
| 735 | { \ | 732 | { \ |
| 733 | struct se_portal_group *se_tpg = attrib_to_tpg(item); \ | ||
| 736 | struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg, \ | 734 | struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg, \ |
| 737 | struct tcm_qla2xxx_tpg, se_tpg); \ | 735 | struct tcm_qla2xxx_tpg, se_tpg); \ |
| 738 | \ | 736 | \ |
| 739 | return sprintf(page, "%u\n", tpg->tpg_attrib.name); \ | 737 | return sprintf(page, "%u\n", tpg->tpg_attrib.name); \ |
| 740 | } \ | 738 | } \ |
| 741 | \ | 739 | \ |
| 742 | static ssize_t tcm_qla2xxx_tpg_attrib_store_##name( \ | 740 | static ssize_t tcm_qla2xxx_tpg_attrib_##name##_store( \ |
| 743 | struct se_portal_group *se_tpg, \ | 741 | struct config_item *item, const char *page, size_t count) \ |
| 744 | const char *page, \ | ||
| 745 | size_t count) \ | ||
| 746 | { \ | 742 | { \ |
| 743 | struct se_portal_group *se_tpg = attrib_to_tpg(item); \ | ||
| 747 | struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg, \ | 744 | struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg, \ |
| 748 | struct tcm_qla2xxx_tpg, se_tpg); \ | 745 | struct tcm_qla2xxx_tpg, se_tpg); \ |
| 746 | struct tcm_qla2xxx_tpg_attrib *a = &tpg->tpg_attrib; \ | ||
| 749 | unsigned long val; \ | 747 | unsigned long val; \ |
| 750 | int ret; \ | 748 | int ret; \ |
| 751 | \ | 749 | \ |
| @@ -755,81 +753,39 @@ static ssize_t tcm_qla2xxx_tpg_attrib_store_##name( \ | |||
| 755 | " ret: %d\n", ret); \ | 753 | " ret: %d\n", ret); \ |
| 756 | return -EINVAL; \ | 754 | return -EINVAL; \ |
| 757 | } \ | 755 | } \ |
| 758 | ret = tcm_qla2xxx_set_attrib_##name(tpg, val); \ | ||
| 759 | \ | ||
| 760 | return (!ret) ? count : -EINVAL; \ | ||
| 761 | } | ||
| 762 | |||
| 763 | #define DEF_QLA_TPG_ATTR_BOOL(_name) \ | ||
| 764 | \ | ||
| 765 | static int tcm_qla2xxx_set_attrib_##_name( \ | ||
| 766 | struct tcm_qla2xxx_tpg *tpg, \ | ||
| 767 | unsigned long val) \ | ||
| 768 | { \ | ||
| 769 | struct tcm_qla2xxx_tpg_attrib *a = &tpg->tpg_attrib; \ | ||
| 770 | \ | 756 | \ |
| 771 | if ((val != 0) && (val != 1)) { \ | 757 | if ((val != 0) && (val != 1)) { \ |
| 772 | pr_err("Illegal boolean value %lu\n", val); \ | 758 | pr_err("Illegal boolean value %lu\n", val); \ |
| 773 | return -EINVAL; \ | 759 | return -EINVAL; \ |
| 774 | } \ | 760 | } \ |
| 775 | \ | 761 | \ |
| 776 | a->_name = val; \ | 762 | a->name = val; \ |
| 777 | return 0; \ | 763 | \ |
| 778 | } | 764 | return count; \ |
| 779 | 765 | } \ | |
| 780 | #define QLA_TPG_ATTR(_name, _mode) \ | 766 | CONFIGFS_ATTR(tcm_qla2xxx_tpg_attrib_, name) |
| 781 | TF_TPG_ATTRIB_ATTR(tcm_qla2xxx, _name, _mode); | ||
| 782 | 767 | ||
| 783 | /* | ||
| 784 | * Define tcm_qla2xxx_tpg_attrib_s_generate_node_acls | ||
| 785 | */ | ||
| 786 | DEF_QLA_TPG_ATTR_BOOL(generate_node_acls); | ||
| 787 | DEF_QLA_TPG_ATTRIB(generate_node_acls); | 768 | DEF_QLA_TPG_ATTRIB(generate_node_acls); |
| 788 | QLA_TPG_ATTR(generate_node_acls, S_IRUGO | S_IWUSR); | ||
| 789 | |||
| 790 | /* | ||
| 791 | Define tcm_qla2xxx_attrib_s_cache_dynamic_acls | ||
| 792 | */ | ||
| 793 | DEF_QLA_TPG_ATTR_BOOL(cache_dynamic_acls); | ||
| 794 | DEF_QLA_TPG_ATTRIB(cache_dynamic_acls); | 769 | DEF_QLA_TPG_ATTRIB(cache_dynamic_acls); |
| 795 | QLA_TPG_ATTR(cache_dynamic_acls, S_IRUGO | S_IWUSR); | ||
| 796 | |||
| 797 | /* | ||
| 798 | * Define tcm_qla2xxx_tpg_attrib_s_demo_mode_write_protect | ||
| 799 | */ | ||
| 800 | DEF_QLA_TPG_ATTR_BOOL(demo_mode_write_protect); | ||
| 801 | DEF_QLA_TPG_ATTRIB(demo_mode_write_protect); | 770 | DEF_QLA_TPG_ATTRIB(demo_mode_write_protect); |
| 802 | QLA_TPG_ATTR(demo_mode_write_protect, S_IRUGO | S_IWUSR); | ||
| 803 | |||
| 804 | /* | ||
| 805 | * Define tcm_qla2xxx_tpg_attrib_s_prod_mode_write_protect | ||
| 806 | */ | ||
| 807 | DEF_QLA_TPG_ATTR_BOOL(prod_mode_write_protect); | ||
| 808 | DEF_QLA_TPG_ATTRIB(prod_mode_write_protect); | 771 | DEF_QLA_TPG_ATTRIB(prod_mode_write_protect); |
| 809 | QLA_TPG_ATTR(prod_mode_write_protect, S_IRUGO | S_IWUSR); | ||
| 810 | |||
| 811 | /* | ||
| 812 | * Define tcm_qla2xxx_tpg_attrib_s_demo_mode_login_only | ||
| 813 | */ | ||
| 814 | DEF_QLA_TPG_ATTR_BOOL(demo_mode_login_only); | ||
| 815 | DEF_QLA_TPG_ATTRIB(demo_mode_login_only); | 772 | DEF_QLA_TPG_ATTRIB(demo_mode_login_only); |
| 816 | QLA_TPG_ATTR(demo_mode_login_only, S_IRUGO | S_IWUSR); | ||
| 817 | 773 | ||
| 818 | static struct configfs_attribute *tcm_qla2xxx_tpg_attrib_attrs[] = { | 774 | static struct configfs_attribute *tcm_qla2xxx_tpg_attrib_attrs[] = { |
| 819 | &tcm_qla2xxx_tpg_attrib_generate_node_acls.attr, | 775 | &tcm_qla2xxx_tpg_attrib_attr_generate_node_acls, |
| 820 | &tcm_qla2xxx_tpg_attrib_cache_dynamic_acls.attr, | 776 | &tcm_qla2xxx_tpg_attrib_attr_cache_dynamic_acls, |
| 821 | &tcm_qla2xxx_tpg_attrib_demo_mode_write_protect.attr, | 777 | &tcm_qla2xxx_tpg_attrib_attr_demo_mode_write_protect, |
| 822 | &tcm_qla2xxx_tpg_attrib_prod_mode_write_protect.attr, | 778 | &tcm_qla2xxx_tpg_attrib_attr_prod_mode_write_protect, |
| 823 | &tcm_qla2xxx_tpg_attrib_demo_mode_login_only.attr, | 779 | &tcm_qla2xxx_tpg_attrib_attr_demo_mode_login_only, |
| 824 | NULL, | 780 | NULL, |
| 825 | }; | 781 | }; |
| 826 | 782 | ||
| 827 | /* End items for tcm_qla2xxx_tpg_attrib_cit */ | 783 | /* End items for tcm_qla2xxx_tpg_attrib_cit */ |
| 828 | 784 | ||
| 829 | static ssize_t tcm_qla2xxx_tpg_show_enable( | 785 | static ssize_t tcm_qla2xxx_tpg_enable_show(struct config_item *item, |
| 830 | struct se_portal_group *se_tpg, | 786 | char *page) |
| 831 | char *page) | ||
| 832 | { | 787 | { |
| 788 | struct se_portal_group *se_tpg = to_tpg(item); | ||
| 833 | struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg, | 789 | struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg, |
| 834 | struct tcm_qla2xxx_tpg, se_tpg); | 790 | struct tcm_qla2xxx_tpg, se_tpg); |
| 835 | 791 | ||
| @@ -865,11 +821,10 @@ static void tcm_qla2xxx_undepend_tpg(struct work_struct *work) | |||
| 865 | complete(&base_tpg->tpg_base_comp); | 821 | complete(&base_tpg->tpg_base_comp); |
| 866 | } | 822 | } |
| 867 | 823 | ||
| 868 | static ssize_t tcm_qla2xxx_tpg_store_enable( | 824 | static ssize_t tcm_qla2xxx_tpg_enable_store(struct config_item *item, |
| 869 | struct se_portal_group *se_tpg, | 825 | const char *page, size_t count) |
| 870 | const char *page, | ||
| 871 | size_t count) | ||
| 872 | { | 826 | { |
| 827 | struct se_portal_group *se_tpg = to_tpg(item); | ||
| 873 | struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg, | 828 | struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg, |
| 874 | struct tcm_qla2xxx_tpg, se_tpg); | 829 | struct tcm_qla2xxx_tpg, se_tpg); |
| 875 | unsigned long op; | 830 | unsigned long op; |
| @@ -909,22 +864,16 @@ static ssize_t tcm_qla2xxx_tpg_store_enable( | |||
| 909 | return count; | 864 | return count; |
| 910 | } | 865 | } |
| 911 | 866 | ||
| 912 | TF_TPG_BASE_ATTR(tcm_qla2xxx, enable, S_IRUGO | S_IWUSR); | 867 | static ssize_t tcm_qla2xxx_tpg_dynamic_sessions_show(struct config_item *item, |
| 913 | 868 | char *page) | |
| 914 | static ssize_t tcm_qla2xxx_tpg_show_dynamic_sessions( | ||
| 915 | struct se_portal_group *se_tpg, | ||
| 916 | char *page) | ||
| 917 | { | 869 | { |
| 918 | return target_show_dynamic_sessions(se_tpg, page); | 870 | return target_show_dynamic_sessions(to_tpg(item), page); |
| 919 | } | 871 | } |
| 920 | 872 | ||
| 921 | TF_TPG_BASE_ATTR_RO(tcm_qla2xxx, dynamic_sessions); | 873 | static ssize_t tcm_qla2xxx_tpg_fabric_prot_type_store(struct config_item *item, |
| 922 | 874 | const char *page, size_t count) | |
| 923 | static ssize_t tcm_qla2xxx_tpg_store_fabric_prot_type( | ||
| 924 | struct se_portal_group *se_tpg, | ||
| 925 | const char *page, | ||
| 926 | size_t count) | ||
| 927 | { | 875 | { |
| 876 | struct se_portal_group *se_tpg = to_tpg(item); | ||
| 928 | struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg, | 877 | struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg, |
| 929 | struct tcm_qla2xxx_tpg, se_tpg); | 878 | struct tcm_qla2xxx_tpg, se_tpg); |
| 930 | unsigned long val; | 879 | unsigned long val; |
| @@ -943,21 +892,24 @@ static ssize_t tcm_qla2xxx_tpg_store_fabric_prot_type( | |||
| 943 | return count; | 892 | return count; |
| 944 | } | 893 | } |
| 945 | 894 | ||
| 946 | static ssize_t tcm_qla2xxx_tpg_show_fabric_prot_type( | 895 | static ssize_t tcm_qla2xxx_tpg_fabric_prot_type_show(struct config_item *item, |
| 947 | struct se_portal_group *se_tpg, | 896 | char *page) |
| 948 | char *page) | ||
| 949 | { | 897 | { |
| 898 | struct se_portal_group *se_tpg = to_tpg(item); | ||
| 950 | struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg, | 899 | struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg, |
| 951 | struct tcm_qla2xxx_tpg, se_tpg); | 900 | struct tcm_qla2xxx_tpg, se_tpg); |
| 952 | 901 | ||
| 953 | return sprintf(page, "%d\n", tpg->tpg_attrib.fabric_prot_type); | 902 | return sprintf(page, "%d\n", tpg->tpg_attrib.fabric_prot_type); |
| 954 | } | 903 | } |
| 955 | TF_TPG_BASE_ATTR(tcm_qla2xxx, fabric_prot_type, S_IRUGO | S_IWUSR); | 904 | |
| 905 | CONFIGFS_ATTR_WO(tcm_qla2xxx_tpg_, enable); | ||
| 906 | CONFIGFS_ATTR_RO(tcm_qla2xxx_tpg_, dynamic_sessions); | ||
| 907 | CONFIGFS_ATTR(tcm_qla2xxx_tpg_, fabric_prot_type); | ||
| 956 | 908 | ||
| 957 | static struct configfs_attribute *tcm_qla2xxx_tpg_attrs[] = { | 909 | static struct configfs_attribute *tcm_qla2xxx_tpg_attrs[] = { |
| 958 | &tcm_qla2xxx_tpg_enable.attr, | 910 | &tcm_qla2xxx_tpg_attr_enable, |
| 959 | &tcm_qla2xxx_tpg_dynamic_sessions.attr, | 911 | &tcm_qla2xxx_tpg_attr_dynamic_sessions, |
| 960 | &tcm_qla2xxx_tpg_fabric_prot_type.attr, | 912 | &tcm_qla2xxx_tpg_attr_fabric_prot_type, |
| 961 | NULL, | 913 | NULL, |
| 962 | }; | 914 | }; |
| 963 | 915 | ||
| @@ -1030,18 +982,16 @@ static void tcm_qla2xxx_drop_tpg(struct se_portal_group *se_tpg) | |||
| 1030 | kfree(tpg); | 982 | kfree(tpg); |
| 1031 | } | 983 | } |
| 1032 | 984 | ||
| 1033 | static ssize_t tcm_qla2xxx_npiv_tpg_show_enable( | 985 | static ssize_t tcm_qla2xxx_npiv_tpg_enable_show(struct config_item *item, |
| 1034 | struct se_portal_group *se_tpg, | 986 | char *page) |
| 1035 | char *page) | ||
| 1036 | { | 987 | { |
| 1037 | return tcm_qla2xxx_tpg_show_enable(se_tpg, page); | 988 | return tcm_qla2xxx_tpg_enable_show(item, page); |
| 1038 | } | 989 | } |
| 1039 | 990 | ||
| 1040 | static ssize_t tcm_qla2xxx_npiv_tpg_store_enable( | 991 | static ssize_t tcm_qla2xxx_npiv_tpg_enable_store(struct config_item *item, |
| 1041 | struct se_portal_group *se_tpg, | 992 | const char *page, size_t count) |
| 1042 | const char *page, | ||
| 1043 | size_t count) | ||
| 1044 | { | 993 | { |
| 994 | struct se_portal_group *se_tpg = to_tpg(item); | ||
| 1045 | struct se_wwn *se_wwn = se_tpg->se_tpg_wwn; | 995 | struct se_wwn *se_wwn = se_tpg->se_tpg_wwn; |
| 1046 | struct tcm_qla2xxx_lport *lport = container_of(se_wwn, | 996 | struct tcm_qla2xxx_lport *lport = container_of(se_wwn, |
| 1047 | struct tcm_qla2xxx_lport, lport_wwn); | 997 | struct tcm_qla2xxx_lport, lport_wwn); |
| @@ -1077,10 +1027,10 @@ static ssize_t tcm_qla2xxx_npiv_tpg_store_enable( | |||
| 1077 | return count; | 1027 | return count; |
| 1078 | } | 1028 | } |
| 1079 | 1029 | ||
| 1080 | TF_TPG_BASE_ATTR(tcm_qla2xxx_npiv, enable, S_IRUGO | S_IWUSR); | 1030 | CONFIGFS_ATTR(tcm_qla2xxx_npiv_tpg_, enable); |
| 1081 | 1031 | ||
| 1082 | static struct configfs_attribute *tcm_qla2xxx_npiv_tpg_attrs[] = { | 1032 | static struct configfs_attribute *tcm_qla2xxx_npiv_tpg_attrs[] = { |
| 1083 | &tcm_qla2xxx_npiv_tpg_enable.attr, | 1033 | &tcm_qla2xxx_npiv_tpg_attr_enable, |
| 1084 | NULL, | 1034 | NULL, |
| 1085 | }; | 1035 | }; |
| 1086 | 1036 | ||
| @@ -1783,9 +1733,8 @@ static void tcm_qla2xxx_npiv_drop_lport(struct se_wwn *wwn) | |||
| 1783 | } | 1733 | } |
| 1784 | 1734 | ||
| 1785 | 1735 | ||
| 1786 | static ssize_t tcm_qla2xxx_wwn_show_attr_version( | 1736 | static ssize_t tcm_qla2xxx_wwn_version_show(struct config_item *item, |
| 1787 | struct target_fabric_configfs *tf, | 1737 | char *page) |
| 1788 | char *page) | ||
| 1789 | { | 1738 | { |
| 1790 | return sprintf(page, | 1739 | return sprintf(page, |
| 1791 | "TCM QLOGIC QLA2XXX NPIV capable fabric module %s on %s/%s on " | 1740 | "TCM QLOGIC QLA2XXX NPIV capable fabric module %s on %s/%s on " |
| @@ -1793,10 +1742,10 @@ static ssize_t tcm_qla2xxx_wwn_show_attr_version( | |||
| 1793 | utsname()->machine); | 1742 | utsname()->machine); |
| 1794 | } | 1743 | } |
| 1795 | 1744 | ||
| 1796 | TF_WWN_ATTR_RO(tcm_qla2xxx, version); | 1745 | CONFIGFS_ATTR_RO(tcm_qla2xxx_wwn_, version); |
| 1797 | 1746 | ||
| 1798 | static struct configfs_attribute *tcm_qla2xxx_wwn_attrs[] = { | 1747 | static struct configfs_attribute *tcm_qla2xxx_wwn_attrs[] = { |
| 1799 | &tcm_qla2xxx_wwn_version.attr, | 1748 | &tcm_qla2xxx_wwn_attr_version, |
| 1800 | NULL, | 1749 | NULL, |
| 1801 | }; | 1750 | }; |
| 1802 | 1751 | ||
