[PATCH] Stability fixes for IPS driver for 4.x
Scott Long
scottl at samsco.org
Sat Apr 9 08:20:58 PDT 2005
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
-------------- next part --------------
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);
}
More information about the freebsd-stable
mailing list