diff options
Diffstat (limited to 'include/sys')
-rw-r--r-- | include/sys/fs/zfs.h | 5 | ||||
-rw-r--r-- | include/sys/sa.h | 2 | ||||
-rw-r--r-- | include/sys/zfs_sa.h | 9 | ||||
-rw-r--r-- | include/sys/zfs_vfsops.h | 1 | ||||
-rw-r--r-- | include/sys/zfs_znode.h | 3 |
5 files changed, 20 insertions, 0 deletions
diff --git a/include/sys/fs/zfs.h b/include/sys/fs/zfs.h index 2ac84f645..2b6abbf1b 100644 --- a/include/sys/fs/zfs.h +++ b/include/sys/fs/zfs.h @@ -309,6 +309,11 @@ typedef enum { ZFS_SYNC_DISABLED = 2 } zfs_sync_type_t; +typedef enum { + ZFS_XATTR_OFF = 0, + ZFS_XATTR_DIR = 1, + ZFS_XATTR_SA = 2 +} zfs_xattr_type_t; /* * On-disk version number. diff --git a/include/sys/sa.h b/include/sys/sa.h index c8b924771..718cbfbd5 100644 --- a/include/sys/sa.h +++ b/include/sys/sa.h @@ -149,6 +149,8 @@ int sa_replace_all_by_template_locked(sa_handle_t *, sa_bulk_attr_t *, boolean_t sa_enabled(objset_t *); void sa_cache_init(void); void sa_cache_fini(void); +void *sa_spill_alloc(int); +void sa_spill_free(void *); int sa_set_sa_object(objset_t *, uint64_t); int sa_hdrsize(void *); void sa_handle_lock(sa_handle_t *); diff --git a/include/sys/zfs_sa.h b/include/sys/zfs_sa.h index 90bb9972b..0bac7808a 100644 --- a/include/sys/zfs_sa.h +++ b/include/sys/zfs_sa.h @@ -73,6 +73,7 @@ typedef enum zpl_attr { ZPL_SYMLINK, ZPL_SCANSTAMP, ZPL_DACL_ACES, + ZPL_DXATTR, ZPL_END } zpl_attr_t; @@ -126,12 +127,20 @@ typedef struct znode_phys { } znode_phys_t; #ifdef _KERNEL + +#define DXATTR_MAX_ENTRY_SIZE (32768) +#define DXATTR_MAX_SA_SIZE (SPA_MAXBLOCKSIZE >> 1) + int zfs_sa_readlink(struct znode *, uio_t *); void zfs_sa_symlink(struct znode *, char *link, int len, dmu_tx_t *); void zfs_sa_get_scanstamp(struct znode *, xvattr_t *); void zfs_sa_set_scanstamp(struct znode *, xvattr_t *, dmu_tx_t *); +int zfs_sa_get_xattr(struct znode *); +int zfs_sa_set_xattr(struct znode *); void zfs_sa_upgrade(struct sa_handle *, dmu_tx_t *); void zfs_sa_upgrade_txholds(dmu_tx_t *, struct znode *); +void zfs_sa_init(void); +void zfs_sa_fini(void); #endif #ifdef __cplusplus diff --git a/include/sys/zfs_vfsops.h b/include/sys/zfs_vfsops.h index fc8be58bc..6d4d713ce 100644 --- a/include/sys/zfs_vfsops.h +++ b/include/sys/zfs_vfsops.h @@ -76,6 +76,7 @@ typedef struct zfs_sb { boolean_t z_use_fuids; /* version allows fuids */ boolean_t z_replay; /* set during ZIL replay */ boolean_t z_use_sa; /* version allow system attributes */ + boolean_t z_xattr_sa; /* allow xattrs to be stores as SA */ uint64_t z_version; /* ZPL version */ uint64_t z_shares_dir; /* hidden shares dir */ kmutex_t z_lock; diff --git a/include/sys/zfs_znode.h b/include/sys/zfs_znode.h index 6a0c6a4df..6903ad4cc 100644 --- a/include/sys/zfs_znode.h +++ b/include/sys/zfs_znode.h @@ -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] /* @@ -206,6 +207,8 @@ 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 */ 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? */ |