diff options
Diffstat (limited to 'dialects/freebsd/dnode2.c')
-rw-r--r-- | dialects/freebsd/dnode2.c | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/dialects/freebsd/dnode2.c b/dialects/freebsd/dnode2.c new file mode 100644 index 0000000..2ea9d24 --- /dev/null +++ b/dialects/freebsd/dnode2.c @@ -0,0 +1,153 @@ +/* + * dnode2.c - FreeBSD ZFS node functions for lsof + * + * This module must be separate to permit use of the OpenSolaris ZFS header + * files. + */ + + +/* + * Copyright 2008 Purdue Research Foundation, West Lafayette, Indiana + * 47907. All rights reserved. + * + * Written by Victor A. Abell + * + * This software is not subject to any license of the American Telephone + * and Telegraph Company or the Regents of the University of California. + * + * Permission is granted to anyone to use this software for any purpose on + * any computer system, and to alter it and redistribute it freely, subject + * to the following restrictions: + * + * 1. Neither the authors nor Purdue University are responsible for any + * consequences of the use of this software. + * + * 2. The origin of this software must not be misrepresented, either by + * explicit claim or by omission. Credit to the authors and Purdue + * University must appear in documentation and sources. + * + * 3. Altered versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 4. This notice may not be removed or altered. + */ + +#ifndef lint +static char copyright[] = +"@(#) Copyright 2008 Purdue Research Foundation.\nAll rights reserved.\n"; +static char *rcsid = "$Id: dnode2.c,v 1.5 2014/10/13 22:25:07 abe Exp $"; +#endif + + +#if defined(HAS_ZFS) + +#define _KERNEL + +# if defined(__clang__) +/* + * A clang workaround... + * + * Note: clang's complaint about VOP_FSYNC can't be avoided. + */ +#define VOP_UNLOCK(vp, f) ((void)0) +# endif /* defined(__clang__) */ + +#include <sys/zfs_znode.h> +#undef _KERNEL + +#include "dzfs.h" + + +/* + * readzfsnode() -- read the ZFS node + */ + +char * +readzfsnode(za, zi, vr) + KA_T za; /* ZFS node address */ + zfs_info_t *zi; /* return ZFS info structure pointer */ + int vr; /* vnode's (v_flag & VROOT) */ +{ + struct znode zn; /* ZFS node */ + +# if defined(HAS_Z_PHYS) + znode_phys_t zp; /* ZFS physical node */ +# else /* !defined(HAS_Z_PHYS) */ + KA_T ka; /* temporary kernel address */ + zfsvfs_t zv; /* znode's zfsvfs structure */ +# endif /* defined(HAS_Z_PHYS) */ + + memset((void *)zi, 0, sizeof(zfs_info_t)); + if (!za + || kread(za, (char *)&zn, sizeof(zn)) + ) { + if (!za) + return("No ZFS node address"); + return("Can't read znode"); + } +/* + * Return items contained in the znode. + */ + zi->ino = (INODETYPE)zn.z_id; + zi->ino_def = 1; + +# if !defined(HAS_V_LOCKF) + zi->lockf = (KA_T)zn.z_lockf; +# endif /* !defined(HAS_V_LOCKF) */ + +# if defined(HAS_Z_PHYS) +/* + * If the physical znode exists in this ZFS implementation, read it. + */ + if (!zn.z_phys + || kread((KA_T)zn.z_phys, (char *)&zp, sizeof(zp)) + ) { + if (!zn.z_phys) + return("No physical znode address"); + return("Can't read physical znode"); + } +/* + * Return items contained in the physical znode. + */ + zi->nl = (long)zp.zp_links; + zi->rdev = zp.zp_rdev; + zi->sz = (SZOFFTYPE)zp.zp_size; + zi->nl_def = zi->rdev_def = zi->sz_def = 1; +# else /* !defined(HAS_Z_PHYS) */ +/* + * If this implementation has no physical znode, return items now contained + * in the znode. + */ + zi->nl = (long)zn.z_links; + if (vr && (ka = (KA_T)zn.z_zfsvfs)) { + if (!kread(ka, (char *)&zv, sizeof(zv))) { + if ((zn.z_id == zv.z_root) + && (zv.z_ctldir != NULL) + && (zv.z_show_ctldir) + ) { + zi->nl++; + } + } + } + zi->sz = (SZOFFTYPE)zn.z_size; + zi->nl_def = zi->sz_def = 1; +# endif /* defined(HAS_Z_PHYS) */ + + return((char *)NULL); +} + + + + +# if defined(__GNUC__) && defined(HAS_CV_TIMEDWAIT_SBT) +/* + * A gcc work-around + */ + +int _cv_timedwait_sbt(struct cv *cvp, struct lock_object *lock, + sbintime_t sbt, sbintime_t pr, int flags) +{ + return(0); +} +# endif /* defined(__GNUC__) && HAS_CV_TIMEDWAIT_SBT */ +#endif /* defined(HAS_ZFS) */ |