diff options
Diffstat (limited to 'lib/libprocstat/zfs.c')
-rw-r--r-- | lib/libprocstat/zfs.c | 50 |
1 files changed, 25 insertions, 25 deletions
diff --git a/lib/libprocstat/zfs.c b/lib/libprocstat/zfs.c index 422f923ac15c..6dc23d7573fd 100644 --- a/lib/libprocstat/zfs.c +++ b/lib/libprocstat/zfs.c @@ -26,37 +26,36 @@ * SUCH DAMAGE. */ -#include <stdbool.h> - #include <sys/param.h> -#define _KERNEL +#define _WANT_MOUNT #include <sys/mount.h> -#undef _KERNEL #include <sys/queue.h> #include <sys/stat.h> #include <sys/sysctl.h> #include <sys/time.h> #include <sys/vnode.h> +#define _WANT_ZNODE +#include <sys/zfs_context.h> +#include <sys/zfs_znode.h> #include <netinet/in.h> #include <err.h> #include <kvm.h> +#include <stdbool.h> #include <stdio.h> #include <stdlib.h> #define ZFS #include "libprocstat.h" #include "common_kvm.h" -#include "zfs_defs.h" int zfs_filestat(kvm_t *kd, struct vnode *vp, struct vnstat *vn) { struct mount mount, *mountptr; - void *znodeptr; - char *dataptr; + znode_t *kznodeptr, *znode; size_t len; int size; @@ -65,27 +64,30 @@ zfs_filestat(kvm_t *kd, struct vnode *vp, struct vnstat *vn) warnx("error getting sysctl"); return (1); } - dataptr = malloc(size); - if (dataptr == NULL) { + znode = malloc(size); + if (znode == NULL) { warnx("error allocating memory for znode storage"); return (1); } - if ((size_t)size < offsetof_z_id + sizeof(uint64_t) || - (size_t)size < offsetof_z_mode + sizeof(mode_t) || - (size_t)size < offsetof_z_size + sizeof(uint64_t)) { + if ((size_t)size != sizeof(znode_t)) + warnx("znode_t size mismatch, data could be wrong"); + + if ((size_t)size < offsetof(znode_t, z_id) + sizeof(znode->z_id) || + (size_t)size < offsetof(znode_t, z_mode) + sizeof(znode->z_mode) || + (size_t)size < offsetof(znode_t, z_size) + sizeof(znode->z_size)) { warnx("znode_t size is too small"); goto bad; } - if ((size_t)size != sizeof_znode_t) - warnx("znode_t size mismatch, data could be wrong"); - - /* Since we have problems including vnode.h, we'll use the wrappers. */ - znodeptr = getvnodedata(vp); - if (!kvm_read_all(kd, (unsigned long)znodeptr, dataptr, - (size_t)size)) { - warnx("can't read znode at %p", (void *)znodeptr); + /* + * OpenZFS's libspl provides a dummy sys/vnode.h that shadows ours so + * struct vnode is an incomplete type. Use the wrapper until that is + * resolved. + */ + kznodeptr = getvnodedata(vp); + if (!kvm_read_all(kd, (unsigned long)kznodeptr, znode, (size_t)size)) { + warnx("can't read znode at %p", (void *)kznodeptr); goto bad; } @@ -101,12 +103,10 @@ zfs_filestat(kvm_t *kd, struct vnode *vp, struct vnstat *vn) * under .zfs/. */ vn->vn_fsid = mount.mnt_stat.f_fsid.val[0]; - vn->vn_fileid = *(uint64_t *)(void *)(dataptr + offsetof_z_id); - vn->vn_mode = *(mode_t *)(void *)(dataptr + offsetof_z_mode); - vn->vn_size = *(uint64_t *)(void *)(dataptr + offsetof_z_size); - free(dataptr); + vn->vn_fileid = znode->z_id; + vn->vn_mode = znode->z_mode; + vn->vn_size = znode->z_size; return (0); bad: - free(dataptr); return (1); } |