diff options
author | simokawa <simokawa@FreeBSD.org> | 2003-01-14 08:35:45 +0000 |
---|---|---|
committer | simokawa <simokawa@FreeBSD.org> | 2003-01-14 08:35:45 +0000 |
commit | d92ba29c91c2bf4808c57fde67d9d1b7cd28f035 (patch) | |
tree | 9a2426016fde8caee4b622fa39c835ffe85e9484 /sys | |
parent | da4176c74db511679fd4279ddc04248462ab33d1 (diff) | |
download | FreeBSD-src-d92ba29c91c2bf4808c57fde67d9d1b7cd28f035.zip FreeBSD-src-d92ba29c91c2bf4808c57fde67d9d1b7cd28f035.tar.gz |
Fix for FreeBSD-4.
- Protect whole fw_tbuf_update() with splfw().
Diffstat (limited to 'sys')
-rw-r--r-- | sys/dev/firewire/firewire.c | 19 |
1 files changed, 4 insertions, 15 deletions
diff --git a/sys/dev/firewire/firewire.c b/sys/dev/firewire/firewire.c index ec67f71..e608de6 100644 --- a/sys/dev/firewire/firewire.c +++ b/sys/dev/firewire/firewire.c @@ -149,22 +149,17 @@ fw_tbuf_update(struct firewire_comm *fc, int sub, int flag){ }else{ bulkxfer = it->stdma; } - splx(s); if(bulkxfer != NULL){ - s = splfw(); bulkxfer2 = STAILQ_NEXT(bulkxfer, link); #if 0 if(it->flag & FWXFERQ_DV && bulkxfer2 == NULL){ bulkxfer2 = STAILQ_FIRST(&it->stfree); STAILQ_REMOVE_HEAD(&it->stfree, link); - splx(s); bcopy(bulkxfer->buf, bulkxfer2->buf, it->psize * it->btpacket); - s = splfw(); STAILQ_INSERT_TAIL(&it->stvalid, bulkxfer2, link); } #endif - splx(s); } it->stdma = bulkxfer; it->stdma2 = bulkxfer2; @@ -175,23 +170,19 @@ dvloop: if(it->dvdma == NULL){ dvbuf = STAILQ_FIRST(&it->dvvalid); if(dvbuf != NULL){ - s = splfw(); STAILQ_REMOVE_HEAD(&it->dvvalid, link); it->dvdma = dvbuf; - splx(s); it->queued = 0; } } if(it->dvdma == NULL) - return err; + goto out; it->stproc = STAILQ_FIRST(&it->stfree); if(it->stproc != NULL){ - s = splfw(); STAILQ_REMOVE_HEAD(&it->stfree, link); - splx(s); }else{ - return err; + goto out; } #if 1 #define DVSEC 100 @@ -243,18 +234,16 @@ dvloop: } } it->stproc->npacket = j; - s = splfw(); STAILQ_INSERT_TAIL(&it->stvalid, it->stproc, link); - splx(s); if(it->queued >= it->dvpacket){ - s = splfw(); STAILQ_INSERT_TAIL(&it->dvfree, it->dvdma, link); it->dvdma = NULL; - splx(s); wakeup(it); goto dvloop; } } +out: + splx(s); return err; } /* |