Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 09 Apr 2005 09:17:32 -0600
From:      Scott Long <scottl@samsco.org>
To:        Anthony Downer <Anthony.Downer@reuters.com>, dsze@alumni.uwaterloo.ca
Cc:        mb@imp.ch
Subject:   [PATCH] Stability fixes for IPS driver for 4.x
Message-ID:  <4257F20C.70004@samsco.org>

next in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------070707060207040002010207
Content-Type: text/plain; charset=us-ascii; format=flowed
Content-Transfer-Encoding: 7bit

All,

Thanks to the keen eye of David Sze, the cause of the instability in the 
ips driver in FreeBSD 4.x might have been found.  If it's affecting you,
please try the attached patch and let me know the results.  I'll commit 
it when everyone is happy with it.

Thanks,

Scott

--------------070707060207040002010207
Content-Type: text/plain;
 name="ips-4.x-crash.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="ips-4.x-crash.diff"

Index: ips_commands.c
===================================================================
RCS file: /usr/ncvs/src/sys/dev/ips/ips_commands.c,v
retrieving revision 1.11.6.1
diff -u -r1.11.6.1 ips_commands.c
--- ips_commands.c	13 Jan 2005 00:46:40 -0000	1.11.6.1
+++ ips_commands.c	9 Apr 2005 15:09:50 -0000
@@ -162,8 +162,11 @@
 void ips_start_io_request(ips_softc_t *sc)
 {
 	struct buf *iobuf;
+	int s
 
+	s = splbio();
 	iobuf = bufq_first(&sc->queue);
+	splx(s);
 	if(!iobuf) {
 		return;
 	}
@@ -171,8 +174,10 @@
 	if(ips_get_free_cmd(sc, ips_send_io_request, iobuf, IPS_NOWAIT_FLAG)){
 		return;
 	}
-	
+
+	s = splbio();
 	bufq_remove(&sc->queue, iobuf);
+	splx(s);
 	return;
 }
 
Index: ips_disk.c
===================================================================
RCS file: /usr/ncvs/src/sys/dev/ips/ips_disk.c,v
retrieving revision 1.6.6.1
diff -u -r1.6.6.1 ips_disk.c
--- ips_disk.c	13 Jan 2005 00:46:40 -0000	1.6.6.1
+++ ips_disk.c	9 Apr 2005 15:07:50 -0000
@@ -128,12 +128,15 @@
 static void ipsd_strategy(struct buf *iobuf)
 {
 	ipsdisk_softc_t *dsc;
+	int s;
 
 	dsc = iobuf->b_dev->si_drv1;	
 	DEVICE_PRINTF(8,dsc->dev,"in strategy\n");
 	devstat_start_transaction(&dsc->stats);
 	iobuf->b_driver1 = (void *)(uintptr_t)dsc->sc->drives[dsc->disk_number].drivenum;
-	bufqdisksort(&dsc->sc->queue, iobuf);
+	s = splbio();
+	bufq_insert_tail(&dsc->sc->queue, iobuf);
+	splx(s);
 	ips_start_io_request(dsc->sc);
 }
 

--------------070707060207040002010207--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4257F20C.70004>