aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Disseldorp <ddiss@suse.de>2015-08-01 03:10:12 -0400
committerNicholas Bellinger <nab@linux-iscsi.org>2015-08-03 00:59:59 -0400
commita6415cddc4e6e1675a5648e7785aef716980c90c (patch)
tree6cbe042e2625506c896510bac8b480e44ea482dd
parent9d8c94e48a5faafae1e52bec18b8d99211b2ccd4 (diff)
iscsi-target: Add tpg_enabled_sendtargets for disabled discovery
This patch adds a new tpg_enabled_sendtargets configfs attribute to allow in-band sendtargets discovery information to include target-portal-groups (TPGs) in !TPG_STATE_ACTIVE state. This functionality is useful for clustered iSCSI targets, where TPGTs handled on remote cluster nodes should be advertised in the SendTargets response. By default, this new attribute retains the default behaviour of existing code which to ignore portal-groups in !TPG_STATE_ACTIVE state. Signed-off-by: David Disseldorp <ddiss@suse.de> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
-rw-r--r--drivers/target/iscsi/iscsi_target.c10
-rw-r--r--drivers/target/iscsi/iscsi_target_configfs.c6
-rw-r--r--drivers/target/iscsi/iscsi_target_tpg.c19
-rw-r--r--drivers/target/iscsi/iscsi_target_tpg.h1
-rw-r--r--include/target/iscsi/iscsi_target_core.h3
5 files changed, 34 insertions, 5 deletions
diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c
index a4cf58cb835d..986518c3ea12 100644
--- a/drivers/target/iscsi/iscsi_target.c
+++ b/drivers/target/iscsi/iscsi_target.c
@@ -3398,6 +3398,7 @@ iscsit_build_sendtargets_response(struct iscsi_cmd *cmd,
3398 int target_name_printed; 3398 int target_name_printed;
3399 unsigned char buf[ISCSI_IQN_LEN+12]; /* iqn + "TargetName=" + \0 */ 3399 unsigned char buf[ISCSI_IQN_LEN+12]; /* iqn + "TargetName=" + \0 */
3400 unsigned char *text_in = cmd->text_in_ptr, *text_ptr = NULL; 3400 unsigned char *text_in = cmd->text_in_ptr, *text_ptr = NULL;
3401 bool active;
3401 3402
3402 buffer_len = min(conn->conn_ops->MaxRecvDataSegmentLength, 3403 buffer_len = min(conn->conn_ops->MaxRecvDataSegmentLength,
3403 SENDTARGETS_BUF_LIMIT); 3404 SENDTARGETS_BUF_LIMIT);
@@ -3451,13 +3452,12 @@ iscsit_build_sendtargets_response(struct iscsi_cmd *cmd,
3451 } 3452 }
3452 3453
3453 spin_lock(&tpg->tpg_state_lock); 3454 spin_lock(&tpg->tpg_state_lock);
3454 if ((tpg->tpg_state == TPG_STATE_FREE) || 3455 active = (tpg->tpg_state == TPG_STATE_ACTIVE);
3455 (tpg->tpg_state == TPG_STATE_INACTIVE)) {
3456 spin_unlock(&tpg->tpg_state_lock);
3457 continue;
3458 }
3459 spin_unlock(&tpg->tpg_state_lock); 3456 spin_unlock(&tpg->tpg_state_lock);
3460 3457
3458 if (!active && tpg->tpg_attrib.tpg_enabled_sendtargets)
3459 continue;
3460
3461 spin_lock(&tpg->tpg_np_lock); 3461 spin_lock(&tpg->tpg_np_lock);
3462 list_for_each_entry(tpg_np, &tpg->tpg_gnp_list, 3462 list_for_each_entry(tpg_np, &tpg->tpg_gnp_list,
3463 tpg_np_list) { 3463 tpg_np_list) {
diff --git a/drivers/target/iscsi/iscsi_target_configfs.c b/drivers/target/iscsi/iscsi_target_configfs.c
index c1898c84b3d2..05f16640fb9b 100644
--- a/drivers/target/iscsi/iscsi_target_configfs.c
+++ b/drivers/target/iscsi/iscsi_target_configfs.c
@@ -1010,6 +1010,11 @@ TPG_ATTR(t10_pi, S_IRUGO | S_IWUSR);
1010 */ 1010 */
1011DEF_TPG_ATTRIB(fabric_prot_type); 1011DEF_TPG_ATTRIB(fabric_prot_type);
1012TPG_ATTR(fabric_prot_type, S_IRUGO | S_IWUSR); 1012TPG_ATTR(fabric_prot_type, S_IRUGO | S_IWUSR);
1013/*
1014 * Define iscsi_tpg_attrib_s_tpg_enabled_sendtargets
1015 */
1016DEF_TPG_ATTRIB(tpg_enabled_sendtargets);
1017TPG_ATTR(tpg_enabled_sendtargets, S_IRUGO | S_IWUSR);
1013 1018
1014static struct configfs_attribute *lio_target_tpg_attrib_attrs[] = { 1019static struct configfs_attribute *lio_target_tpg_attrib_attrs[] = {
1015 &iscsi_tpg_attrib_authentication.attr, 1020 &iscsi_tpg_attrib_authentication.attr,
@@ -1024,6 +1029,7 @@ static struct configfs_attribute *lio_target_tpg_attrib_attrs[] = {
1024 &iscsi_tpg_attrib_default_erl.attr, 1029 &iscsi_tpg_attrib_default_erl.attr,
1025 &iscsi_tpg_attrib_t10_pi.attr, 1030 &iscsi_tpg_attrib_t10_pi.attr,
1026 &iscsi_tpg_attrib_fabric_prot_type.attr, 1031 &iscsi_tpg_attrib_fabric_prot_type.attr,
1032 &iscsi_tpg_attrib_tpg_enabled_sendtargets.attr,
1027 NULL, 1033 NULL,
1028}; 1034};
1029 1035
diff --git a/drivers/target/iscsi/iscsi_target_tpg.c b/drivers/target/iscsi/iscsi_target_tpg.c
index 968068ffcb1c..8262a853e888 100644
--- a/drivers/target/iscsi/iscsi_target_tpg.c
+++ b/drivers/target/iscsi/iscsi_target_tpg.c
@@ -226,6 +226,7 @@ static void iscsit_set_default_tpg_attribs(struct iscsi_portal_group *tpg)
226 a->default_erl = TA_DEFAULT_ERL; 226 a->default_erl = TA_DEFAULT_ERL;
227 a->t10_pi = TA_DEFAULT_T10_PI; 227 a->t10_pi = TA_DEFAULT_T10_PI;
228 a->fabric_prot_type = TA_DEFAULT_FABRIC_PROT_TYPE; 228 a->fabric_prot_type = TA_DEFAULT_FABRIC_PROT_TYPE;
229 a->tpg_enabled_sendtargets = TA_DEFAULT_TPG_ENABLED_SENDTARGETS;
229} 230}
230 231
231int iscsit_tpg_add_portal_group(struct iscsi_tiqn *tiqn, struct iscsi_portal_group *tpg) 232int iscsit_tpg_add_portal_group(struct iscsi_tiqn *tiqn, struct iscsi_portal_group *tpg)
@@ -892,3 +893,21 @@ int iscsit_ta_fabric_prot_type(
892 893
893 return 0; 894 return 0;
894} 895}
896
897int iscsit_ta_tpg_enabled_sendtargets(
898 struct iscsi_portal_group *tpg,
899 u32 flag)
900{
901 struct iscsi_tpg_attrib *a = &tpg->tpg_attrib;
902
903 if ((flag != 0) && (flag != 1)) {
904 pr_err("Illegal value %d\n", flag);
905 return -EINVAL;
906 }
907
908 a->tpg_enabled_sendtargets = flag;
909 pr_debug("iSCSI_TPG[%hu] - TPG enabled bit required for SendTargets:"
910 " %s\n", tpg->tpgt, (a->tpg_enabled_sendtargets) ? "ON" : "OFF");
911
912 return 0;
913}
diff --git a/drivers/target/iscsi/iscsi_target_tpg.h b/drivers/target/iscsi/iscsi_target_tpg.h
index 95ff5bdecd71..a2790fd8f7da 100644
--- a/drivers/target/iscsi/iscsi_target_tpg.h
+++ b/drivers/target/iscsi/iscsi_target_tpg.h
@@ -40,5 +40,6 @@ extern int iscsit_ta_demo_mode_discovery(struct iscsi_portal_group *, u32);
40extern int iscsit_ta_default_erl(struct iscsi_portal_group *, u32); 40extern int iscsit_ta_default_erl(struct iscsi_portal_group *, u32);
41extern int iscsit_ta_t10_pi(struct iscsi_portal_group *, u32); 41extern int iscsit_ta_t10_pi(struct iscsi_portal_group *, u32);
42extern int iscsit_ta_fabric_prot_type(struct iscsi_portal_group *, u32); 42extern int iscsit_ta_fabric_prot_type(struct iscsi_portal_group *, u32);
43extern int iscsit_ta_tpg_enabled_sendtargets(struct iscsi_portal_group *, u32);
43 44
44#endif /* ISCSI_TARGET_TPG_H */ 45#endif /* ISCSI_TARGET_TPG_H */
diff --git a/include/target/iscsi/iscsi_target_core.h b/include/target/iscsi/iscsi_target_core.h
index 34117b8b72e4..ab465858f462 100644
--- a/include/target/iscsi/iscsi_target_core.h
+++ b/include/target/iscsi/iscsi_target_core.h
@@ -62,6 +62,8 @@
62/* T10 protection information disabled by default */ 62/* T10 protection information disabled by default */
63#define TA_DEFAULT_T10_PI 0 63#define TA_DEFAULT_T10_PI 0
64#define TA_DEFAULT_FABRIC_PROT_TYPE 0 64#define TA_DEFAULT_FABRIC_PROT_TYPE 0
65/* TPG status needs to be enabled to return sendtargets discovery endpoint info */
66#define TA_DEFAULT_TPG_ENABLED_SENDTARGETS 1
65 67
66#define ISCSI_IOV_DATA_BUFFER 5 68#define ISCSI_IOV_DATA_BUFFER 5
67 69
@@ -763,6 +765,7 @@ struct iscsi_tpg_attrib {
763 u32 default_erl; 765 u32 default_erl;
764 u8 t10_pi; 766 u8 t10_pi;
765 u32 fabric_prot_type; 767 u32 fabric_prot_type;
768 u32 tpg_enabled_sendtargets;
766 struct iscsi_portal_group *tpg; 769 struct iscsi_portal_group *tpg;
767}; 770};
768 771