Commit | Line | Data |
---|---|---|
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 | */ | |
31 | int locked_queue_count; /* XXX Count of locked-down buffers. */ | |
32 | ||
a5219e6e | 33 | int |
9342689a JH |
34 | lfs_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 |
40 | printf("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 | */ |
78 | void | |
79 | lfs_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 | } |