blob: 55c3918b291d4410e495385353dc511543b26b57 [file] [log] [blame]
/*
* 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.3 2011/08/07 22:51:28 abe Exp $";
#endif
#if defined(HAS_ZFS)
#define _KERNEL
#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);
}
#endif /* defined(HAS_ZFS) */