diff options
Diffstat (limited to 'drivers/scsi/libiscsi_tcp.c')
| -rw-r--r-- | drivers/scsi/libiscsi_tcp.c | 22 | 
1 files changed, 20 insertions, 2 deletions
| diff --git a/drivers/scsi/libiscsi_tcp.c b/drivers/scsi/libiscsi_tcp.c index 5715a3d0a3d3..552e8a2b6f5f 100644 --- a/drivers/scsi/libiscsi_tcp.c +++ b/drivers/scsi/libiscsi_tcp.c @@ -135,7 +135,7 @@ static void iscsi_tcp_segment_map(struct iscsi_segment *segment, int recv)  	if (recv) {  		segment->atomic_mapped = true; -		segment->sg_mapped = kmap_atomic(sg_page(sg), KM_SOFTIRQ0); +		segment->sg_mapped = kmap_atomic(sg_page(sg));  	} else {  		segment->atomic_mapped = false;  		/* the xmit path can sleep with the page mapped so use kmap */ @@ -149,7 +149,7 @@ void iscsi_tcp_segment_unmap(struct iscsi_segment *segment)  {  	if (segment->sg_mapped) {  		if (segment->atomic_mapped) -			kunmap_atomic(segment->sg_mapped, KM_SOFTIRQ0); +			kunmap_atomic(segment->sg_mapped);  		else  			kunmap(sg_page(segment->sg));  		segment->sg_mapped = NULL; @@ -1170,6 +1170,24 @@ void iscsi_tcp_r2tpool_free(struct iscsi_session *session)  }  EXPORT_SYMBOL_GPL(iscsi_tcp_r2tpool_free); +int iscsi_tcp_set_max_r2t(struct iscsi_conn *conn, char *buf) +{ +	struct iscsi_session *session = conn->session; +	unsigned short r2ts = 0; + +	sscanf(buf, "%hu", &r2ts); +	if (session->max_r2t == r2ts) +		return 0; + +	if (!r2ts || !is_power_of_2(r2ts)) +		return -EINVAL; + +	session->max_r2t = r2ts; +	iscsi_tcp_r2tpool_free(session); +	return iscsi_tcp_r2tpool_alloc(session); +} +EXPORT_SYMBOL_GPL(iscsi_tcp_set_max_r2t); +  void iscsi_tcp_conn_get_stats(struct iscsi_cls_conn *cls_conn,  			      struct iscsi_stats *stats)  { | 
