|
@@ -3369,6 +3369,7 @@ static int iscsit_build_sendtargets_response(struct iscsi_cmd *cmd)
|
|
|
struct iscsi_tiqn *tiqn;
|
|
|
struct iscsi_tpg_np *tpg_np;
|
|
|
int buffer_len, end_of_buf = 0, len = 0, payload_len = 0;
|
|
|
+ int target_name_printed;
|
|
|
unsigned char buf[ISCSI_IQN_LEN+12]; /* iqn + "TargetName=" + \0 */
|
|
|
unsigned char *text_in = cmd->text_in_ptr, *text_ptr = NULL;
|
|
|
|
|
@@ -3406,19 +3407,23 @@ static int iscsit_build_sendtargets_response(struct iscsi_cmd *cmd)
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- len = sprintf(buf, "TargetName=%s", tiqn->tiqn);
|
|
|
- len += 1;
|
|
|
-
|
|
|
- if ((len + payload_len) > buffer_len) {
|
|
|
- end_of_buf = 1;
|
|
|
- goto eob;
|
|
|
- }
|
|
|
- memcpy(payload + payload_len, buf, len);
|
|
|
- payload_len += len;
|
|
|
+ target_name_printed = 0;
|
|
|
|
|
|
spin_lock(&tiqn->tiqn_tpg_lock);
|
|
|
list_for_each_entry(tpg, &tiqn->tiqn_tpg_list, tpg_list) {
|
|
|
|
|
|
+ /* If demo_mode_discovery=0 and generate_node_acls=0
|
|
|
+ * (demo mode dislabed) do not return
|
|
|
+ * TargetName+TargetAddress unless a NodeACL exists.
|
|
|
+ */
|
|
|
+
|
|
|
+ if ((tpg->tpg_attrib.generate_node_acls == 0) &&
|
|
|
+ (tpg->tpg_attrib.demo_mode_discovery == 0) &&
|
|
|
+ (!core_tpg_get_initiator_node_acl(&tpg->tpg_se_tpg,
|
|
|
+ cmd->conn->sess->sess_ops->InitiatorName))) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
spin_lock(&tpg->tpg_state_lock);
|
|
|
if ((tpg->tpg_state == TPG_STATE_FREE) ||
|
|
|
(tpg->tpg_state == TPG_STATE_INACTIVE)) {
|
|
@@ -3433,6 +3438,22 @@ static int iscsit_build_sendtargets_response(struct iscsi_cmd *cmd)
|
|
|
struct iscsi_np *np = tpg_np->tpg_np;
|
|
|
bool inaddr_any = iscsit_check_inaddr_any(np);
|
|
|
|
|
|
+ if (!target_name_printed) {
|
|
|
+ len = sprintf(buf, "TargetName=%s",
|
|
|
+ tiqn->tiqn);
|
|
|
+ len += 1;
|
|
|
+
|
|
|
+ if ((len + payload_len) > buffer_len) {
|
|
|
+ spin_unlock(&tpg->tpg_np_lock);
|
|
|
+ spin_unlock(&tiqn->tiqn_tpg_lock);
|
|
|
+ end_of_buf = 1;
|
|
|
+ goto eob;
|
|
|
+ }
|
|
|
+ memcpy(payload + payload_len, buf, len);
|
|
|
+ payload_len += len;
|
|
|
+ target_name_printed = 1;
|
|
|
+ }
|
|
|
+
|
|
|
len = sprintf(buf, "TargetAddress="
|
|
|
"%s:%hu,%hu",
|
|
|
(inaddr_any == false) ?
|