vnode interface conversion
[unix-history] / usr / src / sys / ufs / lfs / lfs_bio.c
CommitLineData
8c6ec179 1/*
785154a8 2 * Copyright (c) 1991 Regents of the University of California.
8c6ec179
KB
3 * All rights reserved.
4 *
5 * %sccs.include.redist.c%
6 *
ea67b335 7 * @(#)lfs_bio.c 7.9 (Berkeley) %G%
8c6ec179
KB
8 */
9
a5219e6e
KB
10#include <sys/param.h>
11#include <sys/proc.h>
12#include <sys/buf.h>
5c5f0f67 13#include <sys/vnode.h>
a5219e6e 14#include <sys/resourcevar.h>
5c5f0f67
KB
15#include <sys/mount.h>
16
17#include <ufs/ufs/quota.h>
18#include <ufs/ufs/inode.h>
19#include <ufs/ufs/ufsmount.h>
a5219e6e 20
785154a8
KB
21#include <ufs/lfs/lfs.h>
22#include <ufs/lfs/lfs_extern.h>
8c6ec179 23
5c5f0f67
KB
24/*
25 * LFS block write function.
26 *
27 * XXX
28 * No write cost accounting is done.
29 * This is almost certainly wrong for synchronous operations and NFS.
30 */
31int locked_queue_count; /* XXX Count of locked-down buffers. */
32
a5219e6e 33int
9342689a
JH
34lfs_bwrite (ap)
35 struct vop_bwrite_args *ap;
36#define bp (ap->a_bp)
8c6ec179 37{
b3cee2e6 38 int s;
9a1dcf8a
KB
39#ifdef VERBOSE
40printf("lfs_bwrite\n");
41#endif
42 /*
5c5f0f67
KB
43 * Set the delayed write flag and use reassignbuf to move the buffer
44 * from the clean list to the dirty one.
9a1dcf8a 45 *
5c5f0f67
KB
46 * Set the B_LOCKED flag and unlock the buffer, causing brelse to move
47 * the buffer onto the LOCKED free list. This is necessary, otherwise
48 * getnewbuf() would try to reclaim the buffers using bawrite, which
49 * isn't going to work.
9a1dcf8a 50 */
9f1a72f3 51 if (!(bp->b_flags & B_LOCKED)) {
5c5f0f67 52 ++locked_queue_count;
9f1a72f3
CS
53 bp->b_flags |= B_DELWRI | B_LOCKED;
54 bp->b_flags &= ~(B_READ | B_DONE | B_ERROR);
55 s = splbio();
56#define PMAP_BUG_FIX_HACK
57#ifdef PMAP_BUG_FIX_HACK
58 if (((struct ufsmount *)
59 (bp->b_vp->v_mount->mnt_data))->um_lfs->lfs_ivnode !=
60 bp->b_vp)
61#endif
62 reassignbuf(bp, bp->b_vp);
63 splx(s);
64 }
8c6ec179 65 brelse(bp);
a5219e6e 66 return (0);
8c6ec179 67}
9342689a 68#undef bp
5c5f0f67
KB
69
70/*
71 * XXX
72 * This routine flushes buffers out of the B_LOCKED queue when LFS has too
73 * many locked down. Eventually the pageout daemon will simply call LFS
b9258e30
KB
74 * when pages need to be reclaimed. Note, we have one static count of locked
75 * buffers, so we can't have more than a single file system. To make this
76 * work for multiple file systems, put the count into the mount structure.
5c5f0f67
KB
77 */
78void
79lfs_flush()
80{
81 register struct mount *mp;
82 struct mount *omp;
83
b9258e30
KB
84 /* 1M in a 4K file system. */
85 if (locked_queue_count < 256)
5c5f0f67
KB
86 return;
87 mp = rootfs;
88 do {
89 /*
90 * The lock check below is to avoid races with mount
91 * and unmount.
92 */
93 if (mp->mnt_stat.f_type == MOUNT_LFS &&
94 (mp->mnt_flag & (MNT_MLOCK|MNT_RDONLY|MNT_MPBUSY)) == 0 &&
95 !vfs_busy(mp)) {
b3cee2e6
KB
96 /*
97 * We set the queue to 0 here because we are about to
98 * write all the dirty buffers we have. If more come
99 * in while we're writing the segment, they may not
100 * get written, so we want the count to reflect these
101 * new writes after the segwrite completes.
102 */
103 locked_queue_count = 0;
5c5f0f67
KB
104 lfs_segwrite(mp, 0);
105 omp = mp;
106 mp = mp->mnt_next;
107 vfs_unbusy(omp);
108 } else
109 mp = mp->mnt_next;
110 } while (mp != rootfs);
5c5f0f67 111}