diff options
author | Nicholas Bellinger <nab@linux-iscsi.org> | 2015-03-29 22:36:16 -0400 |
---|---|---|
committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2015-04-08 02:27:48 -0400 |
commit | 901c04a33f138e5fb935a1621375a1a0997fe7b1 (patch) | |
tree | f56b32598102c83b8373a39b00512db37b30eb0b /drivers/target | |
parent | 64b16887749fd8e8000cc2ad1acca3cd29f84086 (diff) |
iscsi/iser-target: Add fabric_prot_type attribute support
This patch updates iscsi/iser-target to add a new fabric_prot_type
TPG attribute for iser-target, used for controlling LLD level
protection into LIO when the backend device does not support T10-PI.
This is required for ib_isert to enable WRITE_STRIP + READ_INSERT
hardware offloads.
It's disabled by default and controls which se_sesion->sess_prot_type
are set at iscsi_target_locate_portal() session registration time.
Cc: Sagi Grimberg <sagig@mellanox.com>
Cc: Martin Petersen <martin.petersen@oracle.com>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
Diffstat (limited to 'drivers/target')
-rw-r--r-- | drivers/target/iscsi/iscsi_target_configfs.c | 22 | ||||
-rw-r--r-- | drivers/target/iscsi/iscsi_target_tpg.c | 19 | ||||
-rw-r--r-- | drivers/target/iscsi/iscsi_target_tpg.h | 1 |
3 files changed, 42 insertions, 0 deletions
diff --git a/drivers/target/iscsi/iscsi_target_configfs.c b/drivers/target/iscsi/iscsi_target_configfs.c index 95a67f604073..9cb5ab472a52 100644 --- a/drivers/target/iscsi/iscsi_target_configfs.c +++ b/drivers/target/iscsi/iscsi_target_configfs.c | |||
@@ -1052,6 +1052,11 @@ TPG_ATTR(default_erl, S_IRUGO | S_IWUSR); | |||
1052 | */ | 1052 | */ |
1053 | DEF_TPG_ATTRIB(t10_pi); | 1053 | DEF_TPG_ATTRIB(t10_pi); |
1054 | TPG_ATTR(t10_pi, S_IRUGO | S_IWUSR); | 1054 | TPG_ATTR(t10_pi, S_IRUGO | S_IWUSR); |
1055 | /* | ||
1056 | * Define iscsi_tpg_attrib_s_fabric_prot_type | ||
1057 | */ | ||
1058 | DEF_TPG_ATTRIB(fabric_prot_type); | ||
1059 | TPG_ATTR(fabric_prot_type, S_IRUGO | S_IWUSR); | ||
1055 | 1060 | ||
1056 | static struct configfs_attribute *lio_target_tpg_attrib_attrs[] = { | 1061 | static struct configfs_attribute *lio_target_tpg_attrib_attrs[] = { |
1057 | &iscsi_tpg_attrib_authentication.attr, | 1062 | &iscsi_tpg_attrib_authentication.attr, |
@@ -1065,6 +1070,7 @@ static struct configfs_attribute *lio_target_tpg_attrib_attrs[] = { | |||
1065 | &iscsi_tpg_attrib_demo_mode_discovery.attr, | 1070 | &iscsi_tpg_attrib_demo_mode_discovery.attr, |
1066 | &iscsi_tpg_attrib_default_erl.attr, | 1071 | &iscsi_tpg_attrib_default_erl.attr, |
1067 | &iscsi_tpg_attrib_t10_pi.attr, | 1072 | &iscsi_tpg_attrib_t10_pi.attr, |
1073 | &iscsi_tpg_attrib_fabric_prot_type.attr, | ||
1068 | NULL, | 1074 | NULL, |
1069 | }; | 1075 | }; |
1070 | 1076 | ||
@@ -1882,6 +1888,20 @@ static int lio_tpg_check_prod_mode_write_protect( | |||
1882 | return tpg->tpg_attrib.prod_mode_write_protect; | 1888 | return tpg->tpg_attrib.prod_mode_write_protect; |
1883 | } | 1889 | } |
1884 | 1890 | ||
1891 | static int lio_tpg_check_prot_fabric_only( | ||
1892 | struct se_portal_group *se_tpg) | ||
1893 | { | ||
1894 | struct iscsi_portal_group *tpg = se_tpg->se_tpg_fabric_ptr; | ||
1895 | /* | ||
1896 | * Only report fabric_prot_type if t10_pi has also been enabled | ||
1897 | * for incoming ib_isert sessions. | ||
1898 | */ | ||
1899 | if (!tpg->tpg_attrib.t10_pi) | ||
1900 | return 0; | ||
1901 | |||
1902 | return tpg->tpg_attrib.fabric_prot_type; | ||
1903 | } | ||
1904 | |||
1885 | static void lio_tpg_release_fabric_acl( | 1905 | static void lio_tpg_release_fabric_acl( |
1886 | struct se_portal_group *se_tpg, | 1906 | struct se_portal_group *se_tpg, |
1887 | struct se_node_acl *se_acl) | 1907 | struct se_node_acl *se_acl) |
@@ -1997,6 +2017,8 @@ int iscsi_target_register_configfs(void) | |||
1997 | &lio_tpg_check_demo_mode_write_protect; | 2017 | &lio_tpg_check_demo_mode_write_protect; |
1998 | fabric->tf_ops.tpg_check_prod_mode_write_protect = | 2018 | fabric->tf_ops.tpg_check_prod_mode_write_protect = |
1999 | &lio_tpg_check_prod_mode_write_protect; | 2019 | &lio_tpg_check_prod_mode_write_protect; |
2020 | fabric->tf_ops.tpg_check_prot_fabric_only = | ||
2021 | &lio_tpg_check_prot_fabric_only; | ||
2000 | fabric->tf_ops.tpg_alloc_fabric_acl = &lio_tpg_alloc_fabric_acl; | 2022 | fabric->tf_ops.tpg_alloc_fabric_acl = &lio_tpg_alloc_fabric_acl; |
2001 | fabric->tf_ops.tpg_release_fabric_acl = &lio_tpg_release_fabric_acl; | 2023 | fabric->tf_ops.tpg_release_fabric_acl = &lio_tpg_release_fabric_acl; |
2002 | fabric->tf_ops.tpg_get_inst_index = &lio_tpg_get_inst_index; | 2024 | fabric->tf_ops.tpg_get_inst_index = &lio_tpg_get_inst_index; |
diff --git a/drivers/target/iscsi/iscsi_target_tpg.c b/drivers/target/iscsi/iscsi_target_tpg.c index bdd127c0e3ae..3076e6f3a831 100644 --- a/drivers/target/iscsi/iscsi_target_tpg.c +++ b/drivers/target/iscsi/iscsi_target_tpg.c | |||
@@ -228,6 +228,7 @@ static void iscsit_set_default_tpg_attribs(struct iscsi_portal_group *tpg) | |||
228 | a->demo_mode_discovery = TA_DEMO_MODE_DISCOVERY; | 228 | a->demo_mode_discovery = TA_DEMO_MODE_DISCOVERY; |
229 | a->default_erl = TA_DEFAULT_ERL; | 229 | a->default_erl = TA_DEFAULT_ERL; |
230 | a->t10_pi = TA_DEFAULT_T10_PI; | 230 | a->t10_pi = TA_DEFAULT_T10_PI; |
231 | a->fabric_prot_type = TA_DEFAULT_FABRIC_PROT_TYPE; | ||
231 | } | 232 | } |
232 | 233 | ||
233 | int iscsit_tpg_add_portal_group(struct iscsi_tiqn *tiqn, struct iscsi_portal_group *tpg) | 234 | int iscsit_tpg_add_portal_group(struct iscsi_tiqn *tiqn, struct iscsi_portal_group *tpg) |
@@ -878,3 +879,21 @@ int iscsit_ta_t10_pi( | |||
878 | 879 | ||
879 | return 0; | 880 | return 0; |
880 | } | 881 | } |
882 | |||
883 | int iscsit_ta_fabric_prot_type( | ||
884 | struct iscsi_portal_group *tpg, | ||
885 | u32 prot_type) | ||
886 | { | ||
887 | struct iscsi_tpg_attrib *a = &tpg->tpg_attrib; | ||
888 | |||
889 | if ((prot_type != 0) && (prot_type != 1) && (prot_type != 3)) { | ||
890 | pr_err("Illegal value for fabric_prot_type: %u\n", prot_type); | ||
891 | return -EINVAL; | ||
892 | } | ||
893 | |||
894 | a->fabric_prot_type = prot_type; | ||
895 | pr_debug("iSCSI_TPG[%hu] - T10 Fabric Protection Type: %u\n", | ||
896 | tpg->tpgt, prot_type); | ||
897 | |||
898 | return 0; | ||
899 | } | ||
diff --git a/drivers/target/iscsi/iscsi_target_tpg.h b/drivers/target/iscsi/iscsi_target_tpg.h index e7265337bc43..95ff5bdecd71 100644 --- a/drivers/target/iscsi/iscsi_target_tpg.h +++ b/drivers/target/iscsi/iscsi_target_tpg.h | |||
@@ -39,5 +39,6 @@ extern int iscsit_ta_prod_mode_write_protect(struct iscsi_portal_group *, u32); | |||
39 | extern int iscsit_ta_demo_mode_discovery(struct iscsi_portal_group *, u32); | 39 | extern int iscsit_ta_demo_mode_discovery(struct iscsi_portal_group *, u32); |
40 | extern int iscsit_ta_default_erl(struct iscsi_portal_group *, u32); | 40 | extern int iscsit_ta_default_erl(struct iscsi_portal_group *, u32); |
41 | extern int iscsit_ta_t10_pi(struct iscsi_portal_group *, u32); | 41 | extern int iscsit_ta_t10_pi(struct iscsi_portal_group *, u32); |
42 | extern int iscsit_ta_fabric_prot_type(struct iscsi_portal_group *, u32); | ||
42 | 43 | ||
43 | #endif /* ISCSI_TARGET_TPG_H */ | 44 | #endif /* ISCSI_TARGET_TPG_H */ |