/*      $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;