diff options
| author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2006-07-05 13:13:03 -0400 | 
|---|---|---|
| committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2006-07-05 13:13:03 -0400 | 
| commit | 5e66dd6d66ffe758b39b6dcadf2330753ee1159b (patch) | |
| tree | a72cdcff4448e4af9425cc213ddf56ab23e697fe /drivers/scsi/libiscsi.c | |
| parent | 026477c1141b67e98e3bd8bdedb7d4b88a3ecd09 (diff) | |
| parent | ca78f6baca863afe2e6a244a0fe94b3a70211d46 (diff) | |
Merge branch 'master' of /home/trondmy/kernel/linux-2.6/
Diffstat (limited to 'drivers/scsi/libiscsi.c')
| -rw-r--r-- | drivers/scsi/libiscsi.c | 187 | 
1 files changed, 186 insertions, 1 deletions
| diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c index 2673a11a9495..7e6e031cc41b 100644 --- a/drivers/scsi/libiscsi.c +++ b/drivers/scsi/libiscsi.c @@ -1287,13 +1287,18 @@ iscsi_session_setup(struct iscsi_transport *iscsit,  	if (scsi_add_host(shost, NULL))  		goto add_host_fail; +	if (!try_module_get(iscsit->owner)) +		goto cls_session_fail; +  	cls_session = iscsi_create_session(shost, iscsit, 0);  	if (!cls_session) -		goto cls_session_fail; +		goto module_put;  	*(unsigned long*)shost->hostdata = (unsigned long)cls_session;  	return cls_session; +module_put: +	module_put(iscsit->owner);  cls_session_fail:  	scsi_remove_host(shost);  add_host_fail: @@ -1325,6 +1330,7 @@ void iscsi_session_teardown(struct iscsi_cls_session *cls_session)  	iscsi_destroy_session(cls_session);  	scsi_host_put(shost); +	module_put(cls_session->transport->owner);  }  EXPORT_SYMBOL_GPL(iscsi_session_teardown); @@ -1697,6 +1703,185 @@ int iscsi_conn_bind(struct iscsi_cls_session *cls_session,  }  EXPORT_SYMBOL_GPL(iscsi_conn_bind); + +int iscsi_set_param(struct iscsi_cls_conn *cls_conn, +		    enum iscsi_param param, char *buf, int buflen) +{ +	struct iscsi_conn *conn = cls_conn->dd_data; +	struct iscsi_session *session = conn->session; +	uint32_t value; + +	switch(param) { +	case ISCSI_PARAM_MAX_RECV_DLENGTH: +		sscanf(buf, "%d", &conn->max_recv_dlength); +		break; +	case ISCSI_PARAM_MAX_XMIT_DLENGTH: +		sscanf(buf, "%d", &conn->max_xmit_dlength); +		break; +	case ISCSI_PARAM_HDRDGST_EN: +		sscanf(buf, "%d", &conn->hdrdgst_en); +		break; +	case ISCSI_PARAM_DATADGST_EN: +		sscanf(buf, "%d", &conn->datadgst_en); +		break; +	case ISCSI_PARAM_INITIAL_R2T_EN: +		sscanf(buf, "%d", &session->initial_r2t_en); +		break; +	case ISCSI_PARAM_MAX_R2T: +		sscanf(buf, "%d", &session->max_r2t); +		break; +	case ISCSI_PARAM_IMM_DATA_EN: +		sscanf(buf, "%d", &session->imm_data_en); +		break; +	case ISCSI_PARAM_FIRST_BURST: +		sscanf(buf, "%d", &session->first_burst); +		break; +	case ISCSI_PARAM_MAX_BURST: +		sscanf(buf, "%d", &session->max_burst); +		break; +	case ISCSI_PARAM_PDU_INORDER_EN: +		sscanf(buf, "%d", &session->pdu_inorder_en); +		break; +	case ISCSI_PARAM_DATASEQ_INORDER_EN: +		sscanf(buf, "%d", &session->dataseq_inorder_en); +		break; +	case ISCSI_PARAM_ERL: +		sscanf(buf, "%d", &session->erl); +		break; +	case ISCSI_PARAM_IFMARKER_EN: +		sscanf(buf, "%d", &value); +		BUG_ON(value); +		break; +	case ISCSI_PARAM_OFMARKER_EN: +		sscanf(buf, "%d", &value); +		BUG_ON(value); +		break; +	case ISCSI_PARAM_EXP_STATSN: +		sscanf(buf, "%u", &conn->exp_statsn); +		break; +	case ISCSI_PARAM_TARGET_NAME: +		/* this should not change between logins */ +		if (session->targetname) +			break; + +		session->targetname = kstrdup(buf, GFP_KERNEL); +		if (!session->targetname) +			return -ENOMEM; +		break; +	case ISCSI_PARAM_TPGT: +		sscanf(buf, "%d", &session->tpgt); +		break; +	case ISCSI_PARAM_PERSISTENT_PORT: +		sscanf(buf, "%d", &conn->persistent_port); +		break; +	case ISCSI_PARAM_PERSISTENT_ADDRESS: +		/* +		 * this is the address returned in discovery so it should +		 * not change between logins. +		 */ +		if (conn->persistent_address) +			break; + +		conn->persistent_address = kstrdup(buf, GFP_KERNEL); +		if (!conn->persistent_address) +			return -ENOMEM; +		break; +	default: +		return -ENOSYS; +	} + +	return 0; +} +EXPORT_SYMBOL_GPL(iscsi_set_param); + +int iscsi_session_get_param(struct iscsi_cls_session *cls_session, +			    enum iscsi_param param, char *buf) +{ +	struct Scsi_Host *shost = iscsi_session_to_shost(cls_session); +	struct iscsi_session *session = iscsi_hostdata(shost->hostdata); +	int len; + +	switch(param) { +	case ISCSI_PARAM_INITIAL_R2T_EN: +		len = sprintf(buf, "%d\n", session->initial_r2t_en); +		break; +	case ISCSI_PARAM_MAX_R2T: +		len = sprintf(buf, "%hu\n", session->max_r2t); +		break; +	case ISCSI_PARAM_IMM_DATA_EN: +		len = sprintf(buf, "%d\n", session->imm_data_en); +		break; +	case ISCSI_PARAM_FIRST_BURST: +		len = sprintf(buf, "%u\n", session->first_burst); +		break; +	case ISCSI_PARAM_MAX_BURST: +		len = sprintf(buf, "%u\n", session->max_burst); +		break; +	case ISCSI_PARAM_PDU_INORDER_EN: +		len = sprintf(buf, "%d\n", session->pdu_inorder_en); +		break; +	case ISCSI_PARAM_DATASEQ_INORDER_EN: +		len = sprintf(buf, "%d\n", session->dataseq_inorder_en); +		break; +	case ISCSI_PARAM_ERL: +		len = sprintf(buf, "%d\n", session->erl); +		break; +	case ISCSI_PARAM_TARGET_NAME: +		len = sprintf(buf, "%s\n", session->targetname); +		break; +	case ISCSI_PARAM_TPGT: +		len = sprintf(buf, "%d\n", session->tpgt); +		break; +	default: +		return -ENOSYS; +	} + +	return len; +} +EXPORT_SYMBOL_GPL(iscsi_session_get_param); + +int iscsi_conn_get_param(struct iscsi_cls_conn *cls_conn, +			 enum iscsi_param param, char *buf) +{ +	struct iscsi_conn *conn = cls_conn->dd_data; +	int len; + +	switch(param) { +	case ISCSI_PARAM_MAX_RECV_DLENGTH: +		len = sprintf(buf, "%u\n", conn->max_recv_dlength); +		break; +	case ISCSI_PARAM_MAX_XMIT_DLENGTH: +		len = sprintf(buf, "%u\n", conn->max_xmit_dlength); +		break; +	case ISCSI_PARAM_HDRDGST_EN: +		len = sprintf(buf, "%d\n", conn->hdrdgst_en); +		break; +	case ISCSI_PARAM_DATADGST_EN: +		len = sprintf(buf, "%d\n", conn->datadgst_en); +		break; +	case ISCSI_PARAM_IFMARKER_EN: +		len = sprintf(buf, "%d\n", conn->ifmarker_en); +		break; +	case ISCSI_PARAM_OFMARKER_EN: +		len = sprintf(buf, "%d\n", conn->ofmarker_en); +		break; +	case ISCSI_PARAM_EXP_STATSN: +		len = sprintf(buf, "%u\n", conn->exp_statsn); +		break; +	case ISCSI_PARAM_PERSISTENT_PORT: +		len = sprintf(buf, "%d\n", conn->persistent_port); +		break; +	case ISCSI_PARAM_PERSISTENT_ADDRESS: +		len = sprintf(buf, "%s\n", conn->persistent_address); +		break; +	default: +		return -ENOSYS; +	} + +	return len; +} +EXPORT_SYMBOL_GPL(iscsi_conn_get_param); +  MODULE_AUTHOR("Mike Christie");  MODULE_DESCRIPTION("iSCSI library functions");  MODULE_LICENSE("GPL"); | 
