Improve N-way mirror performance
[zfs.git] / include / sys / zfs_znode.h
index 4dbecb4..bdddcc3 100644 (file)
@@ -57,8 +57,8 @@ extern "C" {
 #define        ZFS_APPENDONLY          0x0000004000000000ull
 #define        ZFS_NODUMP              0x0000008000000000ull
 #define        ZFS_OPAQUE              0x0000010000000000ull
-#define        ZFS_AV_QUARANTINED      0x0000020000000000ull
-#define        ZFS_AV_MODIFIED         0x0000040000000000ull
+#define        ZFS_AV_QUARANTINED      0x0000020000000000ull
+#define        ZFS_AV_MODIFIED         0x0000040000000000ull
 #define        ZFS_REPARSE             0x0000080000000000ull
 #define        ZFS_OFFLINE             0x0000100000000000ull
 #define        ZFS_SPARSE              0x0000200000000000ull
@@ -69,7 +69,7 @@ extern "C" {
                pflags |= attr; \
        else \
                pflags &= ~attr; \
-       VERIFY(0 == sa_update(zp->z_sa_hdl, SA_ZPL_FLAGS(zp->z_zfsvfs), \
+       VERIFY(0 == sa_update(zp->z_sa_hdl, SA_ZPL_FLAGS(ZTOZSB(zp)), \
            &pflags, sizeof (pflags), tx)); \
 }
 
@@ -78,8 +78,8 @@ extern "C" {
  */
 #define        ZFS_XATTR               0x1             /* is an extended attribute */
 #define        ZFS_INHERIT_ACE         0x2             /* ace has inheritable ACEs */
-#define        ZFS_ACL_TRIVIAL         0x4             /* files ACL is trivial */
-#define        ZFS_ACL_OBJ_ACE         0x8             /* ACL has CMPLX Object ACE */
+#define        ZFS_ACL_TRIVIAL         0x4             /* files ACL is trivial */
+#define        ZFS_ACL_OBJ_ACE         0x8             /* ACL has CMPLX Object ACE */
 #define        ZFS_ACL_PROTECTED       0x10            /* ACL protected */
 #define        ZFS_ACL_DEFAULTED       0x20            /* ACL should be defaulted */
 #define        ZFS_ACL_AUTO_INHERIT    0x40            /* ACL should be inherited */
@@ -105,6 +105,7 @@ extern "C" {
 #define        SA_ZPL_FLAGS(z)         z->z_attr_table[ZPL_FLAGS]
 #define        SA_ZPL_SIZE(z)          z->z_attr_table[ZPL_SIZE]
 #define        SA_ZPL_ZNODE_ACL(z)     z->z_attr_table[ZPL_ZNODE_ACL]
+#define        SA_ZPL_DXATTR(z)        z->z_attr_table[ZPL_DXATTR]
 #define        SA_ZPL_PAD(z)           z->z_attr_table[ZPL_PAD]
 
 /*
@@ -181,8 +182,6 @@ typedef struct zfs_dirlock {
 } zfs_dirlock_t;
 
 typedef struct znode {
-       struct zfsvfs   *z_zfsvfs;
-       vnode_t         *z_vnode;
        uint64_t        z_id;           /* object ID for this znode */
        kmutex_t        z_lock;         /* znode modification lock */
        krwlock_t       z_parent_lock;  /* parent lock for directories */
@@ -208,10 +207,16 @@ typedef struct znode {
        uint32_t        z_sync_cnt;     /* synchronous open count */
        kmutex_t        z_acl_lock;     /* acl data lock */
        zfs_acl_t       *z_acl_cached;  /* cached acl */
+       krwlock_t       z_xattr_lock;   /* xattr data lock */
+       nvlist_t        *z_xattr_cached;/* cached xattrs */
+       struct znode    *z_xattr_parent;/* xattr parent znode */
        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? */
-       void (*z_set_ops_inode) (struct inode *); /* set inode ops */
+       boolean_t       z_is_zvol;      /* are we used by the zvol */
+       boolean_t       z_is_mapped;    /* are we mmap'ed */
+       boolean_t       z_is_ctldir;    /* are we .zfs entry */
+       boolean_t       z_is_stale;     /* are we stale due to rollback? */
        struct inode    z_inode;        /* generic vfs inode */
 } znode_t;
 
@@ -235,48 +240,53 @@ typedef struct znode {
 /*
  * Convert between znode pointers and inode pointers
  */
-#define        ZTOI(ZP)        (&((ZP)->z_inode))
-#define        ITOZ(IP)        (container_of((IP), znode_t, z_inode))
-
-/* XXX - REMOVE ME ONCE THE OTHER BUILD ISSUES ARE RESOLVED */
-#define        ZTOV(ZP)        ((ZP)->z_vnode)
-#define        VTOZ(VP)        ((znode_t *)(VP)->v_data)
+#define        ZTOI(znode)     (&((znode)->z_inode))
+#define        ITOZ(inode)     (container_of((inode), znode_t, z_inode))
+#define        ZTOZSB(znode)   ((zfs_sb_t *)(ZTOI(znode)->i_sb->s_fs_info))
+#define        ITOZSB(inode)   ((zfs_sb_t *)((inode)->i_sb->s_fs_info))
 
+#define        S_ISDEV(mode)   (S_ISCHR(mode) || S_ISBLK(mode) || S_ISFIFO(mode))
 
 /*
  * ZFS_ENTER() is called on entry to each ZFS inode and vfs operation.
  * ZFS_EXIT() must be called before exitting the vop.
  * ZFS_VERIFY_ZP() verifies the znode is valid.
  */
-#define        ZFS_ENTER(zfsvfs) \
+#define        ZFS_ENTER(zsb) \
        { \
-               rrw_enter(&(zfsvfs)->z_teardown_lock, RW_READER, FTAG); \
-               if ((zfsvfs)->z_unmounted) { \
-                       ZFS_EXIT(zfsvfs); \
+               rrw_enter(&(zsb)->z_teardown_lock, RW_READER, FTAG); \
+               if ((zsb)->z_unmounted) { \
+                       ZFS_EXIT(zsb); \
                        return (EIO); \
                } \
        }
 
-#define        ZFS_EXIT(zfsvfs) rrw_exit(&(zfsvfs)->z_teardown_lock, FTAG)
+#define        ZFS_EXIT(zsb) \
+       { \
+               rrw_exit(&(zsb)->z_teardown_lock, FTAG); \
+               tsd_exit(); \
+       }
 
 #define        ZFS_VERIFY_ZP(zp) \
        if ((zp)->z_sa_hdl == NULL) { \
-               ZFS_EXIT((zp)->z_zfsvfs); \
+               ZFS_EXIT(ZTOZSB(zp)); \
                return (EIO); \
-       } \
+       }
 
 /*
  * Macros for dealing with dmu_buf_hold
  */
 #define        ZFS_OBJ_HASH(obj_num)   ((obj_num) & (ZFS_OBJ_MTX_SZ - 1))
-#define        ZFS_OBJ_MUTEX(zfsvfs, obj_num)  \
-       (&(zfsvfs)->z_hold_mtx[ZFS_OBJ_HASH(obj_num)])
-#define        ZFS_OBJ_HOLD_ENTER(zfsvfs, obj_num) \
-       mutex_enter(ZFS_OBJ_MUTEX((zfsvfs), (obj_num)))
-#define        ZFS_OBJ_HOLD_TRYENTER(zfsvfs, obj_num) \
-       mutex_tryenter(ZFS_OBJ_MUTEX((zfsvfs), (obj_num)))
-#define        ZFS_OBJ_HOLD_EXIT(zfsvfs, obj_num) \
-       mutex_exit(ZFS_OBJ_MUTEX((zfsvfs), (obj_num)))
+#define        ZFS_OBJ_MUTEX(zsb, obj_num)     \
+       (&(zsb)->z_hold_mtx[ZFS_OBJ_HASH(obj_num)])
+#define        ZFS_OBJ_HOLD_ENTER(zsb, obj_num) \
+       mutex_enter(ZFS_OBJ_MUTEX((zsb), (obj_num)))
+#define        ZFS_OBJ_HOLD_TRYENTER(zsb, obj_num) \
+       mutex_tryenter(ZFS_OBJ_MUTEX((zsb), (obj_num)))
+#define        ZFS_OBJ_HOLD_EXIT(zsb, obj_num) \
+       mutex_exit(ZFS_OBJ_MUTEX((zsb), (obj_num)))
+#define        ZFS_OBJ_HOLD_OWNED(zsb, obj_num) \
+       mutex_owned(ZFS_OBJ_MUTEX((zsb), (obj_num)))
 
 /*
  * Macros to encode/decode ZFS stored time values from/to struct timespec
@@ -296,15 +306,15 @@ typedef struct znode {
 /*
  * Timestamp defines
  */
-#define        ACCESSED                (AT_ATIME)
-#define        STATE_CHANGED           (AT_CTIME)
-#define        CONTENT_MODIFIED        (AT_MTIME | AT_CTIME)
+#define        ACCESSED                (ATTR_ATIME)
+#define        STATE_CHANGED           (ATTR_CTIME)
+#define        CONTENT_MODIFIED        (ATTR_MTIME | ATTR_CTIME)
 
-#define        ZFS_ACCESSTIME_STAMP(zfsvfs, zp) \
-       if ((zfsvfs)->z_atime && !((zfsvfs)->z_vfs->vfs_flag & VFS_RDONLY)) \
+#define        ZFS_ACCESSTIME_STAMP(zsb, zp) \
+       if ((zsb)->z_atime && !(zfs_is_readonly(zsb))) \
                zfs_tstamp_update_setup(zp, ACCESSED, NULL, NULL, B_FALSE);
 
-extern int     zfs_init_fs(zfsvfs_t *, znode_t **);
+extern int     zfs_init_fs(zfs_sb_t *, znode_t **);
 extern void    zfs_set_dataprop(objset_t *);
 extern void    zfs_create_fs(objset_t *os, cred_t *cr, nvlist_t *,
     dmu_tx_t *tx);
@@ -314,18 +324,19 @@ extern void       zfs_grow_blocksize(znode_t *, uint64_t, dmu_tx_t *);
 extern int     zfs_freesp(znode_t *, uint64_t, uint64_t, int, boolean_t);
 extern void    zfs_znode_init(void);
 extern void    zfs_znode_fini(void);
-extern int     zfs_zget(zfsvfs_t *, uint64_t, znode_t **);
+extern int     zfs_zget(zfs_sb_t *, uint64_t, znode_t **);
 extern int     zfs_rezget(znode_t *);
 extern void    zfs_zinactive(znode_t *);
 extern void    zfs_znode_delete(znode_t *, dmu_tx_t *);
-extern void    zfs_znode_free(znode_t *);
 extern void    zfs_remove_op_tables(void);
 extern int     zfs_create_op_tables(void);
-extern int     zfs_sync(vfs_t *vfsp, short flag, cred_t *cr);
+extern int     zfs_sync(struct super_block *, int, cred_t *);
 extern dev_t   zfs_cmpldev(uint64_t);
 extern int     zfs_get_zplprop(objset_t *os, zfs_prop_t prop, uint64_t *value);
 extern int     zfs_get_stats(objset_t *os, nvlist_t *nv);
 extern void    zfs_znode_dmu_fini(znode_t *);
+extern int     zfs_inode_alloc(struct super_block *, struct inode **ip);
+extern void    zfs_inode_destroy(struct inode *);
 extern void    zfs_inode_update(znode_t *);
 
 extern void zfs_log_create(zilog_t *zilog, dmu_tx_t *tx, uint64_t txtype,
@@ -351,8 +362,8 @@ extern void zfs_log_setattr(zilog_t *zilog, dmu_tx_t *tx, int txtype,
 extern void zfs_log_acl(zilog_t *zilog, dmu_tx_t *tx, znode_t *zp,
     vsecattr_t *vsecp, zfs_fuid_info_t *fuidp);
 extern void zfs_xvattr_set(znode_t *zp, xvattr_t *xvap, dmu_tx_t *tx);
-extern void zfs_upgrade(zfsvfs_t *zfsvfs, dmu_tx_t *tx);
-extern int zfs_create_share_dir(zfsvfs_t *zfsvfs, dmu_tx_t *tx);
+extern void zfs_upgrade(zfs_sb_t *zsb, dmu_tx_t *tx);
+extern int zfs_create_share_dir(zfs_sb_t *zsb, dmu_tx_t *tx);
 
 #if defined(HAVE_UIO_RW)
 extern caddr_t zfs_map_page(page_t *, enum seg_rw);
@@ -360,7 +371,7 @@ extern void zfs_unmap_page(page_t *, caddr_t);
 #endif /* HAVE_UIO_RW */
 
 extern zil_get_data_t zfs_get_data;
-extern zil_replay_func_t *zfs_replay_vector[TX_MAX_TYPE];
+extern zil_replay_func_t zfs_replay_vector[TX_MAX_TYPE];
 extern int zfsfstype;
 
 #endif /* _KERNEL */