Module Name:    src
Committed By:   mhitch
Date:           Tue Jun  5 16:36:07 UTC 2012

Modified Files:
        src/sys/dev/iscsi: iscsi_rcv.c iscsi_send.c

Log Message:
Fix system freeze when trying to write to a raw iSCSI device with MAXPHYS
bytes.  Newfs does large writes when initializing the filesystem.
First, don't copy the head of a TAILQ to make a copy - the first entry will
still point back to the original head.  This caused the ccb list to link to
itself, resulting in a continous loop processing the same ccb and blocked
interrupts.  Use TAILQ_CONCAT() to copy the list.
Next, the ccb disposition was not set in the ccb when the ccb was throttled,
losing the CCBDISP_SCSIPI, so when a throttled ccb was resent, it failed to
call scscipi_done(), and left that I/O hanging.
I am now able to newfs an iSCSI device, was well as issued large writes
using dd.


To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/sys/dev/iscsi/iscsi_rcv.c \
    src/sys/dev/iscsi/iscsi_send.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/iscsi/iscsi_rcv.c
diff -u src/sys/dev/iscsi/iscsi_rcv.c:1.1 src/sys/dev/iscsi/iscsi_rcv.c:1.2
--- src/sys/dev/iscsi/iscsi_rcv.c:1.1	Sun Oct 23 21:15:02 2011
+++ src/sys/dev/iscsi/iscsi_rcv.c	Tue Jun  5 16:36:06 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: iscsi_rcv.c,v 1.1 2011/10/23 21:15:02 agc Exp $	*/
+/*	$NetBSD: iscsi_rcv.c,v 1.2 2012/06/05 16:36:06 mhitch Exp $	*/
 
 /*-
  * Copyright (c) 2004,2005,2006,2011 The NetBSD Foundation, Inc.
@@ -1138,8 +1138,8 @@ receive_pdu(connection_t *conn, pdu_t *p
 		DEBC(conn, 1, ("Unthrottling - MaxCmdSN = %d\n", MaxCmdSN));
 
 		CS_BEGIN;
-		waiting = sess->ccbs_throttled;
-		TAILQ_INIT(&sess->ccbs_throttled);
+		TAILQ_INIT(&waiting);
+		TAILQ_CONCAT(&waiting, &sess->ccbs_throttled, chain);
 		CS_END;
 		while ((req_ccb = TAILQ_FIRST(&waiting)) != NULL) {
 			TAILQ_REMOVE(&waiting, req_ccb, chain);
Index: src/sys/dev/iscsi/iscsi_send.c
diff -u src/sys/dev/iscsi/iscsi_send.c:1.1 src/sys/dev/iscsi/iscsi_send.c:1.2
--- src/sys/dev/iscsi/iscsi_send.c:1.1	Sun Oct 23 21:15:02 2011
+++ src/sys/dev/iscsi/iscsi_send.c	Tue Jun  5 16:36:07 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: iscsi_send.c,v 1.1 2011/10/23 21:15:02 agc Exp $	*/
+/*	$NetBSD: iscsi_send.c,v 1.2 2012/06/05 16:36:07 mhitch Exp $	*/
 
 /*-
  * Copyright (c) 2004,2005,2006,2011 The NetBSD Foundation, Inc.
@@ -1345,6 +1345,7 @@ send_command(ccb_t *ccb, ccb_disp_t disp
 		if (/*CONSTCOND*/ISCSI_TROTTLING_ENABLED &&
 		    /*CONSTCOND*/ISCSI_SERVER_TRUSTED &&
 		    !sn_a_le_b(sess->CmdSN, sess->MaxCmdSN)) {
+			ccb->disp = disp;
 			TAILQ_INSERT_TAIL(&sess->ccbs_throttled, ccb, chain);
 			splx(s);
 			PDEBOUT(("Throttling S - CmdSN = %d, MaxCmdSN = %d\n",
@@ -1363,6 +1364,7 @@ send_command(ccb_t *ccb, ccb_disp_t disp
 		while (/*CONSTCOND*/ISCSI_TROTTLING_ENABLED &&
 		       /*CONSTCOND*/ISCSI_SERVER_TRUSTED &&
 		       !sn_a_le_b(sess->CmdSN, sess->MaxCmdSN)) {
+			ccb->disp = disp;
 			ccb->flags |= CCBF_WAITING;
 			TAILQ_INSERT_TAIL(&sess->ccbs_throttled, ccb, chain);
 			PDEBOUT(("Throttling W - CmdSN = %d, MaxCmdSN = %d\n",

Reply via email to