Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/usr.bin/fstat Add basic ZFS support to fstat(1).
details: https://anonhg.NetBSD.org/src/rev/529dc57839b3
branches: trunk
changeset: 367251:529dc57839b3
user: simonb <simonb%NetBSD.org@localhost>
date: Sun Jun 19 11:31:19 2022 +0000
description:
Add basic ZFS support to fstat(1).
XXX: Use a local zfs_znode.h for a znode_t definition because the ZFS
kernel code makes it too hard to include headers from userland.
diffstat:
usr.bin/fstat/Makefile | 8 +++-
usr.bin/fstat/fstat.c | 10 +++-
usr.bin/fstat/fstat.h | 3 +-
usr.bin/fstat/zfs.c | 75 +++++++++++++++++++++++++++++++++
usr.bin/fstat/zfs_znode.h | 103 ++++++++++++++++++++++++++++++++++++++++++++++
5 files changed, 195 insertions(+), 4 deletions(-)
diffs (261 lines):
diff -r 24be88a3b0e6 -r 529dc57839b3 usr.bin/fstat/Makefile
--- a/usr.bin/fstat/Makefile Sun Jun 19 10:33:17 2022 +0000
+++ b/usr.bin/fstat/Makefile Sun Jun 19 11:31:19 2022 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.26 2019/10/13 07:28:15 mrg Exp $
+# $NetBSD: Makefile,v 1.27 2022/06/19 11:31:19 simonb Exp $
# from: @(#)Makefile 8.1 (Berkeley) 6/6/93
.include <bsd.own.mk>
@@ -6,6 +6,9 @@
USE_FORT?= yes # setuid
PROG= fstat
SRCS= fstat.c isofs.c ntfs.c ptyfs.c tmpfs.c misc.c
+.if (${MKZFS} != "no")
+SRCS+= zfs.c
+.endif
DPADD= ${LIBKVM}
LDADD= -lkvm
BINGRP= kmem
@@ -16,6 +19,9 @@
.if (${USE_INET6} != "no")
CPPFLAGS+=-DINET6
.endif
+.if (${MKZFS} != "no")
+CPPFLAGS+=-DHAVE_ZFS
+.endif
CPPFLAGS+=-D_KMEMUSER
LDADD+=-lutil
diff -r 24be88a3b0e6 -r 529dc57839b3 usr.bin/fstat/fstat.c
--- a/usr.bin/fstat/fstat.c Sun Jun 19 10:33:17 2022 +0000
+++ b/usr.bin/fstat/fstat.c Sun Jun 19 11:31:19 2022 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: fstat.c,v 1.114 2020/08/26 23:08:29 christos Exp $ */
+/* $NetBSD: fstat.c,v 1.115 2022/06/19 11:31:19 simonb Exp $ */
/*-
* Copyright (c) 1988, 1993
@@ -39,7 +39,7 @@
#if 0
static char sccsid[] = "@(#)fstat.c 8.3 (Berkeley) 5/2/95";
#else
-__RCSID("$NetBSD: fstat.c,v 1.114 2020/08/26 23:08:29 christos Exp $");
+__RCSID("$NetBSD: fstat.c,v 1.115 2022/06/19 11:31:19 simonb Exp $");
#endif
#endif /* not lint */
@@ -611,6 +611,12 @@
if (!tmpfs_filestat(vp, fsp))
badtype = "error";
break;
+#ifdef HAVE_ZFS
+ case VT_ZFS:
+ if (!zfs_filestat(vp, fsp))
+ badtype = "error";
+ break;
+#endif
case VT_NULL:
case VT_OVERLAY:
case VT_UMAP:
diff -r 24be88a3b0e6 -r 529dc57839b3 usr.bin/fstat/fstat.h
--- a/usr.bin/fstat/fstat.h Sun Jun 19 10:33:17 2022 +0000
+++ b/usr.bin/fstat/fstat.h Sun Jun 19 11:31:19 2022 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: fstat.h,v 1.10 2019/09/06 17:08:22 christos Exp $ */
+/* $NetBSD: fstat.h,v 1.11 2022/06/19 11:31:19 simonb Exp $ */
/*-
* Copyright (c) 1988, 1993
* The Regents of the University of California. All rights reserved.
@@ -60,4 +60,5 @@
int ntfs_filestat(struct vnode *, struct filestat *);
int ptyfs_filestat(struct vnode *, struct filestat *);
int tmpfs_filestat(struct vnode *, struct filestat *);
+int zfs_filestat(struct vnode *, struct filestat *);
void oprint(struct file *, const char *);
diff -r 24be88a3b0e6 -r 529dc57839b3 usr.bin/fstat/zfs.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/usr.bin/fstat/zfs.c Sun Jun 19 11:31:19 2022 +0000
@@ -0,0 +1,75 @@
+/* $NetBSD: zfs.c,v 1.1 2022/06/19 11:31:19 simonb Exp $ */
+
+/*-
+ * Copyright (c) 2022 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Simon Burge.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__RCSID("$NetBSD: zfs.c,v 1.1 2022/06/19 11:31:19 simonb Exp $");
+
+#include <sys/param.h>
+#include <sys/time.h>
+#include <sys/vnode.h>
+#define __EXPOSE_MOUNT
+#include <sys/mount.h>
+
+#include "zfs_znode.h"
+
+#include <kvm.h>
+#include <err.h>
+#include "fstat.h"
+
+int
+zfs_filestat(struct vnode *vp, struct filestat *fsp)
+{
+ znode_t inode;
+ struct mount mt;
+
+ if (!KVM_READ(VTOZ(vp), &inode, sizeof (inode))) {
+ dprintf("can't read inode at %p for pid %d", VTOZ(vp), Pid);
+ return 0;
+ }
+ if (!KVM_READ(vp->v_mount, &mt, sizeof(mt))) {
+ dprintf("can't read mount at %p for pid %d",
+ vp->v_mount, Pid);
+ return 0;
+ }
+ /*
+ * XXX: fsid should be something like
+ * ((struct zfsvfs *)vp->v_mount->mnt_data)->
+ * z_os->os_ds_dataset->ds_fsid_guid
+ * but ZFS headers are pretty much impossible to include
+ * from userland.
+ */
+ fsp->fsid = mt.mnt_stat.f_fsidx.__fsid_val[0];
+ fsp->fileid = inode.z_id;
+ fsp->mode = inode.z_mode;
+ fsp->size = inode.z_size;
+ fsp->rdev = 0;
+ return 1;
+}
diff -r 24be88a3b0e6 -r 529dc57839b3 usr.bin/fstat/zfs_znode.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/usr.bin/fstat/zfs_znode.h Sun Jun 19 11:31:19 2022 +0000
@@ -0,0 +1,103 @@
+/* $NetBSD: zfs_znode.h,v 1.1 2022/06/19 11:31:19 simonb Exp $ */
+
+/*
+ * XXX From: external/cddl/osnet/dist/uts/common/fs/zfs/sys/zfs_znode.h
+ *
+ * Grotty hack to define a "simple" znode_t so we don't need to
+ * try to include the real zfs_znode.h which isn't easily possible
+ * from userland due to all sorts of kernel only defines and structs
+ * being required.
+ */
+
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2015 by Delphix. All rights reserved.
+ * Copyright (c) 2014 Integros [integros.com]
+ */
+
+
+#include <miscfs/genfs/genfs_node.h>
+
+#define VTOZ(VP) ((znode_t *)(VP)->v_data)
+
+#define ulong_t unsigned long
+#define uint_t unsigned int
+#define zfs_acl_t void
+
+struct avl_node;
+typedef struct sa_handle sa_handle_t;
+typedef int boolean_t;
+
+typedef struct avl_tree {
+ struct avl_node *avl_root;
+ int (*avl_compar)(const void *, const void *);
+ size_t avl_offset;
+ ulong_t avl_numnodes;
+ size_t avl_size;
+} avl_tree_t;
+
+typedef struct list_node {
+ struct list_node *list_next;
+ struct list_node *list_prev;
+} list_node_t;
+
+typedef struct znode {
+#ifdef __NetBSD__
+ struct genfs_node z_gnode;
+#endif
+ struct zfsvfs *z_zfsvfs;
+ vnode_t *z_vnode;
+ uint64_t z_id; /* object ID for this znode */
+#ifdef illumos
+ kmutex_t z_lock; /* znode modification lock */
+ krwlock_t z_parent_lock; /* parent lock for directories */
+ krwlock_t z_name_lock; /* "master" lock for dirent locks */
+ zfs_dirlock_t *z_dirlocks; /* directory entry lock list */
+#endif
+ kmutex_t z_range_lock; /* protects changes to z_range_avl */
+ avl_tree_t z_range_avl; /* avl tree of file range locks */
+ uint8_t z_unlinked; /* file has been unlinked */
+ uint8_t z_atime_dirty; /* atime needs to be synced */
+ uint8_t z_zn_prefetch; /* Prefetch znodes? */
+ uint8_t z_moved; /* Has this znode been moved? */
+ uint_t z_blksz; /* block size in bytes */
+ uint_t z_seq; /* modification sequence number */
+ uint64_t z_mapcnt; /* number of pages mapped to file */
+ uint64_t z_gen; /* generation (cached) */
+ uint64_t z_size; /* file size (cached) */
+ uint64_t z_atime[2]; /* atime (cached) */
+ uint64_t z_links; /* file links (cached) */
+ uint64_t z_pflags; /* pflags (cached) */
+ uint64_t z_uid; /* uid fuid (cached) */
+ uint64_t z_gid; /* gid fuid (cached) */
+ mode_t z_mode; /* mode (cached) */
+ uint32_t z_sync_cnt; /* synchronous open count */
+ kmutex_t z_acl_lock; /* acl data lock */
+ zfs_acl_t *z_acl_cached; /* cached acl */
+ list_node_t z_link_node; /* all znodes in fs link */
+ sa_handle_t *z_sa_hdl; /* handle to sa data */
+ boolean_t z_is_sa; /* are we native sa? */
+#ifdef __NetBSD__
+ struct lockf *z_lockf; /* head of byte-level lock list */
+#endif
+} znode_t;
Home |
Main Index |
Thread Index |
Old Index