1 /* $NetBSD: opdump.c,v 1.26 2009/04/06 14:45:11 pooka Exp $ */
4 * Copyright (c) 2005, 2006 Antti Kantee. All Rights Reserved.
6 * Development of this software was supported by the
7 * Google Summer of Code program and the Ulla Tuominen Foundation.
8 * The Google SoC project was mentored by Bill Studenmund.
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
20 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 /* Pretty-printing helper routines for VFS/VOP request contents */
34 /* yes, this is pretty much a mess */
36 #include <sys/cdefs.h>
38 __RCSID("$NetBSD: opdump.c,v 1.26 2009/04/06 14:45:11 pooka Exp $");
41 #include <sys/types.h>
45 #include <puffsdump.h>
48 #include "puffs_priv.h"
51 const char *vfsop_revmap
[] = {
64 "PUFFS_VFS_EXTATTCTL",
68 const char *vnop_revmap
[] = {
111 "PUFFS_VN_GETEXTATTR",
112 "PUFFS_VN_LISTEXTATTR",
113 "PUFFS_VN_OPENEXTATTR",
114 "PUFFS_VN_DELETEEXTATTR",
115 "PUFFS_VN_SETEXTATTR",
118 const char *cacheop_revmap
[] = {
122 const char *errnot_revmap
[] = {
123 "PUFFS_ERR_MAKENODE",
126 "PUFFS_ERR_READLINK",
132 const char *flush_revmap
[] = {
133 "PUFFS_INVAL_NAMECACHE_NODE",
134 "PUFFS_INVAL_NAMECACHE_DIR",
135 "PUFFS_INVAL_NAMECACHE_ALL",
136 "PUFFS_INVAL_PAGECACHE_NODE_RANGE",
137 "PUFFS_FLUSH_PAGECACHE_NODE_RANGE",
141 puffsdump_req(struct puffs_req
*preq
)
143 static struct timeval tv_prev
;
144 struct timeval tv_now
, tv
;
148 map
= NULL
; /* yes, we are all interested in your opinion, gcc */
149 switch (PUFFSOP_OPCLASS(preq
->preq_opclass
)) {
158 map
= cacheop_revmap
;
168 printf("\treqid: %" PRIu64
", opclass %d%s, optype: %s, "
169 "cookie: %p,\n\t\taux: %p, auxlen: %zu, pid: %d, lwpid: %d\n",
170 preq
->preq_id
, PUFFSOP_OPCLASS(preq
->preq_opclass
),
171 PUFFSOP_WANTREPLY(preq
->preq_opclass
) ? "" : " (FAF)",
172 map
[preq
->preq_optype
], preq
->preq_cookie
,
173 preq
->preq_buf
, preq
->preq_buflen
,
174 preq
->preq_pid
, preq
->preq_lid
);
177 switch (preq
->preq_optype
) {
178 case PUFFS_VN_LOOKUP
:
179 puffsdump_lookup(preq
);
183 puffsdump_readwrite(preq
);
186 puffsdump_open(preq
);
188 case PUFFS_VN_REMOVE
:
191 puffsdump_targ(preq
);
193 case PUFFS_VN_READDIR
:
194 puffsdump_readdir(preq
);
202 gettimeofday(&tv_now
, NULL
);
203 timersub(&tv_now
, &tv_prev
, &tv
);
204 printf("\t\tsince previous call: %lld.%06ld\n",
205 (long long)tv
.tv_sec
, (long)tv
.tv_usec
);
206 gettimeofday(&tv_prev
, NULL
);
211 puffsdump_rv(struct puffs_req
*preq
)
214 if (PUFFSOP_OPCLASS(preq
->preq_opclass
) == PUFFSOP_VN
) {
215 switch (preq
->preq_optype
) {
216 case PUFFS_VN_LOOKUP
:
217 puffsdump_lookup_rv(preq
);
219 case PUFFS_VN_CREATE
:
222 case PUFFS_VN_SYMLINK
:
223 puffsdump_create_rv(preq
);
227 puffsdump_readwrite_rv(preq
);
229 case PUFFS_VN_READDIR
:
230 puffsdump_readdir_rv(preq
);
237 printf("\tRV reqid: %" PRIu64
", result: %d %s\n",
238 preq
->preq_id
, preq
->preq_rv
,
239 preq
->preq_rv
? strerror(preq
->preq_rv
) : "");
243 puffsdump_cookie(puffs_cookie_t c
, const char *cookiename
)
246 printf("\t%scookie: at %p\n", cookiename
, c
);
249 static const char *cn_opnames
[] = {
257 puffsdump_cn(struct puffs_kcn
*pkcn
)
260 printf("\t\tpuffs_cn: \"%s\", len %zu op %s (flags 0x%x)\n",
261 pkcn
->pkcn_name
, pkcn
->pkcn_namelen
,
262 cn_opnames
[pkcn
->pkcn_nameiop
& NAMEI_OPMASK
],
267 puffsdump_lookup(struct puffs_req
*preq
)
269 struct puffs_vnmsg_lookup
*lookup_msg
= (void *)preq
;
271 puffsdump_cn(&lookup_msg
->pvnr_cn
);
275 puffsdump_lookup_rv(struct puffs_req
*preq
)
277 struct puffs_vnmsg_lookup
*lookup_msg
= (void *)preq
;
279 printf("\t\tnew node %p, type 0x%x,\n\t\tsize 0x%"PRIu64
", dev 0x%llx\n",
280 lookup_msg
->pvnr_newnode
, lookup_msg
->pvnr_vtype
,
281 lookup_msg
->pvnr_size
, (unsigned long long)lookup_msg
->pvnr_rdev
);
285 puffsdump_create_rv(struct puffs_req
*preq
)
287 /* XXX: wrong type, but we know it fits the slot */
288 struct puffs_vnmsg_create
*create_msg
= (void *)preq
;
290 printf("\t\tnew node %p\n", create_msg
->pvnr_newnode
);
294 puffsdump_readwrite(struct puffs_req
*preq
)
296 struct puffs_vnmsg_rw
*rw_msg
= (void *)preq
;
298 printf("\t\toffset: %" PRId64
", resid %zu, ioflag 0x%x\n",
299 rw_msg
->pvnr_offset
, rw_msg
->pvnr_resid
, rw_msg
->pvnr_ioflag
);
303 puffsdump_readwrite_rv(struct puffs_req
*preq
)
305 struct puffs_vnmsg_rw
*rw_msg
= (void *)preq
;
307 printf("\t\tresid after op: %zu\n", rw_msg
->pvnr_resid
);
311 puffsdump_readdir_rv(struct puffs_req
*preq
)
313 struct puffs_vnmsg_readdir
*readdir_msg
= (void *)preq
;
315 printf("\t\tresid after op: %zu, eofflag %d\n",
316 readdir_msg
->pvnr_resid
, readdir_msg
->pvnr_eofflag
);
320 puffsdump_open(struct puffs_req
*preq
)
322 struct puffs_vnmsg_open
*open_msg
= (void *)preq
;
324 printf("\t\tmode: 0x%x\n", open_msg
->pvnr_mode
);
328 puffsdump_targ(struct puffs_req
*preq
)
330 struct puffs_vnmsg_remove
*remove_msg
= (void *)preq
; /* XXX! */
332 printf("\t\ttarget cookie: %p\n", remove_msg
->pvnr_cookie_targ
);
336 puffsdump_readdir(struct puffs_req
*preq
)
338 struct puffs_vnmsg_readdir
*readdir_msg
= (void *)preq
;
340 printf("\t\tread offset: %" PRId64
"\n", readdir_msg
->pvnr_offset
);
345 puffsdump_creds(struct puffs_cred
*pcr
)
351 puffsdump_int(int value
, const char *name
)
354 printf("\tint (%s): %d\n", name
, value
);