$NetBSD: patch-ad,v 1.14 2007/11/21 11:01:55 apb Exp $ --- dialects/n+obsd/dnode.c.orig 2007-04-24 18:22:06.000000000 +0200 +++ dialects/n+obsd/dnode.c @@ -38,6 +38,9 @@ static char *rcsid = "$Id: dnode.c,v 1.3 #include "lsof.h" +#if __NetBSD_Version__ > 399001800 +#define NOLOCKF +#endif #if defined(HAS_DINODE_U) #define DINODE_U dinode_u @@ -194,12 +197,17 @@ process_node(va) unsigned char ns; unsigned char rdevs; char *ep, *ty; +#ifndef NOLOCKF struct lockf lf, *lff, *lfp; +#endif struct inode i; struct mfsnode m; +#if defined(HASTMPFS) + struct tmpfs_node tmp; +#endif /* defined(HASTMPFS) */ struct nfsnode n; enum nodetype {NONODE, CDFSNODE, DOSNODE, EXT2NODE, FDESCNODE, INODE, - KERNFSNODE, MFSNODE, NFSNODE, PFSNODE, PTYFSNODE} nty; + KERNFSNODE, MFSNODE, NFSNODE, PFSNODE, PTYFSNODE, TMPFSNODE} nty; enum vtype type; struct vnode *v, vb; struct l_vfs *vfs; @@ -414,7 +422,7 @@ process_overlaid_node: */ if (!v->v_data || kread((KA_T)v->v_data, (char *)&kn, sizeof(kn))) { - if (v->v_type != VDIR || !(v->v_flag && VROOT)) { + if (v->v_type != VDIR || !(v->VNODE_VFLAG && NCACHE_VROOT)) { (void) snpf(Namech, Namechl, "can't read kernfs_node at: %s", print_kptr((KA_T)v->v_data, (char *)NULL, 0)); @@ -449,7 +457,7 @@ process_overlaid_node: * size are fixed; otherwise, safely stat() the file to get the * inode number and size. */ - if (v->v_type == VDIR && (v->v_flag & VROOT)) { + if (v->v_type == VDIR && (v->VNODE_VFLAG & NCACHE_VROOT)) { (void) snpf(Namech, Namechl, "%s", _PATH_KERNFS); ksb.st_ino = (ino_t)2; ksb.st_size = DEV_BSIZE; @@ -471,6 +479,19 @@ process_overlaid_node: nty = MFSNODE; break; +#if defined(HASTMPFS) + case VT_TMPFS: + if (!v->v_data + || kread((KA_T)v->v_data, (char *)&tmp, sizeof(tmp))) { + (void) snpf(Namech, Namechl, "can't read tmpfs_node at: %s", + print_kptr((KA_T)v->v_data, (char *)NULL, 0)); + enter_nm(Namech); + return; + } + nty = TMPFSNODE; + break; +#endif /* defined(HASTMPFS) */ + #if defined(HASMSDOSFS) case VT_MSDOSFS: if (!v->v_data @@ -619,6 +640,7 @@ process_overlaid_node: } +#ifndef NOLOCKF if ((lff = i.i_lockf)) { /* @@ -667,6 +689,7 @@ process_overlaid_node: break; } while ((lfp = lf.lf_next) && lfp != lff); } +#endif break; default: if (v->v_type == VBAD || v->v_type == VNON) @@ -900,6 +923,13 @@ process_overlaid_node: break; #endif /* defined(HASPTYFS) */ +#if defined(HASTMPFS) + case TMPFSNODE: + Lf->inode = (INODETYPE)tmp.tn_id; + Lf->inp_ty = 1; + break; +#endif /* defined(HASTMPFS) */ + } /* @@ -1019,6 +1049,13 @@ process_overlaid_node: Lf->sz_def = 1; break; +#if defined(HASTMPFS) + case TMPFSNODE: + Lf->sz = (SZOFFTYPE)tmp.tn_size; + Lf->sz_def = 1; + break; +#endif /* defined(HASTMPFS) */ + #if defined(HASEXT2FS) case EXT2NODE: # if defined(HASI_E2FS_PTR) @@ -1221,6 +1258,9 @@ process_overlaid_node: Lf->dev_def = Lf->rdev_def = 0; (void) snpf(Namech, Namechl, "%#x", m.mfs_baseoff); enter_dev_ch("memory"); + } else if (nty == TMPFSNODE) { + Lf->dev_def = Lf->rdev_def = 0; + enter_dev_ch("memory"); } #if defined(HASPROCFS)