svn commit: r255824 - in head/sys: cam/ctl dev/iscsi

Edward Tomasz Napierala trasz at FreeBSD.org
Mon Sep 23 19:54:45 UTC 2013


Author: trasz
Date: Mon Sep 23 19:54:44 2013
New Revision: 255824
URL: http://svnweb.freebsd.org/changeset/base/255824

Log:
  Don't use M_WAITOK when running from context where sleeping is prohibited,
  such as callout or a geom thread.
  
  Approved by:	re (marius)
  Sponsored by:	FreeBSD Foundation

Modified:
  head/sys/cam/ctl/ctl_frontend_iscsi.c
  head/sys/dev/iscsi/iscsi.c

Modified: head/sys/cam/ctl/ctl_frontend_iscsi.c
==============================================================================
--- head/sys/cam/ctl/ctl_frontend_iscsi.c	Mon Sep 23 18:53:48 2013	(r255823)
+++ head/sys/cam/ctl/ctl_frontend_iscsi.c	Mon Sep 23 19:54:44 2013	(r255824)
@@ -930,7 +930,11 @@ cfiscsi_callout(void *context)
 	if (cs->cs_timeout < 2)
 		return;
 
-	cp = icl_pdu_new_bhs(cs->cs_conn, M_WAITOK);
+	cp = icl_pdu_new_bhs(cs->cs_conn, M_NOWAIT);
+	if (cp == NULL) {
+		CFISCSI_SESSION_WARN(cs, "failed to allocate PDU");
+		return;
+	}
 	bhsni = (struct iscsi_bhs_nop_in *)cp->ip_bhs;
 	bhsni->bhsni_opcode = ISCSI_BHS_OPCODE_NOP_IN;
 	bhsni->bhsni_flags = 0x80;
@@ -2245,7 +2249,7 @@ cfiscsi_datamove(union ctl_io *io)
 	struct ctl_sg_entry ctl_sg_entry, *ctl_sglist;
 	size_t copy_len, len, off;
 	const char *addr;
-	int ctl_sg_count, i;
+	int ctl_sg_count, error, i;
 	uint32_t target_transfer_tag;
 	bool done;
 
@@ -2298,7 +2302,13 @@ cfiscsi_datamove(union ctl_io *io)
 			KASSERT(i < ctl_sg_count, ("i >= ctl_sg_count"));
 			if (response == NULL) {
 				response =
-				    cfiscsi_pdu_new_response(request, M_WAITOK);
+				    cfiscsi_pdu_new_response(request, M_NOWAIT);
+				if (response == NULL) {
+					CFISCSI_SESSION_WARN(cs, "failed to "
+					    "allocate memory; dropping connection");
+					cfiscsi_session_terminate(cs);
+					return;
+				}
 				bhsdi = (struct iscsi_bhs_data_in *)
 				    response->ip_bhs;
 				bhsdi->bhsdi_opcode =
@@ -2323,7 +2333,14 @@ cfiscsi_datamove(union ctl_io *io)
 				copy_len = cs->cs_max_data_segment_length -
 				    response->ip_data_len;
 			KASSERT(copy_len <= len, ("copy_len > len"));
-			icl_pdu_append_data(response, addr, copy_len, M_WAITOK);
+			error = icl_pdu_append_data(response, addr, copy_len, M_NOWAIT);
+			if (error != 0) {
+				CFISCSI_SESSION_WARN(cs, "failed to "
+				    "allocate memory; dropping connection");
+				icl_pdu_free(response);
+				cfiscsi_session_terminate(cs);
+				return;
+			}
 			addr += copy_len;
 			len -= copy_len;
 			off += copy_len;

Modified: head/sys/dev/iscsi/iscsi.c
==============================================================================
--- head/sys/dev/iscsi/iscsi.c	Mon Sep 23 18:53:48 2013	(r255823)
+++ head/sys/dev/iscsi/iscsi.c	Mon Sep 23 19:54:44 2013	(r255824)
@@ -558,7 +558,11 @@ iscsi_callout(void *context)
 	if (is->is_timeout < 2)
 		return;
 
-	request = icl_pdu_new_bhs(is->is_conn, M_WAITOK);
+	request = icl_pdu_new_bhs(is->is_conn, M_NOWAIT);
+	if (request == NULL) {
+		ISCSI_SESSION_WARN(is, "failed to allocate PDU");
+		return;
+	}
 	bhsno = (struct iscsi_bhs_nop_out *)request->ip_bhs;
 	bhsno->bhsno_opcode = ISCSI_BHS_OPCODE_NOP_OUT |
 	    ISCSI_BHS_OPCODE_IMMEDIATE;


More information about the svn-src-all mailing list