reacquire the dirtyblk list if write a segment during traversal;
[unix-history] / usr / src / sys / ufs / lfs / lfs_debug.c
CommitLineData
7dcbcb85 1/*
42e3d5a4 2 * Copyright (c) 1991 The Regents of the University of California.
7dcbcb85
KB
3 * All rights reserved.
4 *
5 * %sccs.include.redist.c%
6 *
6c4c42b6 7 * @(#)lfs_debug.c 7.4 (Berkeley) %G%
7dcbcb85
KB
8 */
9
b5652ce3
KB
10#ifdef DEBUG
11#include <sys/param.h>
12#include <sys/namei.h>
13#include <sys/vnode.h>
14
42e3d5a4
KB
15#include <ufs/ufs/quota.h>
16#include <ufs/ufs/inode.h>
b5652ce3 17
42e3d5a4
KB
18#include <ufs/lfs/lfs.h>
19#include <ufs/lfs/lfs_extern.h>
7dcbcb85
KB
20
21void
b5652ce3 22lfs_dump_super(lfsp)
42e3d5a4 23 struct lfs *lfsp;
7dcbcb85
KB
24{
25 int i;
26
27 (void)printf("%s%lx\t%s%lx\t%s%d\t%s%d\n",
28 "magic ", lfsp->lfs_magic,
29 "version ", lfsp->lfs_version,
30 "size ", lfsp->lfs_size,
31 "ssize ", lfsp->lfs_ssize);
32 (void)printf("%s%d\t%s%d\t%s%d\t%s%d\n",
33 "dsize ", lfsp->lfs_dsize,
34 "bsize ", lfsp->lfs_bsize,
35 "fsize ", lfsp->lfs_fsize,
36 "frag ", lfsp->lfs_frag);
37
38 (void)printf("%s%d\t%s%d\t%s%d\t%s%d\n",
39 "minfree ", lfsp->lfs_minfree,
40 "inopb ", lfsp->lfs_inopb,
41 "ifpb ", lfsp->lfs_ifpb,
42 "nindir ", lfsp->lfs_nindir);
43
44 (void)printf("%s%d\t%s%d\t%s%d\n",
45 "nseg ", lfsp->lfs_nseg,
46 "nspf ", lfsp->lfs_nspf,
47 "segtabsz ", lfsp->lfs_segtabsz);
48
49 (void)printf("%s%lx\t%s%d\t%s%lx\t%s%d\n",
50 "segmask ", lfsp->lfs_segmask,
51 "segshift ", lfsp->lfs_segshift,
52 "bmask ", lfsp->lfs_bmask,
53 "bshift ", lfsp->lfs_bshift);
54
55 (void)printf("%s%lx\t%s%d\t%s%lx\t%s%d\n",
56 "ffmask ", lfsp->lfs_ffmask,
57 "ffshift ", lfsp->lfs_ffshift,
58 "fbmask ", lfsp->lfs_fbmask,
59 "fbshift ", lfsp->lfs_fbshift);
60
61 (void)printf("%s%d\t%s%lx\n",
62 "fsbtodb ", lfsp->lfs_fsbtodb,
63 "cksum ", lfsp->lfs_cksum);
64
65 (void)printf("Superblock disk addresses:");
66 for (i = 0; i < LFS_MAXNUMSB; i++)
67 (void)printf(" %lx", lfsp->lfs_sboffs[i]);
68 (void)printf("\n");
69
70 (void)printf("Checkpoint Info\n");
71 (void)printf("%s%d\t%s%lx\t%s%d\n",
72 "free ", lfsp->lfs_free,
73 "idaddr ", lfsp->lfs_idaddr,
74 "ifile ", lfsp->lfs_ifile);
75 (void)printf("%s%lx\t%s%d\t%s%lx\t%s%lx\n",
76 "bfree ", lfsp->lfs_bfree,
77 "nfiles ", lfsp->lfs_nfiles,
78 "lastseg ", lfsp->lfs_lastseg,
79 "nextseg ", lfsp->lfs_nextseg);
80 (void)printf("tstamp %lx\n", lfsp->lfs_tstamp);
81}
82
2b62f83c 83void
b5652ce3 84lfs_dump_dinode(dip)
7dcbcb85
KB
85 DINODE *dip;
86{
87 int i;
88
6c4c42b6 89 (void)printf("%s%u\t%s%d\t%s%u\t%s%u\t%s%lu\n",
7dcbcb85
KB
90 "mode ", dip->di_mode,
91 "nlink ", dip->di_nlink,
92 "uid ", dip->di_uid,
93 "gid ", dip->di_gid,
6c4c42b6
KB
94 "size ", dip->di_size);
95 (void)printf("inum %ld\n", dip->di_inum);
7dcbcb85
KB
96 (void)printf("Direct Addresses\n");
97 for (i = 0; i < NDADDR; i++) {
98 (void)printf("\t%lx", dip->di_db[i]);
99 if ((i % 6) == 5)
100 (void)printf("\n");
101 }
102 for (i = 0; i < NIADDR; i++)
103 (void)printf("\t%lx", dip->di_ib[i]);
104 (void)printf("\n");
105}
106
b5652ce3
KB
107/* XXX TEMPORARY */
108#include <sys/buf.h>
109#include <sys/mount.h>
110int
111lfs_umountdebug(mp)
112 struct mount *mp;
7dcbcb85 113{
b5652ce3
KB
114 struct vnode *vp;
115 int dirty;
116
117 dirty = 0;
118 if ((mp->mnt_flag & MNT_MPBUSY) == 0)
119 panic("umountdebug: not busy");
120loop:
121 for (vp = mp->mnt_mounth; vp; vp = vp->v_mountf) {
122 if (vget(vp))
123 goto loop;
124 dirty += lfs_vinvalbuf(vp);
125 vput(vp);
126 if (vp->v_mount != mp)
127 goto loop;
128 }
129 return (dirty);
7dcbcb85 130}
275ca4f0 131
b5652ce3
KB
132int
133lfs_vinvalbuf(vp)
134 register struct vnode *vp;
275ca4f0 135{
b5652ce3
KB
136 register struct buf *bp;
137 struct buf *nbp, *blist;
138 int s, dirty = 0;
275ca4f0 139
b5652ce3
KB
140 for (;;) {
141 if (blist = vp->v_dirtyblkhd)
142 /* void */;
143 else if (blist = vp->v_cleanblkhd)
144 /* void */;
145 else
146 break;
147 for (bp = blist; bp; bp = nbp) {
6f75d57e
KB
148 printf("lfs_vinvalbuf: ino %d, lblkno %d, blkno %lx flags %xl\n",
149 VTOI(vp)->i_number, bp->b_lblkno, bp->b_blkno, bp->b_flags);
b5652ce3
KB
150 nbp = bp->b_blockf;
151 s = splbio();
152 if (bp->b_flags & B_BUSY) {
6f75d57e 153 printf("lfs_vinvalbuf: buffer busy, would normally sleep\n");
b5652ce3
KB
154/*
155 bp->b_flags |= B_WANTED;
156 sleep((caddr_t)bp, PRIBIO + 1);
157*/
158 splx(s);
159 break;
160 }
161 bremfree(bp);
162 bp->b_flags |= B_BUSY;
163 splx(s);
164 if (bp->b_flags & B_DELWRI) {
165 dirty++; /* XXX */
6f75d57e 166 printf("lfs_vinvalbuf: buffer dirty (DELWRI). would normally write\n");
b5652ce3
KB
167 break;
168 }
169 if (bp->b_vp != vp)
170 reassignbuf(bp, bp->b_vp);
171 else
172 bp->b_flags |= B_INVAL;
173 brelse(bp);
174 }
175 }
176 if (vp->v_dirtyblkhd || vp->v_cleanblkhd)
177 panic("lfs_vinvalbuf: flush failed");
178 return (dirty);
275ca4f0 179}
b5652ce3 180#endif /* DEBUG */