Module Name: src Committed By: hannken Date: Thu Nov 3 11:04:21 UTC 2016
Modified Files: src/sys/kern: vfs_subr.c vfs_vnode.c src/sys/sys: vnode_impl.h Log Message: Add a function to print the fields of a vnode including its implementation and use it from vprint() and vfs_vnode_print(). Move vstate_name() to vfs_subr.c. To generate a diff of this commit: cvs rdiff -u -r1.450 -r1.451 src/sys/kern/vfs_subr.c cvs rdiff -u -r1.58 -r1.59 src/sys/kern/vfs_vnode.c cvs rdiff -u -r1.1 -r1.2 src/sys/sys/vnode_impl.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/vfs_subr.c diff -u src/sys/kern/vfs_subr.c:1.450 src/sys/kern/vfs_subr.c:1.451 --- src/sys/kern/vfs_subr.c:1.450 Thu Nov 3 11:03:31 2016 +++ src/sys/kern/vfs_subr.c Thu Nov 3 11:04:21 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: vfs_subr.c,v 1.450 2016/11/03 11:03:31 hannken Exp $ */ +/* $NetBSD: vfs_subr.c,v 1.451 2016/11/03 11:04:21 hannken Exp $ */ /*- * Copyright (c) 1997, 1998, 2004, 2005, 2007, 2008 The NetBSD Foundation, Inc. @@ -68,7 +68,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: vfs_subr.c,v 1.450 2016/11/03 11:03:31 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vfs_subr.c,v 1.451 2016/11/03 11:04:21 hannken Exp $"); #ifdef _KERNEL_OPT #include "opt_ddb.h" @@ -1056,13 +1056,78 @@ vattr_null(struct vattr *vap) vap->va_bytes = VNOVAL; } +/* + * Vnode state to string. + */ +const char * +vstate_name(enum vnode_state state) +{ + + switch (state) { + case VS_MARKER: + return "MARKER"; + case VS_LOADING: + return "LOADING"; + case VS_ACTIVE: + return "ACTIVE"; + case VS_BLOCKED: + return "BLOCKED"; + case VS_RECLAIMING: + return "RECLAIMING"; + case VS_RECLAIMED: + return "RECLAIMED"; + default: + return "ILLEGAL"; + } +} + +/* + * Print a description of a vnode (common part). + */ +static void +vprint_common(struct vnode *vp, const char *prefix, + void (*pr)(const char *, ...) __printflike(1, 2)) +{ + int n; + char bf[96]; + const uint8_t *cp; + vnode_impl_t *node; + const char * const vnode_tags[] = { VNODE_TAGS }; + const char * const vnode_types[] = { VNODE_TYPES }; + const char vnode_flagbits[] = VNODE_FLAGBITS; + #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof(arr[0])) #define ARRAY_PRINT(idx, arr) \ ((unsigned int)(idx) < ARRAY_SIZE(arr) ? (arr)[(idx)] : "UNKNOWN") -const char * const vnode_tags[] = { VNODE_TAGS }; -const char * const vnode_types[] = { VNODE_TYPES }; -const char vnode_flagbits[] = VNODE_FLAGBITS; + node = VNODE_TO_VIMPL(vp); + + snprintb(bf, sizeof(bf), + vnode_flagbits, vp->v_iflag | vp->v_vflag | vp->v_uflag); + + (*pr)("vnode %p flags %s\n", vp, bf); + (*pr)("%stag %s(%d) type %s(%d) mount %p typedata %p\n", prefix, + ARRAY_PRINT(vp->v_tag, vnode_tags), vp->v_tag, + ARRAY_PRINT(vp->v_type, vnode_types), vp->v_type, + vp->v_mount, vp->v_mountedhere); + (*pr)("%susecount %d writecount %d holdcount %d\n", prefix, + vp->v_usecount, vp->v_writecount, vp->v_holdcnt); + (*pr)("%ssize %" PRIx64 " writesize %" PRIx64 " numoutput %d\n", + prefix, vp->v_size, vp->v_writesize, vp->v_numoutput); + (*pr)("%sfreelisthd %p data %p lock %p\n", prefix, + vp->v_freelisthd, vp->v_data, &vp->v_lock); + + (*pr)("%sstate %s key(%p %zd)", prefix, vstate_name(node->vi_state), + node->vi_key.vk_mount, node->vi_key.vk_key_len); + n = node->vi_key.vk_key_len; + cp = node->vi_key.vk_key; + while (n-- > 0) + (*pr)(" %02x", *cp++); + (*pr)("\n"); + +#undef ARRAY_PRINT +#undef ARRAY_SIZE +} /* * Print out a description of a vnode. @@ -1070,22 +1135,10 @@ const char vnode_flagbits[] = VNODE_FLAG void vprint(const char *label, struct vnode *vp) { - char bf[96]; - int flag; - - flag = vp->v_iflag | vp->v_vflag | vp->v_uflag; - snprintb(bf, sizeof(bf), vnode_flagbits, flag); if (label != NULL) printf("%s: ", label); - printf("vnode @ %p, flags (%s)\n\ttag %s(%d), type %s(%d), " - "usecount %d, writecount %d, holdcount %d\n" - "\tfreelisthd %p, mount %p, data %p lock %p\n", - vp, bf, ARRAY_PRINT(vp->v_tag, vnode_tags), vp->v_tag, - ARRAY_PRINT(vp->v_type, vnode_types), vp->v_type, - vp->v_usecount, vp->v_writecount, vp->v_holdcnt, - vp->v_freelisthd, vp->v_mount, vp->v_data, &vp->v_lock); - vcache_print(vp, "\t", printf); + vprint_common(vp, "\t", printf); if (vp->v_data != NULL) { printf("\t"); VOP_PRINT(vp); @@ -1463,27 +1516,10 @@ vfs_buf_print(struct buf *bp, int full, void vfs_vnode_print(struct vnode *vp, int full, void (*pr)(const char *, ...)) { - char bf[256]; uvm_object_printit(&vp->v_uobj, full, pr); - snprintb(bf, sizeof(bf), - vnode_flagbits, vp->v_iflag | vp->v_vflag | vp->v_uflag); - (*pr)("\nVNODE flags %s\n", bf); - (*pr)("mp %p numoutput %d size 0x%llx writesize 0x%llx\n", - vp->v_mount, vp->v_numoutput, vp->v_size, vp->v_writesize); - - (*pr)("data %p writecount %ld holdcnt %ld\n", - vp->v_data, vp->v_writecount, vp->v_holdcnt); - - (*pr)("tag %s(%d) type %s(%d) mount %p typedata %p\n", - ARRAY_PRINT(vp->v_tag, vnode_tags), vp->v_tag, - ARRAY_PRINT(vp->v_type, vnode_types), vp->v_type, - vp->v_mount, vp->v_mountedhere); - - (*pr)("v_lock %p\n", &vp->v_lock); - - vcache_print(vp, "", pr); - + (*pr)("\n"); + vprint_common(vp, "", printf); if (full) { struct buf *bp; Index: src/sys/kern/vfs_vnode.c diff -u src/sys/kern/vfs_vnode.c:1.58 src/sys/kern/vfs_vnode.c:1.59 --- src/sys/kern/vfs_vnode.c:1.58 Thu Nov 3 11:03:31 2016 +++ src/sys/kern/vfs_vnode.c Thu Nov 3 11:04:21 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: vfs_vnode.c,v 1.58 2016/11/03 11:03:31 hannken Exp $ */ +/* $NetBSD: vfs_vnode.c,v 1.59 2016/11/03 11:04:21 hannken Exp $ */ /*- * Copyright (c) 1997-2011 The NetBSD Foundation, Inc. @@ -156,7 +156,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: vfs_vnode.c,v 1.58 2016/11/03 11:03:31 hannken Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vfs_vnode.c,v 1.59 2016/11/03 11:04:21 hannken Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -232,28 +232,6 @@ extern struct vfsops dead_vfsops; /* Vnode state operations and diagnostics. */ -static const char * -vstate_name(enum vnode_state state) -{ - - switch (state) { - case VS_MARKER: - return "MARKER"; - case VS_LOADING: - return "LOADING"; - case VS_ACTIVE: - return "ACTIVE"; - case VS_BLOCKED: - return "BLOCKED"; - case VS_RECLAIMING: - return "RECLAIMING"; - case VS_RECLAIMED: - return "RECLAIMED"; - default: - return "ILLEGAL"; - } -} - #if defined(DIAGNOSTIC) #define VSTATE_GET(vp) \ @@ -1577,27 +1555,6 @@ vcache_reclaim(vnode_t *vp) } /* - * Print a vcache node. - */ -void -vcache_print(vnode_t *vp, const char *prefix, void (*pr)(const char *, ...)) -{ - int n; - const uint8_t *cp; - vnode_impl_t *node; - - node = VNODE_TO_VIMPL(vp); - n = node->vi_key.vk_key_len; - cp = node->vi_key.vk_key; - - (*pr)("%sstate %s, key(%d)", prefix, vstate_name(node->vi_state), n); - - while (n-- > 0) - (*pr)(" %02x", *cp++); - (*pr)("\n"); -} - -/* * Update outstanding I/O count and do wakeup if requested. */ void Index: src/sys/sys/vnode_impl.h diff -u src/sys/sys/vnode_impl.h:1.1 src/sys/sys/vnode_impl.h:1.2 --- src/sys/sys/vnode_impl.h:1.1 Thu Nov 3 11:03:31 2016 +++ src/sys/sys/vnode_impl.h Thu Nov 3 11:04:21 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: vnode_impl.h,v 1.1 2016/11/03 11:03:31 hannken Exp $ */ +/* $NetBSD: vnode_impl.h,v 1.2 2016/11/03 11:04:21 hannken Exp $ */ /*- * Copyright (c) 2016 The NetBSD Foundation, Inc. @@ -61,11 +61,11 @@ typedef struct vnode_impl vnode_impl_t; /* * Vnode manipulation functions. */ +const char * + vstate_name(enum vnode_state); vnode_t * vnalloc_marker(struct mount *); void vnfree_marker(vnode_t *); bool vnis_marker(vnode_t *); -void vcache_print(vnode_t *, const char *, - void (*)(const char *, ...) __printflike(1, 2)); #endif /* !_SYS_VNODE_IMPL_H_ */