opdump.c revision 1.16
1/* $NetBSD: opdump.c,v 1.16 2007/10/26 17:24:45 pooka Exp $ */ 2 3/* 4 * Copyright (c) 2005, 2006 Antti Kantee. All Rights Reserved. 5 * 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. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 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. 18 * 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 29 * SUCH DAMAGE. 30 */ 31 32/* Pretty-printing helper routines for VFS/VOP request contents */ 33 34/* yes, this is pretty much a mess */ 35 36#include <sys/cdefs.h> 37#if !defined(lint) 38__RCSID("$NetBSD: opdump.c,v 1.16 2007/10/26 17:24:45 pooka Exp $"); 39#endif /* !lint */ 40 41#include <sys/types.h> 42#include <sys/time.h> 43 44#include <puffs.h> 45#include <puffsdump.h> 46#include <stdio.h> 47 48/* XXX! */ 49const char *vfsop_revmap[] = { 50 "PUFFS_VFS_MOUNT", 51 "PUFFS_VFS_START", 52 "PUFFS_VFS_UNMOUNT", 53 "PUFFS_VFS_ROOT", 54 "PUFFS_VFS_STATVFS", 55 "PUFFS_VFS_SYNC", 56 "PUFFS_VFS_VGET", 57 "PUFFS_VFS_FHTOVP", 58 "PUFFS_VFS_VPTOFH", 59 "PUFFS_VFS_INIT", 60 "PUFFS_VFS_DONE", 61 "PUFFS_VFS_SNAPSHOT", 62 "PUFFS_VFS_EXTATTCTL", 63 "PUFFS_VFS_SUSPEND" 64}; 65/* XXX! */ 66const char *vnop_revmap[] = { 67 "PUFFS_VN_LOOKUP", 68 "PUFFS_VN_CREATE", 69 "PUFFS_VN_MKNOD", 70 "PUFFS_VN_OPEN", 71 "PUFFS_VN_CLOSE", 72 "PUFFS_VN_ACCESS", 73 "PUFFS_VN_GETATTR", 74 "PUFFS_VN_SETATTR", 75 "PUFFS_VN_READ", 76 "PUFFS_VN_WRITE", 77 "PUFFS_VN_IOCTL", 78 "PUFFS_VN_FCNTL", 79 "PUFFS_VN_POLL", 80 "PUFFS_VN_KQFILTER", 81 "PUFFS_VN_REVOKE", 82 "PUFFS_VN_MMAP", 83 "PUFFS_VN_FSYNC", 84 "PUFFS_VN_SEEK", 85 "PUFFS_VN_REMOVE", 86 "PUFFS_VN_LINK", 87 "PUFFS_VN_RENAME", 88 "PUFFS_VN_MKDIR", 89 "PUFFS_VN_RMDIR", 90 "PUFFS_VN_SYMLINK", 91 "PUFFS_VN_READDIR", 92 "PUFFS_VN_READLINK", 93 "PUFFS_VN_ABORTOP", 94 "PUFFS_VN_INACTIVE", 95 "PUFFS_VN_RECLAIM", 96 "PUFFS_VN_LOCK", 97 "PUFFS_VN_UNLOCK", 98 "PUFFS_VN_BMAP", 99 "PUFFS_VN_STRATEGY", 100 "PUFFS_VN_PRINT", 101 "PUFFS_VN_ISLOCKED", 102 "PUFFS_VN_PATHCONF", 103 "PUFFS_VN_ADVLOCK", 104 "PUFFS_VN_LEASE", 105 "PUFFS_VN_WHITEOUT", 106 "PUFFS_VN_GETPAGES", 107 "PUFFS_VN_PUTPAGES", 108 "PUFFS_VN_BWRITE", 109 "PUFFS_VN_GETEXTATTR", 110 "PUFFS_VN_LISTEXTATTR", 111 "PUFFS_VN_OPENEXTATTR", 112 "PUFFS_VN_DELETEEXTATTR", 113 "PUFFS_VN_SETEXTATTR", 114}; 115/* XXX! */ 116const char *cacheop_revmap[] = { 117 "PUFFS_CACHE_WRITE" 118}; 119/* XXX! */ 120const char *errnot_revmap[] = { 121 "PUFFS_ERR_MAKENODE", 122 "PUFFS_ERR_LOOKUP", 123 "PUFFS_ERR_READDIR", 124 "PUFFS_ERR_READLINK", 125 "PUFFS_ERR_READ", 126 "PUFFS_ERR_WRITE", 127 "PUFFS_ERR_VPTOFH" 128}; 129 130void 131puffsdump_req(struct puffs_req *preq) 132{ 133 static struct timeval tv_prev; 134 struct timeval tv_now, tv; 135 const char **map; 136 int isvn = 0; 137 138 map = NULL; /* yes, we are all interested in your opinion, gcc */ 139 switch (PUFFSOP_OPCLASS(preq->preq_opclass)) { 140 case PUFFSOP_VFS: 141 map = vfsop_revmap; 142 break; 143 case PUFFSOP_VN: 144 map = vnop_revmap; 145 isvn = 1; 146 break; 147 case PUFFSOP_CACHE: 148 map = cacheop_revmap; 149 break; 150 case PUFFSOP_ERROR: 151 map = errnot_revmap; 152 break; 153 } 154 155 printf("\treqid: %" PRIu64 ", opclass %d%s, optype: %s, " 156 "cookie: %p,\n\t\taux: %p, auxlen: %zu, pid: %d, lwpid: %d\n", 157 preq->preq_id, PUFFSOP_OPCLASS(preq->preq_opclass), 158 PUFFSOP_WANTREPLY(preq->preq_opclass) ? "" : " (FAF)", 159 map[preq->preq_optype], preq->preq_cookie, 160 preq->preq_buf, preq->preq_buflen, 161 preq->preq_pid, preq->preq_lid); 162 163 if (isvn) { 164 switch (preq->preq_optype) { 165 case PUFFS_VN_LOOKUP: 166 puffsdump_lookup(preq); 167 break; 168 case PUFFS_VN_READ: 169 case PUFFS_VN_WRITE: 170 puffsdump_readwrite(preq); 171 break; 172 default: 173 break; 174 } 175 } 176 177 gettimeofday(&tv_now, NULL); 178 timersub(&tv_now, &tv_prev, &tv); 179 printf("\t\tsince previous call: %ld.%06ld\n", tv.tv_sec, tv.tv_usec); 180 gettimeofday(&tv_prev, NULL); 181} 182 183void 184puffsdump_rv(struct puffs_req *preq) 185{ 186 187 printf("\tRV reqid: %" PRIu64 ", result: %d %s\n", 188 preq->preq_id, preq->preq_rv, 189 preq->preq_rv ? strerror(preq->preq_rv) : ""); 190 191#ifdef notyet 192 if (PUFFSOP_OPCLASS(preq->preq_opclass) == PUFFSOP_VN) { 193 switch (preq->preq_optype) { 194 case PUFFS_VN_LOOKUP: 195 puffsdump_lookup_rv(preq); 196 break; 197 default: 198 break; 199 } 200 } 201#endif 202} 203 204void 205puffsdump_cookie(void *c, const char *cookiename) 206{ 207 208 printf("\t%scookie: at %p\n", cookiename, c); 209} 210 211static const char *cn_opnames[] = { 212 "LOOKUP", 213 "CREATE", 214 "DELETE", 215 "RENAME" 216}; 217 218void 219puffsdump_cn(struct puffs_kcn *pkcn) 220{ 221 222 printf("\t\tpuffs_cn: \"%s\", len %zu op %s (flags 0x%x)\n", 223 pkcn->pkcn_name, pkcn->pkcn_namelen, 224 cn_opnames[pkcn->pkcn_nameiop & NAMEI_OPMASK], 225 pkcn->pkcn_flags); 226} 227 228void 229puffsdump_lookup(struct puffs_req *preq) 230{ 231 struct puffs_vnmsg_lookup *lookup_msg = (void *)preq; 232 233 puffsdump_cn(&lookup_msg->pvnr_cn); 234} 235 236void 237puffsdump_lookup_rv(struct puffs_req *preq) 238{ 239 struct puffs_vnmsg_lookup *lookup_msg = (void *)preq; 240 241 printf("\t\tnew node %p, type 0x%x,\n\t\tsize 0x%"PRIu64", dev 0x%x\n", 242 lookup_msg->pvnr_newnode, lookup_msg->pvnr_vtype, 243 lookup_msg->pvnr_size, lookup_msg->pvnr_rdev); 244} 245 246void 247puffsdump_readwrite(struct puffs_req *preq) 248{ 249 struct puffs_vnmsg_rw *rw_msg = (void *)preq; 250 251 printf("\t\toffset: %" PRId64 ", resid %zu, ioflag 0x%x\n", 252 rw_msg->pvnr_offset, rw_msg->pvnr_resid, rw_msg->pvnr_ioflag); 253} 254 255void 256/*ARGSUSED*/ 257puffsdump_creds(struct puffs_cred *pcr) 258{ 259 260} 261 262void 263puffsdump_int(int value, const char *name) 264{ 265 266 printf("\tint (%s): %d\n", name, value); 267} 268