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