4 * cc -I/usr/src/sys ncptrace.c -o /usr/local/bin/ncptrace -lkvm
9 * Trace and dump the kernel namecache hierarchy. If a path is specified
10 * the trace begins there, otherwise the trace begins at the root.
12 * $DragonFly: src/test/debug/ncptrace.c,v 1.4 2004/10/07 10:15:06 dillon Exp $
15 #define _KERNEL_STRUCTURES_
16 #include <sys/param.h>
18 #include <sys/malloc.h>
19 #include <sys/signalvar.h>
20 #include <sys/vnode.h>
21 #include <sys/namecache.h>
24 #include <vm/vm_page.h>
25 #include <vm/vm_kern.h>
26 #include <vm/swap_pager.h>
27 #include <vm/vnode_pager.h>
46 void kkread(kvm_t *kd, u_long addr, void *buf, size_t nbytes);
47 void dumpncp(kvm_t *kd, int tab, struct namecache *ncptr, const char *path);
49 main(int ac, char **av)
51 struct namecache *ncptr;
53 const char *corefile = NULL;
54 const char *sysfile = NULL;
58 while ((ch = getopt(ac, av, "M:N:")) != -1) {
67 fprintf(stderr, "%s [-M core] [-N system]\n", av[0]);
74 if ((kd = kvm_open(sysfile, corefile, NULL, O_RDONLY, "kvm:")) == NULL) {
78 if (kvm_nlist(kd, Nl) != 0) {
83 kkread(kd, Nl[0].n_value, &ncptr, sizeof(ncptr));
85 ncptr = (void *)Nl[0].n_value;
88 dumpncp(kd, 0, ncptr, NULL);
90 for (i = 0; i < ac; ++i) {
92 fprintf(stderr, "%s: path must start at the root\n", av[i]);
93 dumpncp(kd, 0, ncptr, av[i]);
99 dumpncp(kvm_t *kd, int tab, struct namecache *ncptr, const char *path)
101 struct namecache ncp;
102 struct namecache *ncscan;
107 kkread(kd, (u_long)ncptr, &ncp, sizeof(ncp));
108 if (ncp.nc_nlen < sizeof(name)) {
109 kkread(kd, (u_long)ncp.nc_name, name, ncp.nc_nlen);
110 name[ncp.nc_nlen] = 0;
115 strcpy(name, "ROOT");
118 } else if (ncp.nc_flag & NCF_MOUNTPT) {
119 strcpy(name, "MOUNTGLUE");
120 } else if (name[0] == 0) {
125 if ((ptr = strchr(path, '/')) == NULL)
126 ptr = path + strlen(path);
127 if (strlen(name) != ptr - path ||
128 bcmp(name, path, ptr - path) != 0
139 if (ncp.nc_list.tqh_first)
147 printf("%*.*s%s ", tab, tab, "", name);
148 printf("[ncp=%p par=%p %04x vp=%p",
149 ncptr, ncp.nc_parent, ncp.nc_flag, ncp.nc_vp);
151 printf(" timo=%d", ncp.nc_timeout);
153 printf(" refs=%d", ncp.nc_refs);
154 if ((ncp.nc_flag & NCF_UNRESOLVED) == 0 && ncp.nc_error)
155 printf(" error=%d", ncp.nc_error);
157 printf(" LOCKED(%d,td=%p)", ncp.nc_exlocks, ncp.nc_locktd);
161 printf(" %s\n", name);
163 printf("%s\n", haschildren ? " {" : "");
165 for (ncscan = ncp.nc_list.tqh_first; ncscan; ncscan = ncp.nc_entry.tqe_next) {
166 kkread(kd, (u_long)ncscan, &ncp, sizeof(ncp));
167 dumpncp(kd, (path ? (tab ? tab : 4) : tab + 4), ncscan, path);
169 if (haschildren && path == NULL)
170 printf("%*.*s}\n", tab, tab, "");
174 kkread(kvm_t *kd, u_long addr, void *buf, size_t nbytes)
176 if (kvm_read(kd, addr, buf, nbytes) != nbytes) {