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",