4 * cc -I/usr/src/sys vnodeinfo.c -o /usr/local/bin/vnodeinfo -lkvm
8 * Dump the mountlist and related vnodes.
11 * Copyright (c) 2004 The DragonFly Project. All rights reserved.
13 * This code is derived from software contributed to The DragonFly Project
14 * by Matthew Dillon <dillon@backplane.com>
16 * Redistribution and use in source and binary forms, with or without
17 * modification, are permitted provided that the following conditions
20 * 1. Redistributions of source code must retain the above copyright
21 * notice, this list of conditions and the following disclaimer.
22 * 2. Redistributions in binary form must reproduce the above copyright
23 * notice, this list of conditions and the following disclaimer in
24 * the documentation and/or other materials provided with the
26 * 3. Neither the name of The DragonFly Project nor the names of its
27 * contributors may be used to endorse or promote products derived
28 * from this software without specific, prior written permission.
30 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
31 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
32 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
33 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
34 * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
35 * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
36 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
37 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
38 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
39 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
40 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
43 * $DragonFly: src/test/debug/vnodeinfo.c,v 1.7 2005/08/28 23:35:35 corecode Exp $
46 #define _KERNEL_STRUCTURES_
47 #include <sys/param.h>
49 #include <sys/malloc.h>
50 #include <sys/signalvar.h>
51 #include <sys/mount.h>
52 #include <sys/vnode.h>
55 #include <vm/vm_page.h>
56 #include <vm/vm_kern.h>
57 #include <vm/vm_object.h>
58 #include <vm/swap_pager.h>
59 #include <vm/vnode_pager.h>
71 { "_vnode_free_list" },
75 static void kkread(kvm_t
*kd
, u_long addr
, void *buf
, size_t nbytes
);
76 static struct mount
*dumpmount(kvm_t
*kd
, struct mount
*mp
);
77 static struct vnode
*dumpvp(kvm_t
*kd
, struct vnode
*vp
, int whichlist
);
78 static int getobjpages(kvm_t
*kd
, struct vm_object
*obj
);
79 static int getobjvnpsize(kvm_t
*kd
, struct vm_object
*obj
);
81 main(int ac
, char **av
)
88 const char *corefile
= NULL
;
89 const char *sysfile
= NULL
;
91 while ((ch
= getopt(ac
, av
, "M:N:")) != -1) {
100 fprintf(stderr
, "%s [-M core] [-N system]\n", av
[0]);
105 if ((kd
= kvm_open(sysfile
, corefile
, NULL
, O_RDONLY
, "kvm:")) == NULL
) {
109 if (kvm_nlist(kd
, Nl
) != 0) {
113 kkread(kd
, Nl
[0].n_value
, &mp
, sizeof(mp
));
115 mp
= dumpmount(kd
, mp
);
116 kkread(kd
, Nl
[1].n_value
, &vp
, sizeof(vp
));
117 printf("VNODEFREELIST {\n");
119 vp
= dumpvp(kd
, vp
, 0);
124 static struct mount
*
125 dumpmount(kvm_t
*kd
, struct mount
*mp
)
130 kkread(kd
, (u_long
)mp
, &mnt
, sizeof(mnt
));
131 printf("MOUNTPOINT %s on %s {\n",
132 mnt
.mnt_stat
.f_mntfromname
, mnt
.mnt_stat
.f_mntonname
);
133 printf(" lk_flags %08x share %d wait %d excl %d holder = %p\n",
134 mnt
.mnt_lock
.lk_flags
, mnt
.mnt_lock
.lk_sharecount
,
135 mnt
.mnt_lock
.lk_waitcount
, mnt
.mnt_lock
.lk_exclusivecount
,
136 mnt
.mnt_lock
.lk_lockholder
);
137 printf(" mnt_flag %08x mnt_kern_flag %08x\n",
138 mnt
.mnt_flag
, mnt
.mnt_kern_flag
);
139 printf(" mnt_nvnodelistsize %d\n", mnt
.mnt_nvnodelistsize
);
140 printf(" mnt_stat.f_fsid %08x %08x\n", mnt
.mnt_stat
.f_fsid
.val
[0],
141 mnt
.mnt_stat
.f_fsid
.val
[1]);
142 vp
= mnt
.mnt_nvnodelist
.tqh_first
;
144 vp
= dumpvp(kd
, vp
, 1);
148 return(mnt
.mnt_list
.tqe_next
);
152 vtype(enum vtype type
)
178 snprintf(buf
, sizeof(buf
), "%d", (int)type
);
182 static struct vnode
*
183 dumpvp(kvm_t
*kd
, struct vnode
*vp
, int whichlist
)
187 kkread(kd
, (u_long
)vp
, &vn
, sizeof(vn
));
189 printf(" vnode %p usecnt %d holdcnt %d type=%s flags %08x",
190 vp
, vn
.v_usecount
, vn
.v_holdcnt
, vtype(vn
.v_type
), vn
.v_flag
);
192 if ((vn
.v_flag
& VOBJBUF
) && vn
.v_object
) {
193 int npages
= getobjpages(kd
, vn
.v_object
);
194 int vnpsize
= getobjvnpsize(kd
, vn
.v_object
);
195 if (npages
|| vnpsize
)
196 printf(" vmobjpgs=%d vnpsize=%d", npages
, vnpsize
);
199 if (vn
.v_flag
& VROOT
)
201 if (vn
.v_flag
& VTEXT
)
203 if (vn
.v_flag
& VSYSTEM
)
205 if (vn
.v_flag
& VISTTY
)
208 if (vn
.v_flag
& VXLOCK
)
210 if (vn
.v_flag
& VXWANT
)
214 if (vn
.v_flag
& VRECLAIMED
)
215 printf(" VRECLAIMED");
216 if (vn
.v_flag
& VINACTIVE
)
217 printf(" VINACTIVE");
219 if (vn
.v_flag
& VBWAIT
)
221 if (vn
.v_flag
& VOBJBUF
)
223 if (vn
.v_flag
& VAGE
)
225 if (vn
.v_flag
& VOLOCK
)
227 if (vn
.v_flag
& VOWANT
)
230 if (vn
.v_flag
& VDOOMED
)
233 if (vn
.v_flag
& VFREE
)
236 if (vn
.v_flag
& VINFREE
)
239 if (vn
.v_flag
& VONWORKLST
)
240 printf(" VONWORKLST");
241 if (vn
.v_flag
& VMOUNT
)
243 if (vn
.v_flag
& VOBJDIRTY
)
244 printf(" VOBJDIRTY");
248 if (vn
.v_lock
.lk_sharecount
|| vn
.v_lock
.lk_waitcount
||
249 vn
.v_lock
.lk_exclusivecount
|| vn
.v_lock
.lk_lockholder
!= LK_NOTHREAD
) {
250 printf("\tlk_flags %08x share %d wait %d excl %d holder = %p\n",
251 vn
.v_lock
.lk_flags
, vn
.v_lock
.lk_sharecount
,
252 vn
.v_lock
.lk_waitcount
, vn
.v_lock
.lk_exclusivecount
,
253 vn
.v_lock
.lk_lockholder
);
257 return(vn
.v_nmntvnodes
.tqe_next
);
259 return(vn
.v_freelist
.tqe_next
);
264 getobjpages(kvm_t
*kd
, struct vm_object
*obj
)
266 struct vm_object vmobj
;
268 kkread(kd
, (u_long
)obj
, &vmobj
, sizeof(vmobj
));
269 return(vmobj
.resident_page_count
);
274 getobjvnpsize(kvm_t
*kd
, struct vm_object
*obj
)
276 struct vm_object vmobj
;
278 kkread(kd
, (u_long
)obj
, &vmobj
, sizeof(vmobj
));
279 return(vmobj
.un_pager
.vnp
.vnp_size
);
283 kkread(kvm_t
*kd
, u_long addr
, void *buf
, size_t nbytes
)
285 if (kvm_read(kd
, addr
, buf
, nbytes
) != nbytes
) {