Home | History | Annotate | Line # | Download | only in libpuffs
opdump.c revision 1.13.2.1
      1  1.13.2.1      matt /*	$NetBSD: opdump.c,v 1.13.2.1 2007/11/06 23:11:52 matt Exp $	*/
      2       1.1     pooka 
      3       1.1     pooka /*
      4       1.1     pooka  * Copyright (c) 2005, 2006  Antti Kantee.  All Rights Reserved.
      5       1.1     pooka  *
      6       1.1     pooka  * Development of this software was supported by the
      7       1.1     pooka  * Google Summer of Code program and the Ulla Tuominen Foundation.
      8       1.1     pooka  * The Google SoC project was mentored by Bill Studenmund.
      9       1.1     pooka  *
     10       1.1     pooka  * Redistribution and use in source and binary forms, with or without
     11       1.1     pooka  * modification, are permitted provided that the following conditions
     12       1.1     pooka  * are met:
     13       1.1     pooka  * 1. Redistributions of source code must retain the above copyright
     14       1.1     pooka  *    notice, this list of conditions and the following disclaimer.
     15       1.1     pooka  * 2. Redistributions in binary form must reproduce the above copyright
     16       1.1     pooka  *    notice, this list of conditions and the following disclaimer in the
     17       1.1     pooka  *    documentation and/or other materials provided with the distribution.
     18       1.1     pooka  *
     19       1.1     pooka  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
     20       1.1     pooka  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     21       1.1     pooka  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     22       1.1     pooka  * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     23       1.1     pooka  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     24       1.1     pooka  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
     25       1.1     pooka  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     26       1.1     pooka  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     27       1.1     pooka  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     28       1.1     pooka  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     29       1.1     pooka  * SUCH DAMAGE.
     30       1.1     pooka  */
     31       1.1     pooka 
     32       1.1     pooka /* Pretty-printing helper routines for VFS/VOP request contents */
     33       1.1     pooka 
     34      1.11     pooka /* yes, this is pretty much a mess */
     35      1.11     pooka 
     36       1.1     pooka #include <sys/cdefs.h>
     37       1.1     pooka #if !defined(lint)
     38  1.13.2.1      matt __RCSID("$NetBSD: opdump.c,v 1.13.2.1 2007/11/06 23:11:52 matt Exp $");
     39       1.1     pooka #endif /* !lint */
     40       1.1     pooka 
     41      1.11     pooka #include <sys/types.h>
     42      1.11     pooka #include <sys/time.h>
     43      1.11     pooka 
     44       1.1     pooka #include <puffs.h>
     45       1.1     pooka #include <puffsdump.h>
     46       1.1     pooka #include <stdio.h>
     47       1.1     pooka 
     48  1.13.2.1      matt #include "puffs_priv.h"
     49  1.13.2.1      matt 
     50       1.1     pooka /* XXX! */
     51       1.4     pooka const char *vfsop_revmap[] = {
     52       1.4     pooka 	"PUFFS_VFS_MOUNT",
     53       1.4     pooka 	"PUFFS_VFS_START",
     54       1.4     pooka 	"PUFFS_VFS_UNMOUNT",
     55       1.4     pooka 	"PUFFS_VFS_ROOT",
     56       1.4     pooka 	"PUFFS_VFS_STATVFS",
     57       1.4     pooka 	"PUFFS_VFS_SYNC",
     58       1.4     pooka 	"PUFFS_VFS_VGET",
     59       1.4     pooka 	"PUFFS_VFS_FHTOVP",
     60       1.4     pooka 	"PUFFS_VFS_VPTOFH",
     61       1.4     pooka 	"PUFFS_VFS_INIT",
     62       1.4     pooka 	"PUFFS_VFS_DONE",
     63       1.4     pooka 	"PUFFS_VFS_SNAPSHOT",
     64       1.7     pooka 	"PUFFS_VFS_EXTATTCTL",
     65       1.7     pooka 	"PUFFS_VFS_SUSPEND"
     66       1.4     pooka };
     67       1.4     pooka /* XXX! */
     68       1.1     pooka const char *vnop_revmap[] = {
     69       1.4     pooka 	"PUFFS_VN_LOOKUP",
     70       1.4     pooka 	"PUFFS_VN_CREATE",
     71       1.4     pooka 	"PUFFS_VN_MKNOD",
     72       1.4     pooka 	"PUFFS_VN_OPEN",
     73       1.4     pooka 	"PUFFS_VN_CLOSE",
     74       1.4     pooka 	"PUFFS_VN_ACCESS",
     75       1.4     pooka 	"PUFFS_VN_GETATTR",
     76       1.4     pooka 	"PUFFS_VN_SETATTR",
     77       1.4     pooka 	"PUFFS_VN_READ",
     78       1.4     pooka 	"PUFFS_VN_WRITE",
     79       1.4     pooka 	"PUFFS_VN_IOCTL",
     80       1.4     pooka 	"PUFFS_VN_FCNTL",
     81       1.4     pooka 	"PUFFS_VN_POLL",
     82       1.4     pooka 	"PUFFS_VN_KQFILTER",
     83       1.4     pooka 	"PUFFS_VN_REVOKE",
     84       1.4     pooka 	"PUFFS_VN_MMAP",
     85       1.4     pooka 	"PUFFS_VN_FSYNC",
     86       1.4     pooka 	"PUFFS_VN_SEEK",
     87       1.4     pooka 	"PUFFS_VN_REMOVE",
     88       1.4     pooka 	"PUFFS_VN_LINK",
     89       1.4     pooka 	"PUFFS_VN_RENAME",
     90       1.4     pooka 	"PUFFS_VN_MKDIR",
     91       1.4     pooka 	"PUFFS_VN_RMDIR",
     92       1.4     pooka 	"PUFFS_VN_SYMLINK",
     93       1.4     pooka 	"PUFFS_VN_READDIR",
     94       1.4     pooka 	"PUFFS_VN_READLINK",
     95       1.4     pooka 	"PUFFS_VN_ABORTOP",
     96       1.4     pooka 	"PUFFS_VN_INACTIVE",
     97       1.4     pooka 	"PUFFS_VN_RECLAIM",
     98       1.4     pooka 	"PUFFS_VN_LOCK",
     99       1.4     pooka 	"PUFFS_VN_UNLOCK",
    100       1.4     pooka 	"PUFFS_VN_BMAP",
    101       1.4     pooka 	"PUFFS_VN_STRATEGY",
    102       1.4     pooka 	"PUFFS_VN_PRINT",
    103       1.4     pooka 	"PUFFS_VN_ISLOCKED",
    104       1.4     pooka 	"PUFFS_VN_PATHCONF",
    105       1.4     pooka 	"PUFFS_VN_ADVLOCK",
    106       1.4     pooka 	"PUFFS_VN_LEASE",
    107       1.4     pooka 	"PUFFS_VN_WHITEOUT",
    108       1.4     pooka 	"PUFFS_VN_GETPAGES",
    109       1.4     pooka 	"PUFFS_VN_PUTPAGES",
    110       1.4     pooka 	"PUFFS_VN_BWRITE",
    111       1.4     pooka 	"PUFFS_VN_GETEXTATTR",
    112       1.4     pooka 	"PUFFS_VN_LISTEXTATTR",
    113       1.4     pooka 	"PUFFS_VN_OPENEXTATTR",
    114       1.4     pooka 	"PUFFS_VN_DELETEEXTATTR",
    115       1.4     pooka 	"PUFFS_VN_SETEXTATTR",
    116       1.1     pooka };
    117  1.13.2.1      matt /* XXX! */
    118       1.9     pooka const char *cacheop_revmap[] = {
    119       1.9     pooka 	"PUFFS_CACHE_WRITE"
    120       1.9     pooka };
    121  1.13.2.1      matt /* XXX! */
    122  1.13.2.1      matt const char *errnot_revmap[] = {
    123  1.13.2.1      matt 	"PUFFS_ERR_MAKENODE",
    124  1.13.2.1      matt 	"PUFFS_ERR_LOOKUP",
    125  1.13.2.1      matt 	"PUFFS_ERR_READDIR",
    126  1.13.2.1      matt 	"PUFFS_ERR_READLINK",
    127  1.13.2.1      matt 	"PUFFS_ERR_READ",
    128  1.13.2.1      matt 	"PUFFS_ERR_WRITE",
    129  1.13.2.1      matt 	"PUFFS_ERR_VPTOFH"
    130  1.13.2.1      matt };
    131       1.1     pooka 
    132       1.1     pooka void
    133       1.1     pooka puffsdump_req(struct puffs_req *preq)
    134       1.1     pooka {
    135      1.11     pooka 	static struct timeval tv_prev;
    136      1.11     pooka 	struct timeval tv_now, tv;
    137       1.4     pooka 	const char **map;
    138      1.12     pooka 	int isvn = 0;
    139       1.1     pooka 
    140       1.9     pooka 	map = NULL; /* yes, we are all interested in your opinion, gcc */
    141       1.9     pooka 	switch (PUFFSOP_OPCLASS(preq->preq_opclass)) {
    142       1.9     pooka 	case PUFFSOP_VFS:
    143       1.9     pooka 		map = vfsop_revmap;
    144       1.9     pooka 		break;
    145       1.9     pooka 	case PUFFSOP_VN:
    146       1.9     pooka 		map = vnop_revmap;
    147      1.12     pooka 		isvn = 1;
    148       1.9     pooka 		break;
    149       1.9     pooka 	case PUFFSOP_CACHE:
    150       1.9     pooka 		map = cacheop_revmap;
    151       1.9     pooka 		break;
    152  1.13.2.1      matt 	case PUFFSOP_ERROR:
    153  1.13.2.1      matt 		map = errnot_revmap;
    154  1.13.2.1      matt 		break;
    155       1.9     pooka 	}
    156      1.11     pooka 
    157       1.8     pooka 	printf("\treqid: %" PRIu64 ", opclass %d%s, optype: %s, "
    158  1.13.2.1      matt 	    "cookie: %p,\n\t\taux: %p, auxlen: %zu, pid: %d, lwpid: %d\n",
    159       1.5     pooka 	    preq->preq_id, PUFFSOP_OPCLASS(preq->preq_opclass),
    160       1.5     pooka 	    PUFFSOP_WANTREPLY(preq->preq_opclass) ? "" : " (FAF)",
    161       1.5     pooka 	    map[preq->preq_optype], preq->preq_cookie,
    162  1.13.2.1      matt 	    preq->preq_buf, preq->preq_buflen,
    163  1.13.2.1      matt 	    preq->preq_pid, preq->preq_lid);
    164      1.12     pooka 
    165      1.12     pooka 	if (isvn) {
    166      1.12     pooka 		switch (preq->preq_optype) {
    167      1.13     pooka 		case PUFFS_VN_LOOKUP:
    168      1.13     pooka 			puffsdump_lookup(preq);
    169      1.13     pooka 			break;
    170      1.12     pooka 		case PUFFS_VN_READ:
    171      1.12     pooka 		case PUFFS_VN_WRITE:
    172      1.12     pooka 			puffsdump_readwrite(preq);
    173      1.12     pooka 			break;
    174      1.12     pooka 		default:
    175      1.12     pooka 			break;
    176      1.12     pooka 		}
    177      1.12     pooka 	}
    178      1.11     pooka 
    179  1.13.2.1      matt 	PU_LOCK();
    180      1.11     pooka 	gettimeofday(&tv_now, NULL);
    181      1.11     pooka 	timersub(&tv_now, &tv_prev, &tv);
    182      1.11     pooka 	printf("\t\tsince previous call: %ld.%06ld\n", tv.tv_sec, tv.tv_usec);
    183      1.11     pooka 	gettimeofday(&tv_prev, NULL);
    184  1.13.2.1      matt 	PU_UNLOCK();
    185       1.1     pooka }
    186       1.1     pooka 
    187       1.1     pooka void
    188       1.8     pooka puffsdump_rv(struct puffs_req *preq)
    189       1.8     pooka {
    190       1.8     pooka 
    191       1.8     pooka 	printf("\tRV reqid: %" PRIu64 ", result: %d %s\n",
    192       1.8     pooka 	    preq->preq_id, preq->preq_rv,
    193       1.8     pooka 	    preq->preq_rv ? strerror(preq->preq_rv) : "");
    194      1.13     pooka 
    195      1.13     pooka #ifdef notyet
    196      1.13     pooka 	if (PUFFSOP_OPCLASS(preq->preq_opclass) == PUFFSOP_VN) {
    197      1.13     pooka 		switch (preq->preq_optype) {
    198      1.13     pooka 		case PUFFS_VN_LOOKUP:
    199      1.13     pooka 			puffsdump_lookup_rv(preq);
    200      1.13     pooka 			break;
    201      1.13     pooka 		default:
    202      1.13     pooka 			break;
    203      1.13     pooka 		}
    204      1.13     pooka 	}
    205      1.13     pooka #endif
    206       1.8     pooka }
    207       1.8     pooka 
    208       1.8     pooka void
    209       1.1     pooka puffsdump_cookie(void *c, const char *cookiename)
    210       1.1     pooka {
    211       1.1     pooka 
    212       1.1     pooka 	printf("\t%scookie: at %p\n", cookiename, c);
    213       1.1     pooka }
    214       1.1     pooka 
    215       1.1     pooka static const char *cn_opnames[] = {
    216       1.1     pooka 	"LOOKUP",
    217       1.1     pooka 	"CREATE",
    218       1.1     pooka 	"DELETE",
    219       1.1     pooka 	"RENAME"
    220       1.1     pooka };
    221      1.13     pooka 
    222       1.1     pooka void
    223      1.13     pooka puffsdump_cn(struct puffs_kcn *pkcn)
    224       1.1     pooka {
    225       1.1     pooka 
    226      1.13     pooka 	printf("\t\tpuffs_cn: \"%s\", len %zu op %s (flags 0x%x)\n",
    227      1.13     pooka 	    pkcn->pkcn_name, pkcn->pkcn_namelen,
    228      1.13     pooka 	    cn_opnames[pkcn->pkcn_nameiop & NAMEI_OPMASK],
    229      1.13     pooka 	    pkcn->pkcn_flags);
    230      1.13     pooka }
    231      1.13     pooka 
    232      1.13     pooka void
    233      1.13     pooka puffsdump_lookup(struct puffs_req *preq)
    234      1.13     pooka {
    235  1.13.2.1      matt 	struct puffs_vnmsg_lookup *lookup_msg = (void *)preq;
    236      1.13     pooka 
    237  1.13.2.1      matt 	puffsdump_cn(&lookup_msg->pvnr_cn);
    238      1.13     pooka }
    239      1.13     pooka 
    240      1.13     pooka void
    241      1.13     pooka puffsdump_lookup_rv(struct puffs_req *preq)
    242      1.13     pooka {
    243  1.13.2.1      matt 	struct puffs_vnmsg_lookup *lookup_msg = (void *)preq;
    244      1.13     pooka 
    245      1.13     pooka 	printf("\t\tnew node %p, type 0x%x,\n\t\tsize 0x%"PRIu64", dev 0x%x\n",
    246  1.13.2.1      matt 	    lookup_msg->pvnr_newnode, lookup_msg->pvnr_vtype,
    247  1.13.2.1      matt 	    lookup_msg->pvnr_size, lookup_msg->pvnr_rdev);
    248       1.1     pooka }
    249       1.1     pooka 
    250       1.1     pooka void
    251      1.12     pooka puffsdump_readwrite(struct puffs_req *preq)
    252      1.12     pooka {
    253  1.13.2.1      matt 	struct puffs_vnmsg_rw *rw_msg = (void *)preq;
    254      1.12     pooka 
    255      1.12     pooka 	printf("\t\toffset: %" PRId64 ", resid %zu, ioflag 0x%x\n",
    256  1.13.2.1      matt 	    rw_msg->pvnr_offset, rw_msg->pvnr_resid, rw_msg->pvnr_ioflag);
    257      1.12     pooka }
    258      1.12     pooka 
    259      1.12     pooka void
    260       1.2  christos /*ARGSUSED*/
    261       1.1     pooka puffsdump_creds(struct puffs_cred *pcr)
    262       1.1     pooka {
    263       1.1     pooka 
    264       1.1     pooka }
    265       1.1     pooka 
    266       1.1     pooka void
    267       1.1     pooka puffsdump_int(int value, const char *name)
    268       1.1     pooka {
    269       1.1     pooka 
    270       1.1     pooka 	printf("\tint (%s): %d\n", name, value);
    271       1.1     pooka }
    272