summaryrefslogtreecommitdiff
path: root/sys/miscfs/specfs/spec_vnops.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/miscfs/specfs/spec_vnops.c')
-rw-r--r--sys/miscfs/specfs/spec_vnops.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/sys/miscfs/specfs/spec_vnops.c b/sys/miscfs/specfs/spec_vnops.c
index ff0f347546b7a..f32a9f15033ee 100644
--- a/sys/miscfs/specfs/spec_vnops.c
+++ b/sys/miscfs/specfs/spec_vnops.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)spec_vnops.c 8.14 (Berkeley) 5/21/95
- * $Id: spec_vnops.c,v 1.77 1998/12/07 21:58:33 archie Exp $
+ * $Id: spec_vnops.c,v 1.73 1998/09/05 14:13:12 phk Exp $
*/
#include <sys/param.h>
@@ -257,7 +257,7 @@ spec_read(ap)
daddr_t bn, nextbn;
long bsize, bscale;
struct partinfo dpart;
- int n, on;
+ int n, on, majordev;
d_ioctl_t *ioctl;
int error = 0;
dev_t dev;
@@ -285,7 +285,8 @@ spec_read(ap)
return (EINVAL);
bsize = BLKDEV_IOSIZE;
dev = vp->v_rdev;
- if ((ioctl = bdevsw[major(dev)]->d_ioctl) != NULL &&
+ if ((majordev = major(dev)) < nblkdev &&
+ (ioctl = bdevsw[majordev]->d_ioctl) != NULL &&
(*ioctl)(dev, DIOCGPART, (caddr_t)&dpart, FREAD, p) == 0 &&
dpart.part->p_fstype == FS_BSDFFS &&
dpart.part->p_frag != 0 && dpart.part->p_fsize != 0)
@@ -379,11 +380,11 @@ spec_write(ap)
bp = getblk(vp, bn, bsize, 0, 0);
else
error = bread(vp, bn, bsize, NOCRED, &bp);
+ n = min(n, bsize - bp->b_resid);
if (error) {
brelse(bp);
return (error);
}
- n = min(n, bsize - bp->b_resid);
error = uiomove((char *)bp->b_data + on, n, uio);
if (n + on == bsize)
bawrite(bp);
@@ -476,8 +477,8 @@ spec_fsync(ap)
*/
loop:
s = splbio();
- for (bp = TAILQ_FIRST(&vp->v_dirtyblkhd); bp; bp = nbp) {
- nbp = TAILQ_NEXT(bp, b_vnbufs);
+ for (bp = vp->v_dirtyblkhd.lh_first; bp; bp = nbp) {
+ nbp = bp->b_vnbufs.le_next;
if ((bp->b_flags & B_BUSY))
continue;
if ((bp->b_flags & B_DELWRI) == 0)
@@ -499,7 +500,7 @@ loop:
(void) tsleep((caddr_t)&vp->v_numoutput, PRIBIO + 1, "spfsyn", 0);
}
#ifdef DIAGNOSTIC
- if (!TAILQ_EMPTY(&vp->v_dirtyblkhd)) {
+ if (vp->v_dirtyblkhd.lh_first) {
vprint("spec_fsync: dirty", vp);
splx(s);
goto loop;
@@ -605,6 +606,7 @@ spec_close(ap)
} */ *ap;
{
register struct vnode *vp = ap->a_vp;
+ struct proc *p = ap->a_p;
dev_t dev = vp->v_rdev;
d_close_t *devclose;
int mode, error;