Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2dd1d53f authored by Thomas Glanzmann's avatar Thomas Glanzmann Committed by Nicholas Bellinger
Browse files

iscsi-target: Implement demo_mode_discovery logic



If demo_mode_discovery=0 and generate_node_acls=0 (demo mode dislabed) do
not return TargetName+TargetAddress unless a NodeACL exists.

Signed-off-by: default avatarThomas Glanzmann <thomas@glanzmann.de>
Signed-off-by: default avatarNicholas Bellinger <nab@linux-iscsi.org>
parent b3fde035
Loading
Loading
Loading
Loading
+30 −9
Original line number Original line Diff line number Diff line
@@ -3369,6 +3369,7 @@ static int iscsit_build_sendtargets_response(struct iscsi_cmd *cmd)
	struct iscsi_tiqn *tiqn;
	struct iscsi_tiqn *tiqn;
	struct iscsi_tpg_np *tpg_np;
	struct iscsi_tpg_np *tpg_np;
	int buffer_len, end_of_buf = 0, len = 0, payload_len = 0;
	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 buf[ISCSI_IQN_LEN+12]; /* iqn + "TargetName=" + \0 */
	unsigned char *text_in = cmd->text_in_ptr, *text_ptr = NULL;
	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;
			continue;
		}
		}


		len = sprintf(buf, "TargetName=%s", tiqn->tiqn);
		target_name_printed = 0;
		len += 1;

		if ((len + payload_len) > buffer_len) {
			end_of_buf = 1;
			goto eob;
		}
		memcpy(payload + payload_len, buf, len);
		payload_len += len;


		spin_lock(&tiqn->tiqn_tpg_lock);
		spin_lock(&tiqn->tiqn_tpg_lock);
		list_for_each_entry(tpg, &tiqn->tiqn_tpg_list, tpg_list) {
		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);
			spin_lock(&tpg->tpg_state_lock);
			if ((tpg->tpg_state == TPG_STATE_FREE) ||
			if ((tpg->tpg_state == TPG_STATE_FREE) ||
			    (tpg->tpg_state == TPG_STATE_INACTIVE)) {
			    (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;
				struct iscsi_np *np = tpg_np->tpg_np;
				bool inaddr_any = iscsit_check_inaddr_any(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="
				len = sprintf(buf, "TargetAddress="
					"%s:%hu,%hu",
					"%s:%hu,%hu",
					(inaddr_any == false) ?
					(inaddr_any == false) ?