projects
/
unix-history
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
tags
|
clone url
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
alloc tables at boot time version
[unix-history]
/
usr
/
src
/
sys
/
kern
/
vfs_bio.c
diff --git
a/usr/src/sys/kern/vfs_bio.c
b/usr/src/sys/kern/vfs_bio.c
index
6814c76
..
392907e
100644
(file)
--- a/
usr/src/sys/kern/vfs_bio.c
+++ b/
usr/src/sys/kern/vfs_bio.c
@@
-1,4
+1,4
@@
-/* vfs_bio.c 4.
6
%G% */
+/* vfs_bio.c 4.
14
%G% */
#include "../h/param.h"
#include "../h/systm.h"
#include "../h/param.h"
#include "../h/systm.h"
@@
-36,8
+36,8
@@
#define BUFHSZ 63
struct bufhd bufhash[BUFHSZ];
#define BUFHSZ 63
struct bufhd bufhash[BUFHSZ];
-#define BUFHASH(dev,
blkno)
\
- ((struct buf *)&bufhash[((int)
dev+(int)blkno
) % BUFHSZ])
+#define BUFHASH(dev,
dblkno)
\
+ ((struct buf *)&bufhash[((int)
(dev)+(int)(dblkno)
) % BUFHSZ])
/*
* Initialize hash links for buffers.
/*
* Initialize hash links for buffers.
@@
-60,7
+60,7
@@
struct {
long nreada;
long ncache;
long nwrite;
long nreada;
long ncache;
long nwrite;
- long bufcount[
NBUF
];
+ long bufcount[
64
];
} io_info;
#endif
} io_info;
#endif
@@
-74,12
+74,12
@@
struct {
* page push, when the I/O completes, it is inserted
* in a list of cleaned pages to be processed by the pageout daemon.
*/
* page push, when the I/O completes, it is inserted
* in a list of cleaned pages to be processed by the pageout daemon.
*/
-struct buf
swbuf[NSWBUF]
;
-short
swsize[NSWBUF];
/* CAN WE JUST USE B_BCOUNT? */
-int
swpf[NSWBUF]
;
+struct buf
*swbuf
;
+short
*swsize;
/* CAN WE JUST USE B_BCOUNT? */
+int
*swpf
;
-#if
def FASTVAX
+#if
ndef UNFAST
#define notavail(bp) \
{ \
int s = spl6(); \
#define notavail(bp) \
{ \
int s = spl6(); \
@@
-222,12
+222,12
@@
register struct buf *bp;
bdwrite(bp)
register struct buf *bp;
{
bdwrite(bp)
register struct buf *bp;
{
- register
struct buf *dp
;
+ register
int flags
;
if ((bp->b_flags&B_DELWRI) == 0)
u.u_vm.vm_oublk++; /* noone paid yet */
if ((bp->b_flags&B_DELWRI) == 0)
u.u_vm.vm_oublk++; /* noone paid yet */
-
dp = bdevsw[major(bp->b_dev)].d_tab
;
- if(
dp->b_
flags & B_TAPE)
+
flags = bdevsw[major(bp->b_dev)].d_flags
;
+ if(flags & B_TAPE)
bawrite(bp);
else {
bp->b_flags |= B_DELWRI | B_DONE;
bawrite(bp);
else {
bp->b_flags |= B_DELWRI | B_DONE;
@@
-261,8
+261,11
@@
register struct buf *bp;
bfreelist[0].b_flags &= ~B_WANTED;
wakeup((caddr_t)bfreelist);
}
bfreelist[0].b_flags &= ~B_WANTED;
wakeup((caddr_t)bfreelist);
}
- if ((bp->b_flags&B_ERROR) && bp->b_dev != NODEV)
- bp->b_dev = NODEV; /* no assoc. on error */
+ if (bp->b_flags&B_ERROR)
+ if (bp->b_flags & B_LOCKED)
+ bp->b_flags &= ~B_ERROR; /* try again later */
+ else
+ bp->b_dev = NODEV; /* no assoc */
s = spl6();
if (bp->b_flags & (B_ERROR|B_INVAL)) {
/* block has no info ... put at front of most free list */
s = spl6();
if (bp->b_flags & (B_ERROR|B_INVAL)) {
/* block has no info ... put at front of most free list */
@@
-299,7
+302,7
@@
daddr_t blkno;
register struct buf *dp;
register int dblkno = fsbtodb(blkno);
register struct buf *dp;
register int dblkno = fsbtodb(blkno);
- dp = BUFHASH(dev, blkno);
+ dp = BUFHASH(dev,
d
blkno);
for (bp = dp->b_forw; bp != dp; bp = bp->b_forw)
if (bp->b_blkno == dblkno && bp->b_dev == dev &&
!(bp->b_flags & B_INVAL))
for (bp = dp->b_forw; bp != dp; bp = bp->b_forw)
if (bp->b_blkno == dblkno && bp->b_dev == dev &&
!(bp->b_flags & B_INVAL))
@@
-329,8
+332,10
@@
dev_t dev;
daddr_t blkno;
{
register struct buf *bp, *dp, *ep;
daddr_t blkno;
{
register struct buf *bp, *dp, *ep;
- register int i, x;
register int dblkno = fsbtodb(blkno);
register int dblkno = fsbtodb(blkno);
+#ifdef DISKMON
+ register int i;
+#endif
if ((unsigned)blkno >= 1 << (sizeof(int)*NBBY-PGSHIFT))
blkno = 1 << ((sizeof(int)*NBBY-PGSHIFT) + 1);
if ((unsigned)blkno >= 1 << (sizeof(int)*NBBY-PGSHIFT))
blkno = 1 << ((sizeof(int)*NBBY-PGSHIFT) + 1);
@@
-356,7
+361,7
@@
daddr_t blkno;
i++;
dp = dp->av_forw;
}
i++;
dp = dp->av_forw;
}
- if (i<
NBUF
)
+ if (i<
64
)
io_info.bufcount[i]++;
#endif
notavail(bp);
io_info.bufcount[i]++;
#endif
notavail(bp);
@@
-435,7
+440,6
@@
loop:
dp->b_forw->b_back = bp;
dp->b_forw = bp;
bp->b_dev = (dev_t)NODEV;
dp->b_forw->b_back = bp;
dp->b_forw = bp;
bp->b_dev = (dev_t)NODEV;
- bp->b_hlink = -1;
return(bp);
}
return(bp);
}
@@
-454,7
+458,7
@@
register struct buf *bp;
geterror(bp);
}
geterror(bp);
}
-#if
ndef FASTVAX
+#if
def UNFAST
/*
* Unlink a buffer from the available list and mark it busy.
* (internal interface)
/*
* Unlink a buffer from the available list and mark it busy.
* (internal interface)
@@
-772,10
+776,12
@@
register struct buf *bp;
binval(dev)
dev_t dev;
{
binval(dev)
dev_t dev;
{
- register struct buf *bp, *dp;
+ register struct buf *bp;
+ register struct bufhd *hp;
+#define dp ((struct buf *)hp)
- dp = bdevsw[major(dev)].d_tab;
- for (bp = dp->b_forw; bp != dp; bp = bp->b_forw)
- if (bp->b_dev == dev)
- bp->b_flags |= B_INVAL;
+ for (hp = bufhash; hp < &bufhash[BUFHSZ]; hp++)
+
for (bp = dp->b_forw; bp != dp; bp = bp->b_forw)
+
if (bp->b_dev == dev)
+
bp->b_flags |= B_INVAL;
}
}