diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-04-24 13:22:09 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-04-24 13:22:09 -0400 |
commit | c6668726d2c2c581e6c417448c472c994d026f5f (patch) | |
tree | ccbc5a73b9dfe09a065cb5d8627aa2297e730ec0 /drivers/scsi/qla2xxx | |
parent | 06b45f2aa703837163496f5db6a53575665cc6b4 (diff) | |
parent | 68d4cef3bab3fb9bb0dbac690ba35a96cb5a16d9 (diff) |
Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending
Pull SCSI target updates from Nicholas Bellinger:
"Lots of activity in target land the last months.
The highlights include:
- Convert fabric drivers tree-wide to target_register_template() (hch
+ bart)
- iser-target hardening fixes + v1.0 improvements (sagi)
- Convert iscsi_thread_set usage to kthread.h + kill
iscsi_target_tq.c (sagi + nab)
- Add support for T10-PI WRITE_STRIP + READ_INSERT operation (mkp +
sagi + nab)
- DIF fixes for CONFIG_DEBUG_SG=y + UNMAP file emulation (akinobu +
sagi + mkp)
- Extended TCMU ABI v2 for future BIDI + DIF support (andy + ilias)
- Fix COMPARE_AND_WRITE handling for NO_ALLLOC drivers (hch + nab)
Thanks to everyone who contributed this round with new features,
bug-reports, fixes, cleanups and improvements.
Looking forward, it's currently shaping up to be a busy v4.2 as well"
* 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending: (69 commits)
target: Put TCMU under a new config option
target: Version 2 of TCMU ABI
target: fix tcm_mod_builder.py
target/file: Fix UNMAP with DIF protection support
target/file: Fix SG table for prot_buf initialization
target/file: Fix BUG() when CONFIG_DEBUG_SG=y and DIF protection enabled
target: Make core_tmr_abort_task() skip TMFs
target/sbc: Update sbc_dif_generate pr_debug output
target/sbc: Make internal DIF emulation honor ->prot_checks
target/sbc: Return INVALID_CDB_FIELD if DIF + sess_prot_type disabled
target: Ensure sess_prot_type is saved across session restart
target/rd: Don't pass incomplete scatterlist entries to sbc_dif_verify_*
target: Remove the unused flag SCF_ACK_KREF
target: Fix two sparse warnings
target: Fix COMPARE_AND_WRITE with SG_TO_MEM_NOALLOC handling
target: simplify the target template registration API
target: simplify target_xcopy_init_pt_lun
target: remove the unused SCF_CMD_XCOPY_PASSTHROUGH flag
target/rd: reduce code duplication in rd_execute_rw()
tcm_loop: fixup tpgt string to integer conversion
...
Diffstat (limited to 'drivers/scsi/qla2xxx')
-rw-r--r-- | drivers/scsi/qla2xxx/qla_target.c | 2 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/tcm_qla2xxx.c | 174 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/tcm_qla2xxx.h | 1 |
3 files changed, 83 insertions, 94 deletions
diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c index 57418258c101..fe8a8d157e22 100644 --- a/drivers/scsi/qla2xxx/qla_target.c +++ b/drivers/scsi/qla2xxx/qla_target.c | |||
@@ -3065,7 +3065,7 @@ static void qlt_do_ctio_completion(struct scsi_qla_host *vha, uint32_t handle, | |||
3065 | { | 3065 | { |
3066 | struct qla_hw_data *ha = vha->hw; | 3066 | struct qla_hw_data *ha = vha->hw; |
3067 | struct se_cmd *se_cmd; | 3067 | struct se_cmd *se_cmd; |
3068 | struct target_core_fabric_ops *tfo; | 3068 | const struct target_core_fabric_ops *tfo; |
3069 | struct qla_tgt_cmd *cmd; | 3069 | struct qla_tgt_cmd *cmd; |
3070 | 3070 | ||
3071 | if (handle & CTIO_INTERMEDIATE_HANDLE_MARK) { | 3071 | if (handle & CTIO_INTERMEDIATE_HANDLE_MARK) { |
diff --git a/drivers/scsi/qla2xxx/tcm_qla2xxx.c b/drivers/scsi/qla2xxx/tcm_qla2xxx.c index ab4879e12ea7..68c2002e78bf 100644 --- a/drivers/scsi/qla2xxx/tcm_qla2xxx.c +++ b/drivers/scsi/qla2xxx/tcm_qla2xxx.c | |||
@@ -53,9 +53,8 @@ | |||
53 | static struct workqueue_struct *tcm_qla2xxx_free_wq; | 53 | static struct workqueue_struct *tcm_qla2xxx_free_wq; |
54 | static struct workqueue_struct *tcm_qla2xxx_cmd_wq; | 54 | static struct workqueue_struct *tcm_qla2xxx_cmd_wq; |
55 | 55 | ||
56 | /* Local pointer to allocated TCM configfs fabric module */ | 56 | static const struct target_core_fabric_ops tcm_qla2xxx_ops; |
57 | static struct target_fabric_configfs *tcm_qla2xxx_fabric_configfs; | 57 | static const struct target_core_fabric_ops tcm_qla2xxx_npiv_ops; |
58 | static struct target_fabric_configfs *tcm_qla2xxx_npiv_fabric_configfs; | ||
59 | 58 | ||
60 | /* | 59 | /* |
61 | * Parse WWN. | 60 | * Parse WWN. |
@@ -336,6 +335,14 @@ static int tcm_qla2xxx_check_demo_mode_login_only(struct se_portal_group *se_tpg | |||
336 | return tpg->tpg_attrib.demo_mode_login_only; | 335 | return tpg->tpg_attrib.demo_mode_login_only; |
337 | } | 336 | } |
338 | 337 | ||
338 | static int tcm_qla2xxx_check_prot_fabric_only(struct se_portal_group *se_tpg) | ||
339 | { | ||
340 | struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg, | ||
341 | struct tcm_qla2xxx_tpg, se_tpg); | ||
342 | |||
343 | return tpg->tpg_attrib.fabric_prot_type; | ||
344 | } | ||
345 | |||
339 | static struct se_node_acl *tcm_qla2xxx_alloc_fabric_acl( | 346 | static struct se_node_acl *tcm_qla2xxx_alloc_fabric_acl( |
340 | struct se_portal_group *se_tpg) | 347 | struct se_portal_group *se_tpg) |
341 | { | 348 | { |
@@ -1082,8 +1089,53 @@ static ssize_t tcm_qla2xxx_tpg_store_enable( | |||
1082 | 1089 | ||
1083 | TF_TPG_BASE_ATTR(tcm_qla2xxx, enable, S_IRUGO | S_IWUSR); | 1090 | TF_TPG_BASE_ATTR(tcm_qla2xxx, enable, S_IRUGO | S_IWUSR); |
1084 | 1091 | ||
1092 | static ssize_t tcm_qla2xxx_tpg_show_dynamic_sessions( | ||
1093 | struct se_portal_group *se_tpg, | ||
1094 | char *page) | ||
1095 | { | ||
1096 | return target_show_dynamic_sessions(se_tpg, page); | ||
1097 | } | ||
1098 | |||
1099 | TF_TPG_BASE_ATTR_RO(tcm_qla2xxx, dynamic_sessions); | ||
1100 | |||
1101 | static ssize_t tcm_qla2xxx_tpg_store_fabric_prot_type( | ||
1102 | struct se_portal_group *se_tpg, | ||
1103 | const char *page, | ||
1104 | size_t count) | ||
1105 | { | ||
1106 | struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg, | ||
1107 | struct tcm_qla2xxx_tpg, se_tpg); | ||
1108 | unsigned long val; | ||
1109 | int ret = kstrtoul(page, 0, &val); | ||
1110 | |||
1111 | if (ret) { | ||
1112 | pr_err("kstrtoul() returned %d for fabric_prot_type\n", ret); | ||
1113 | return ret; | ||
1114 | } | ||
1115 | if (val != 0 && val != 1 && val != 3) { | ||
1116 | pr_err("Invalid qla2xxx fabric_prot_type: %lu\n", val); | ||
1117 | return -EINVAL; | ||
1118 | } | ||
1119 | tpg->tpg_attrib.fabric_prot_type = val; | ||
1120 | |||
1121 | return count; | ||
1122 | } | ||
1123 | |||
1124 | static ssize_t tcm_qla2xxx_tpg_show_fabric_prot_type( | ||
1125 | struct se_portal_group *se_tpg, | ||
1126 | char *page) | ||
1127 | { | ||
1128 | struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg, | ||
1129 | struct tcm_qla2xxx_tpg, se_tpg); | ||
1130 | |||
1131 | return sprintf(page, "%d\n", tpg->tpg_attrib.fabric_prot_type); | ||
1132 | } | ||
1133 | TF_TPG_BASE_ATTR(tcm_qla2xxx, fabric_prot_type, S_IRUGO | S_IWUSR); | ||
1134 | |||
1085 | static struct configfs_attribute *tcm_qla2xxx_tpg_attrs[] = { | 1135 | static struct configfs_attribute *tcm_qla2xxx_tpg_attrs[] = { |
1086 | &tcm_qla2xxx_tpg_enable.attr, | 1136 | &tcm_qla2xxx_tpg_enable.attr, |
1137 | &tcm_qla2xxx_tpg_dynamic_sessions.attr, | ||
1138 | &tcm_qla2xxx_tpg_fabric_prot_type.attr, | ||
1087 | NULL, | 1139 | NULL, |
1088 | }; | 1140 | }; |
1089 | 1141 | ||
@@ -1124,7 +1176,7 @@ static struct se_portal_group *tcm_qla2xxx_make_tpg( | |||
1124 | tpg->tpg_attrib.cache_dynamic_acls = 1; | 1176 | tpg->tpg_attrib.cache_dynamic_acls = 1; |
1125 | tpg->tpg_attrib.demo_mode_login_only = 1; | 1177 | tpg->tpg_attrib.demo_mode_login_only = 1; |
1126 | 1178 | ||
1127 | ret = core_tpg_register(&tcm_qla2xxx_fabric_configfs->tf_ops, wwn, | 1179 | ret = core_tpg_register(&tcm_qla2xxx_ops, wwn, |
1128 | &tpg->se_tpg, tpg, TRANSPORT_TPG_TYPE_NORMAL); | 1180 | &tpg->se_tpg, tpg, TRANSPORT_TPG_TYPE_NORMAL); |
1129 | if (ret < 0) { | 1181 | if (ret < 0) { |
1130 | kfree(tpg); | 1182 | kfree(tpg); |
@@ -1244,7 +1296,7 @@ static struct se_portal_group *tcm_qla2xxx_npiv_make_tpg( | |||
1244 | tpg->tpg_attrib.cache_dynamic_acls = 1; | 1296 | tpg->tpg_attrib.cache_dynamic_acls = 1; |
1245 | tpg->tpg_attrib.demo_mode_login_only = 1; | 1297 | tpg->tpg_attrib.demo_mode_login_only = 1; |
1246 | 1298 | ||
1247 | ret = core_tpg_register(&tcm_qla2xxx_npiv_fabric_configfs->tf_ops, wwn, | 1299 | ret = core_tpg_register(&tcm_qla2xxx_npiv_ops, wwn, |
1248 | &tpg->se_tpg, tpg, TRANSPORT_TPG_TYPE_NORMAL); | 1300 | &tpg->se_tpg, tpg, TRANSPORT_TPG_TYPE_NORMAL); |
1249 | if (ret < 0) { | 1301 | if (ret < 0) { |
1250 | kfree(tpg); | 1302 | kfree(tpg); |
@@ -1560,7 +1612,7 @@ static int tcm_qla2xxx_check_initiator_node_acl( | |||
1560 | 1612 | ||
1561 | se_sess = transport_init_session_tags(num_tags, | 1613 | se_sess = transport_init_session_tags(num_tags, |
1562 | sizeof(struct qla_tgt_cmd), | 1614 | sizeof(struct qla_tgt_cmd), |
1563 | TARGET_PROT_NORMAL); | 1615 | TARGET_PROT_ALL); |
1564 | if (IS_ERR(se_sess)) { | 1616 | if (IS_ERR(se_sess)) { |
1565 | pr_err("Unable to initialize struct se_session\n"); | 1617 | pr_err("Unable to initialize struct se_session\n"); |
1566 | return PTR_ERR(se_sess); | 1618 | return PTR_ERR(se_sess); |
@@ -1934,7 +1986,9 @@ static struct configfs_attribute *tcm_qla2xxx_wwn_attrs[] = { | |||
1934 | NULL, | 1986 | NULL, |
1935 | }; | 1987 | }; |
1936 | 1988 | ||
1937 | static struct target_core_fabric_ops tcm_qla2xxx_ops = { | 1989 | static const struct target_core_fabric_ops tcm_qla2xxx_ops = { |
1990 | .module = THIS_MODULE, | ||
1991 | .name = "qla2xxx", | ||
1938 | .get_fabric_name = tcm_qla2xxx_get_fabric_name, | 1992 | .get_fabric_name = tcm_qla2xxx_get_fabric_name, |
1939 | .get_fabric_proto_ident = tcm_qla2xxx_get_fabric_proto_ident, | 1993 | .get_fabric_proto_ident = tcm_qla2xxx_get_fabric_proto_ident, |
1940 | .tpg_get_wwn = tcm_qla2xxx_get_fabric_wwn, | 1994 | .tpg_get_wwn = tcm_qla2xxx_get_fabric_wwn, |
@@ -1949,6 +2003,7 @@ static struct target_core_fabric_ops tcm_qla2xxx_ops = { | |||
1949 | tcm_qla2xxx_check_demo_write_protect, | 2003 | tcm_qla2xxx_check_demo_write_protect, |
1950 | .tpg_check_prod_mode_write_protect = | 2004 | .tpg_check_prod_mode_write_protect = |
1951 | tcm_qla2xxx_check_prod_write_protect, | 2005 | tcm_qla2xxx_check_prod_write_protect, |
2006 | .tpg_check_prot_fabric_only = tcm_qla2xxx_check_prot_fabric_only, | ||
1952 | .tpg_check_demo_mode_login_only = tcm_qla2xxx_check_demo_mode_login_only, | 2007 | .tpg_check_demo_mode_login_only = tcm_qla2xxx_check_demo_mode_login_only, |
1953 | .tpg_alloc_fabric_acl = tcm_qla2xxx_alloc_fabric_acl, | 2008 | .tpg_alloc_fabric_acl = tcm_qla2xxx_alloc_fabric_acl, |
1954 | .tpg_release_fabric_acl = tcm_qla2xxx_release_fabric_acl, | 2009 | .tpg_release_fabric_acl = tcm_qla2xxx_release_fabric_acl, |
@@ -1983,9 +2038,15 @@ static struct target_core_fabric_ops tcm_qla2xxx_ops = { | |||
1983 | .fabric_drop_np = NULL, | 2038 | .fabric_drop_np = NULL, |
1984 | .fabric_make_nodeacl = tcm_qla2xxx_make_nodeacl, | 2039 | .fabric_make_nodeacl = tcm_qla2xxx_make_nodeacl, |
1985 | .fabric_drop_nodeacl = tcm_qla2xxx_drop_nodeacl, | 2040 | .fabric_drop_nodeacl = tcm_qla2xxx_drop_nodeacl, |
2041 | |||
2042 | .tfc_wwn_attrs = tcm_qla2xxx_wwn_attrs, | ||
2043 | .tfc_tpg_base_attrs = tcm_qla2xxx_tpg_attrs, | ||
2044 | .tfc_tpg_attrib_attrs = tcm_qla2xxx_tpg_attrib_attrs, | ||
1986 | }; | 2045 | }; |
1987 | 2046 | ||
1988 | static struct target_core_fabric_ops tcm_qla2xxx_npiv_ops = { | 2047 | static const struct target_core_fabric_ops tcm_qla2xxx_npiv_ops = { |
2048 | .module = THIS_MODULE, | ||
2049 | .name = "qla2xxx_npiv", | ||
1989 | .get_fabric_name = tcm_qla2xxx_npiv_get_fabric_name, | 2050 | .get_fabric_name = tcm_qla2xxx_npiv_get_fabric_name, |
1990 | .get_fabric_proto_ident = tcm_qla2xxx_get_fabric_proto_ident, | 2051 | .get_fabric_proto_ident = tcm_qla2xxx_get_fabric_proto_ident, |
1991 | .tpg_get_wwn = tcm_qla2xxx_get_fabric_wwn, | 2052 | .tpg_get_wwn = tcm_qla2xxx_get_fabric_wwn, |
@@ -2033,94 +2094,26 @@ static struct target_core_fabric_ops tcm_qla2xxx_npiv_ops = { | |||
2033 | .fabric_drop_np = NULL, | 2094 | .fabric_drop_np = NULL, |
2034 | .fabric_make_nodeacl = tcm_qla2xxx_make_nodeacl, | 2095 | .fabric_make_nodeacl = tcm_qla2xxx_make_nodeacl, |
2035 | .fabric_drop_nodeacl = tcm_qla2xxx_drop_nodeacl, | 2096 | .fabric_drop_nodeacl = tcm_qla2xxx_drop_nodeacl, |
2097 | |||
2098 | .tfc_wwn_attrs = tcm_qla2xxx_wwn_attrs, | ||
2099 | .tfc_tpg_base_attrs = tcm_qla2xxx_npiv_tpg_attrs, | ||
2036 | }; | 2100 | }; |
2037 | 2101 | ||
2038 | static int tcm_qla2xxx_register_configfs(void) | 2102 | static int tcm_qla2xxx_register_configfs(void) |
2039 | { | 2103 | { |
2040 | struct target_fabric_configfs *fabric, *npiv_fabric; | ||
2041 | int ret; | 2104 | int ret; |
2042 | 2105 | ||
2043 | pr_debug("TCM QLOGIC QLA2XXX fabric module %s on %s/%s on " | 2106 | pr_debug("TCM QLOGIC QLA2XXX fabric module %s on %s/%s on " |
2044 | UTS_RELEASE"\n", TCM_QLA2XXX_VERSION, utsname()->sysname, | 2107 | UTS_RELEASE"\n", TCM_QLA2XXX_VERSION, utsname()->sysname, |
2045 | utsname()->machine); | 2108 | utsname()->machine); |
2046 | /* | 2109 | |
2047 | * Register the top level struct config_item_type with TCM core | 2110 | ret = target_register_template(&tcm_qla2xxx_ops); |
2048 | */ | 2111 | if (ret) |
2049 | fabric = target_fabric_configfs_init(THIS_MODULE, "qla2xxx"); | ||
2050 | if (IS_ERR(fabric)) { | ||
2051 | pr_err("target_fabric_configfs_init() failed\n"); | ||
2052 | return PTR_ERR(fabric); | ||
2053 | } | ||
2054 | /* | ||
2055 | * Setup fabric->tf_ops from our local tcm_qla2xxx_ops | ||
2056 | */ | ||
2057 | fabric->tf_ops = tcm_qla2xxx_ops; | ||
2058 | /* | ||
2059 | * Setup default attribute lists for various fabric->tf_cit_tmpl | ||
2060 | */ | ||
2061 | fabric->tf_cit_tmpl.tfc_wwn_cit.ct_attrs = tcm_qla2xxx_wwn_attrs; | ||
2062 | fabric->tf_cit_tmpl.tfc_tpg_base_cit.ct_attrs = tcm_qla2xxx_tpg_attrs; | ||
2063 | fabric->tf_cit_tmpl.tfc_tpg_attrib_cit.ct_attrs = | ||
2064 | tcm_qla2xxx_tpg_attrib_attrs; | ||
2065 | fabric->tf_cit_tmpl.tfc_tpg_param_cit.ct_attrs = NULL; | ||
2066 | fabric->tf_cit_tmpl.tfc_tpg_np_base_cit.ct_attrs = NULL; | ||
2067 | fabric->tf_cit_tmpl.tfc_tpg_nacl_base_cit.ct_attrs = NULL; | ||
2068 | fabric->tf_cit_tmpl.tfc_tpg_nacl_attrib_cit.ct_attrs = NULL; | ||
2069 | fabric->tf_cit_tmpl.tfc_tpg_nacl_auth_cit.ct_attrs = NULL; | ||
2070 | fabric->tf_cit_tmpl.tfc_tpg_nacl_param_cit.ct_attrs = NULL; | ||
2071 | /* | ||
2072 | * Register the fabric for use within TCM | ||
2073 | */ | ||
2074 | ret = target_fabric_configfs_register(fabric); | ||
2075 | if (ret < 0) { | ||
2076 | pr_err("target_fabric_configfs_register() failed for TCM_QLA2XXX\n"); | ||
2077 | return ret; | 2112 | return ret; |
2078 | } | ||
2079 | /* | ||
2080 | * Setup our local pointer to *fabric | ||
2081 | */ | ||
2082 | tcm_qla2xxx_fabric_configfs = fabric; | ||
2083 | pr_debug("TCM_QLA2XXX[0] - Set fabric -> tcm_qla2xxx_fabric_configfs\n"); | ||
2084 | 2113 | ||
2085 | /* | 2114 | ret = target_register_template(&tcm_qla2xxx_npiv_ops); |
2086 | * Register the top level struct config_item_type for NPIV with TCM core | 2115 | if (ret) |
2087 | */ | ||
2088 | npiv_fabric = target_fabric_configfs_init(THIS_MODULE, "qla2xxx_npiv"); | ||
2089 | if (IS_ERR(npiv_fabric)) { | ||
2090 | pr_err("target_fabric_configfs_init() failed\n"); | ||
2091 | ret = PTR_ERR(npiv_fabric); | ||
2092 | goto out_fabric; | ||
2093 | } | ||
2094 | /* | ||
2095 | * Setup fabric->tf_ops from our local tcm_qla2xxx_npiv_ops | ||
2096 | */ | ||
2097 | npiv_fabric->tf_ops = tcm_qla2xxx_npiv_ops; | ||
2098 | /* | ||
2099 | * Setup default attribute lists for various npiv_fabric->tf_cit_tmpl | ||
2100 | */ | ||
2101 | npiv_fabric->tf_cit_tmpl.tfc_wwn_cit.ct_attrs = tcm_qla2xxx_wwn_attrs; | ||
2102 | npiv_fabric->tf_cit_tmpl.tfc_tpg_base_cit.ct_attrs = | ||
2103 | tcm_qla2xxx_npiv_tpg_attrs; | ||
2104 | npiv_fabric->tf_cit_tmpl.tfc_tpg_attrib_cit.ct_attrs = NULL; | ||
2105 | npiv_fabric->tf_cit_tmpl.tfc_tpg_param_cit.ct_attrs = NULL; | ||
2106 | npiv_fabric->tf_cit_tmpl.tfc_tpg_np_base_cit.ct_attrs = NULL; | ||
2107 | npiv_fabric->tf_cit_tmpl.tfc_tpg_nacl_base_cit.ct_attrs = NULL; | ||
2108 | npiv_fabric->tf_cit_tmpl.tfc_tpg_nacl_attrib_cit.ct_attrs = NULL; | ||
2109 | npiv_fabric->tf_cit_tmpl.tfc_tpg_nacl_auth_cit.ct_attrs = NULL; | ||
2110 | npiv_fabric->tf_cit_tmpl.tfc_tpg_nacl_param_cit.ct_attrs = NULL; | ||
2111 | /* | ||
2112 | * Register the npiv_fabric for use within TCM | ||
2113 | */ | ||
2114 | ret = target_fabric_configfs_register(npiv_fabric); | ||
2115 | if (ret < 0) { | ||
2116 | pr_err("target_fabric_configfs_register() failed for TCM_QLA2XXX\n"); | ||
2117 | goto out_fabric; | 2116 | goto out_fabric; |
2118 | } | ||
2119 | /* | ||
2120 | * Setup our local pointer to *npiv_fabric | ||
2121 | */ | ||
2122 | tcm_qla2xxx_npiv_fabric_configfs = npiv_fabric; | ||
2123 | pr_debug("TCM_QLA2XXX[0] - Set fabric -> tcm_qla2xxx_npiv_fabric_configfs\n"); | ||
2124 | 2117 | ||
2125 | tcm_qla2xxx_free_wq = alloc_workqueue("tcm_qla2xxx_free", | 2118 | tcm_qla2xxx_free_wq = alloc_workqueue("tcm_qla2xxx_free", |
2126 | WQ_MEM_RECLAIM, 0); | 2119 | WQ_MEM_RECLAIM, 0); |
@@ -2140,9 +2133,9 @@ static int tcm_qla2xxx_register_configfs(void) | |||
2140 | out_free_wq: | 2133 | out_free_wq: |
2141 | destroy_workqueue(tcm_qla2xxx_free_wq); | 2134 | destroy_workqueue(tcm_qla2xxx_free_wq); |
2142 | out_fabric_npiv: | 2135 | out_fabric_npiv: |
2143 | target_fabric_configfs_deregister(tcm_qla2xxx_npiv_fabric_configfs); | 2136 | target_unregister_template(&tcm_qla2xxx_npiv_ops); |
2144 | out_fabric: | 2137 | out_fabric: |
2145 | target_fabric_configfs_deregister(tcm_qla2xxx_fabric_configfs); | 2138 | target_unregister_template(&tcm_qla2xxx_ops); |
2146 | return ret; | 2139 | return ret; |
2147 | } | 2140 | } |
2148 | 2141 | ||
@@ -2151,13 +2144,8 @@ static void tcm_qla2xxx_deregister_configfs(void) | |||
2151 | destroy_workqueue(tcm_qla2xxx_cmd_wq); | 2144 | destroy_workqueue(tcm_qla2xxx_cmd_wq); |
2152 | destroy_workqueue(tcm_qla2xxx_free_wq); | 2145 | destroy_workqueue(tcm_qla2xxx_free_wq); |
2153 | 2146 | ||
2154 | target_fabric_configfs_deregister(tcm_qla2xxx_fabric_configfs); | 2147 | target_unregister_template(&tcm_qla2xxx_ops); |
2155 | tcm_qla2xxx_fabric_configfs = NULL; | 2148 | target_unregister_template(&tcm_qla2xxx_npiv_ops); |
2156 | pr_debug("TCM_QLA2XXX[0] - Cleared tcm_qla2xxx_fabric_configfs\n"); | ||
2157 | |||
2158 | target_fabric_configfs_deregister(tcm_qla2xxx_npiv_fabric_configfs); | ||
2159 | tcm_qla2xxx_npiv_fabric_configfs = NULL; | ||
2160 | pr_debug("TCM_QLA2XXX[0] - Cleared tcm_qla2xxx_npiv_fabric_configfs\n"); | ||
2161 | } | 2149 | } |
2162 | 2150 | ||
2163 | static int __init tcm_qla2xxx_init(void) | 2151 | static int __init tcm_qla2xxx_init(void) |
diff --git a/drivers/scsi/qla2xxx/tcm_qla2xxx.h b/drivers/scsi/qla2xxx/tcm_qla2xxx.h index 10c002145648..23295115c9fc 100644 --- a/drivers/scsi/qla2xxx/tcm_qla2xxx.h +++ b/drivers/scsi/qla2xxx/tcm_qla2xxx.h | |||
@@ -33,6 +33,7 @@ struct tcm_qla2xxx_tpg_attrib { | |||
33 | int demo_mode_write_protect; | 33 | int demo_mode_write_protect; |
34 | int prod_mode_write_protect; | 34 | int prod_mode_write_protect; |
35 | int demo_mode_login_only; | 35 | int demo_mode_login_only; |
36 | int fabric_prot_type; | ||
36 | }; | 37 | }; |
37 | 38 | ||
38 | struct tcm_qla2xxx_tpg { | 39 | struct tcm_qla2xxx_tpg { |