diff options
Diffstat (limited to 'drivers/target/iscsi/iscsi_target_configfs.c')
| -rw-r--r-- | drivers/target/iscsi/iscsi_target_configfs.c | 98 | 
1 files changed, 94 insertions, 4 deletions
diff --git a/drivers/target/iscsi/iscsi_target_configfs.c b/drivers/target/iscsi/iscsi_target_configfs.c index 78d75c8567d..13e9e715ad2 100644 --- a/drivers/target/iscsi/iscsi_target_configfs.c +++ b/drivers/target/iscsi/iscsi_target_configfs.c @@ -27,6 +27,7 @@  #include <target/target_core_fabric_configfs.h>  #include <target/target_core_configfs.h>  #include <target/configfs_macros.h> +#include <target/iscsi/iscsi_transport.h>  #include "iscsi_target_core.h"  #include "iscsi_target_parameters.h" @@ -124,8 +125,87 @@ out:  TF_NP_BASE_ATTR(lio_target, sctp, S_IRUGO | S_IWUSR); +static ssize_t lio_target_np_show_iser( +	struct se_tpg_np *se_tpg_np, +	char *page) +{ +	struct iscsi_tpg_np *tpg_np = container_of(se_tpg_np, +				struct iscsi_tpg_np, se_tpg_np); +	struct iscsi_tpg_np *tpg_np_iser; +	ssize_t rb; + +	tpg_np_iser = iscsit_tpg_locate_child_np(tpg_np, ISCSI_INFINIBAND); +	if (tpg_np_iser) +		rb = sprintf(page, "1\n"); +	else +		rb = sprintf(page, "0\n"); + +	return rb; +} + +static ssize_t lio_target_np_store_iser( +	struct se_tpg_np *se_tpg_np, +	const char *page, +	size_t count) +{ +	struct iscsi_np *np; +	struct iscsi_portal_group *tpg; +	struct iscsi_tpg_np *tpg_np = container_of(se_tpg_np, +				struct iscsi_tpg_np, se_tpg_np); +	struct iscsi_tpg_np *tpg_np_iser = NULL; +	char *endptr; +	u32 op; +	int rc; + +	op = simple_strtoul(page, &endptr, 0); +	if ((op != 1) && (op != 0)) { +		pr_err("Illegal value for tpg_enable: %u\n", op); +		return -EINVAL; +	} +	np = tpg_np->tpg_np; +	if (!np) { +		pr_err("Unable to locate struct iscsi_np from" +				" struct iscsi_tpg_np\n"); +		return -EINVAL; +	} + +	tpg = tpg_np->tpg; +	if (iscsit_get_tpg(tpg) < 0) +		return -EINVAL; + +	if (op) { +		int rc = request_module("ib_isert"); +		if (rc != 0) +			pr_warn("Unable to request_module for ib_isert\n"); + +		tpg_np_iser = iscsit_tpg_add_network_portal(tpg, &np->np_sockaddr, +				np->np_ip, tpg_np, ISCSI_INFINIBAND); +		if (!tpg_np_iser || IS_ERR(tpg_np_iser)) +			goto out; +	} else { +		tpg_np_iser = iscsit_tpg_locate_child_np(tpg_np, ISCSI_INFINIBAND); +		if (!tpg_np_iser) +			goto out; + +		rc = iscsit_tpg_del_network_portal(tpg, tpg_np_iser); +		if (rc < 0) +			goto out; +	} + +	printk("lio_target_np_store_iser() done, op: %d\n", op); + +	iscsit_put_tpg(tpg); +	return count; +out: +	iscsit_put_tpg(tpg); +	return -EINVAL; +} + +TF_NP_BASE_ATTR(lio_target, iser, S_IRUGO | S_IWUSR); +  static struct configfs_attribute *lio_target_portal_attrs[] = {  	&lio_target_np_sctp.attr, +	&lio_target_np_iser.attr,  	NULL,  }; @@ -1536,16 +1616,18 @@ static int lio_queue_data_in(struct se_cmd *se_cmd)  	struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd);  	cmd->i_state = ISTATE_SEND_DATAIN; -	iscsit_add_cmd_to_response_queue(cmd, cmd->conn, cmd->i_state); +	cmd->conn->conn_transport->iscsit_queue_data_in(cmd->conn, cmd); +  	return 0;  }  static int lio_write_pending(struct se_cmd *se_cmd)  {  	struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd); +	struct iscsi_conn *conn = cmd->conn;  	if (!cmd->immediate_data && !cmd->unsolicited_data) -		return iscsit_build_r2ts_for_cmd(cmd, cmd->conn, false); +		return conn->conn_transport->iscsit_get_dataout(conn, cmd, false);  	return 0;  } @@ -1567,7 +1649,8 @@ static int lio_queue_status(struct se_cmd *se_cmd)  	struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd);  	cmd->i_state = ISTATE_SEND_STATUS; -	iscsit_add_cmd_to_response_queue(cmd, cmd->conn, cmd->i_state); +	cmd->conn->conn_transport->iscsit_queue_status(cmd->conn, cmd); +  	return 0;  } @@ -1696,11 +1779,17 @@ static void lio_set_default_node_attributes(struct se_node_acl *se_acl)  	iscsit_set_default_node_attribues(acl);  } +static int lio_check_stop_free(struct se_cmd *se_cmd) +{ +	return target_put_sess_cmd(se_cmd->se_sess, se_cmd); +} +  static void lio_release_cmd(struct se_cmd *se_cmd)  {  	struct iscsi_cmd *cmd = container_of(se_cmd, struct iscsi_cmd, se_cmd); -	iscsit_release_cmd(cmd); +	pr_debug("Entering lio_release_cmd for se_cmd: %p\n", se_cmd); +	cmd->release_cmd(cmd);  }  /* End functions for target_core_fabric_ops */ @@ -1740,6 +1829,7 @@ int iscsi_target_register_configfs(void)  	fabric->tf_ops.tpg_alloc_fabric_acl = &lio_tpg_alloc_fabric_acl;  	fabric->tf_ops.tpg_release_fabric_acl = &lio_tpg_release_fabric_acl;  	fabric->tf_ops.tpg_get_inst_index = &lio_tpg_get_inst_index; +	fabric->tf_ops.check_stop_free = &lio_check_stop_free,  	fabric->tf_ops.release_cmd = &lio_release_cmd;  	fabric->tf_ops.shutdown_session = &lio_tpg_shutdown_session;  	fabric->tf_ops.close_session = &lio_tpg_close_session;  |