Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Linux: Cross-platform user namespace xattrs compat #8

Merged
2 commits merged into from
Jun 29, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion include/os/freebsd/zfs/sys/zfs_vfsops_os.h
Original file line number Diff line number Diff line change
Expand Up @@ -240,7 +240,9 @@ struct zfsvfs {
RW_WRITE_HELD(&(zfsvfs)->z_teardown_inactive_lock)
#endif

#define ZSB_XATTR 0x0001 /* Enable user xattrs */
#define ZSB_XATTR 0x0001 /* Enable user xattrs */
#define ZSB_XATTR_COMPAT 0x0002 /* Enable cross-platform user xattrs */

/*
* Normal filesystems (those not under .zfs/snapshot) have a total
* file ID size limited to 12 bytes (including the length field) due to
Expand Down
3 changes: 2 additions & 1 deletion include/os/linux/zfs/sys/zfs_vfsops_os.h
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,8 @@ struct zfsvfs {
#define ZFS_TEARDOWN_HELD(zfsvfs) \
RRM_LOCK_HELD(&(zfsvfs)->z_teardown_lock)

#define ZSB_XATTR 0x0001 /* Enable user xattrs */
#define ZSB_XATTR 0x0001 /* Enable user xattrs */
#define ZSB_XATTR_COMPAT 0x0002 /* Enable cross-platform user xattrs */

/*
* Allow a maximum number of links. While ZFS does not internally limit
Expand Down
36 changes: 36 additions & 0 deletions include/sys/fs/zfs.h
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,7 @@ typedef enum {
ZFS_PROP_IVSET_GUID, /* not exposed to the user */
ZFS_PROP_REDACTED,
ZFS_PROP_REDACT_SNAPS,
ZFS_PROP_XATTR_COMPAT,
ZFS_NUM_PROPS
} zfs_prop_t;

Expand Down Expand Up @@ -457,6 +458,11 @@ typedef enum zfs_key_location {
#define DEFAULT_PBKDF2_ITERATIONS 350000
#define MIN_PBKDF2_ITERATIONS 100000

typedef enum zfs_xattr_compat {
ZFS_XATTR_COMPAT_LINUX = 0,
ZFS_XATTR_COMPAT_ALL,
} zfs_xattr_compat_t;

/*
* On-disk version number.
*/
Expand Down Expand Up @@ -1613,6 +1619,36 @@ typedef enum {
#define ZFS_EV_HIST_DSID "history_dsid"
#define ZFS_EV_RESILVER_TYPE "resilver_type"

/*
* xattr namespace prefixes. These are forbidden in xattr names.
*
* For cross-platform compatibility, xattrs in the user namespace should not be
* prefixed with the namespace name, but for backwards compatibility with older
* ZFS on Linux versions we do prefix the namespace.
*/
#define ZFS_XA_NS_FREEBSD_PREFIX "freebsd:"
#define ZFS_XA_NS_FREEBSD_PREFIX_LEN strlen("freebsd:")
yocalebo marked this conversation as resolved.
Show resolved Hide resolved
#define ZFS_XA_NS_LINUX_SECURITY_PREFIX "security."
#define ZFS_XA_NS_LINUX_SECURITY_PREFIX_LEN strlen("security.")
#define ZFS_XA_NS_LINUX_SYSTEM_PREFIX "system."
#define ZFS_XA_NS_LINUX_SYSTEM_PREFIX_LEN strlen("system.")
#define ZFS_XA_NS_LINUX_TRUSTED_PREFIX "trusted."
#define ZFS_XA_NS_LINUX_TRUSTED_PREFIX_LEN strlen("trusted.")
#define ZFS_XA_NS_LINUX_USER_PREFIX "user."
#define ZFS_XA_NS_LINUX_USER_PREFIX_LEN strlen("user.")

/* BEGIN CSTYLED */
#define ZFS_XA_NS_PREFIX_MATCH(ns, name) \
(strncmp(name, ZFS_XA_NS_##ns##_PREFIX, ZFS_XA_NS_##ns##_PREFIX_LEN) == 0)

#define ZFS_XA_NS_PREFIX_FORBIDDEN(name) \
(ZFS_XA_NS_PREFIX_MATCH(FREEBSD, name) || \
ZFS_XA_NS_PREFIX_MATCH(LINUX_SECURITY, name) || \
ZFS_XA_NS_PREFIX_MATCH(LINUX_SYSTEM, name) || \
ZFS_XA_NS_PREFIX_MATCH(LINUX_TRUSTED, name) || \
ZFS_XA_NS_PREFIX_MATCH(LINUX_USER, name))
/* END CSTYLED */

#ifdef __cplusplus
}
#endif
Expand Down
1 change: 1 addition & 0 deletions include/zfeature_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ typedef enum spa_feature {
SPA_FEATURE_DEVICE_REBUILD,
SPA_FEATURE_ZSTD_COMPRESS,
SPA_FEATURE_DRAID,
SPA_FEATURE_XATTR_COMPAT,
SPA_FEATURES
} spa_feature_t;

Expand Down
568 changes: 284 additions & 284 deletions lib/libnvpair/libnvpair.abi

Large diffs are not rendered by default.

622 changes: 311 additions & 311 deletions lib/libuutil/libuutil.abi

Large diffs are not rendered by default.

2,418 changes: 1,210 additions & 1,208 deletions lib/libzfs/libzfs.abi

Large diffs are not rendered by default.

1,007 changes: 505 additions & 502 deletions lib/libzfs_core/libzfs_core.abi

Large diffs are not rendered by default.

66 changes: 33 additions & 33 deletions lib/libzfsbootenv/libzfsbootenv.abi
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,16 @@
<elf-symbol name='lzbe_remove_pair' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='lzbe_set_boot_device' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
</elf-function-symbols>
<abi-instr version='1.0' address-size='64' path='lzbe_device.c' comp-dir-path='/home/ryan/ZoF/lib/libzfsbootenv' language='LANG_C99'>
<abi-instr version='1.0' address-size='64' path='lzbe_device.c' comp-dir-path='/home/ryan/zfs/lib/libzfsbootenv' language='LANG_C99'>
<type-decl name='int' size-in-bits='32' id='type-id-1'/>
<type-decl name='char' size-in-bits='8' id='type-id-2'/>
<qualified-type-def type-id='type-id-2' const='yes' id='type-id-3'/>
<pointer-type-def type-id='type-id-3' size-in-bits='64' id='type-id-4'/>
<pointer-type-def type-id='type-id-2' size-in-bits='64' id='type-id-5'/>
<pointer-type-def type-id='type-id-5' size-in-bits='64' id='type-id-6'/>
<function-decl name='lzbe_get_boot_device' mangled-name='lzbe_get_boot_device' filepath='/home/ryan/ZoF/lib/libzfsbootenv/lzbe_device.c' line='114' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_get_boot_device'>
<parameter type-id='type-id-4' name='pool' filepath='/home/ryan/ZoF/lib/libzfsbootenv/lzbe_device.c' line='114' column='1'/>
<parameter type-id='type-id-6' name='device' filepath='/home/ryan/ZoF/lib/libzfsbootenv/lzbe_device.c' line='114' column='1'/>
<function-decl name='lzbe_get_boot_device' mangled-name='lzbe_get_boot_device' filepath='/home/ryan/zfs/lib/libzfsbootenv/lzbe_device.c' line='113' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_get_boot_device'>
<parameter type-id='type-id-4' name='pool' filepath='/home/ryan/zfs/lib/libzfsbootenv/lzbe_device.c' line='113' column='1'/>
<parameter type-id='type-id-6' name='device' filepath='/home/ryan/zfs/lib/libzfsbootenv/lzbe_device.c' line='113' column='1'/>
<return type-id='type-id-1'/>
</function-decl>
<type-decl name='unnamed-enum-underlying-type' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='type-id-7'/>
Expand All @@ -34,10 +34,10 @@
<enumerator name='lzbe_replace' value='1'/>
</enum-decl>
<typedef-decl name='lzbe_flags_t' type-id='type-id-8' filepath='../../include/libzfsbootenv.h' line='26' column='1' id='type-id-9'/>
<function-decl name='lzbe_set_boot_device' mangled-name='lzbe_set_boot_device' filepath='/home/ryan/ZoF/lib/libzfsbootenv/lzbe_device.c' line='28' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_set_boot_device'>
<parameter type-id='type-id-4' name='pool' filepath='/home/ryan/ZoF/lib/libzfsbootenv/lzbe_device.c' line='28' column='1'/>
<parameter type-id='type-id-9' name='flag' filepath='/home/ryan/ZoF/lib/libzfsbootenv/lzbe_device.c' line='28' column='1'/>
<parameter type-id='type-id-4' name='device' filepath='/home/ryan/ZoF/lib/libzfsbootenv/lzbe_device.c' line='28' column='1'/>
<function-decl name='lzbe_set_boot_device' mangled-name='lzbe_set_boot_device' filepath='/home/ryan/zfs/lib/libzfsbootenv/lzbe_device.c' line='28' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_set_boot_device'>
<parameter type-id='type-id-4' name='pool' filepath='/home/ryan/zfs/lib/libzfsbootenv/lzbe_device.c' line='28' column='1'/>
<parameter type-id='type-id-9' name='flag' filepath='/home/ryan/zfs/lib/libzfsbootenv/lzbe_device.c' line='28' column='1'/>
<parameter type-id='type-id-4' name='device' filepath='/home/ryan/zfs/lib/libzfsbootenv/lzbe_device.c' line='28' column='1'/>
<return type-id='type-id-1'/>
</function-decl>
<type-decl name='void' id='type-id-10'/>
Expand Down Expand Up @@ -102,38 +102,38 @@
<return type-id='type-id-10'/>
</function-decl>
</abi-instr>
<abi-instr version='1.0' address-size='64' path='lzbe_pair.c' comp-dir-path='/home/ryan/ZoF/lib/libzfsbootenv' language='LANG_C99'>
<abi-instr version='1.0' address-size='64' path='lzbe_pair.c' comp-dir-path='/home/ryan/zfs/lib/libzfsbootenv' language='LANG_C99'>
<pointer-type-def type-id='type-id-10' size-in-bits='64' id='type-id-11'/>
<function-decl name='lzbe_remove_pair' mangled-name='lzbe_remove_pair' filepath='/home/ryan/ZoF/lib/libzfsbootenv/lzbe_pair.c' line='343' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_remove_pair'>
<parameter type-id='type-id-11' name='ptr' filepath='/home/ryan/ZoF/lib/libzfsbootenv/lzbe_pair.c' line='343' column='1'/>
<parameter type-id='type-id-4' name='key' filepath='/home/ryan/ZoF/lib/libzfsbootenv/lzbe_pair.c' line='343' column='1'/>
<function-decl name='lzbe_remove_pair' mangled-name='lzbe_remove_pair' filepath='/home/ryan/zfs/lib/libzfsbootenv/lzbe_pair.c' line='343' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_remove_pair'>
<parameter type-id='type-id-11' name='ptr' filepath='/home/ryan/zfs/lib/libzfsbootenv/lzbe_pair.c' line='343' column='1'/>
<parameter type-id='type-id-4' name='key' filepath='/home/ryan/zfs/lib/libzfsbootenv/lzbe_pair.c' line='343' column='1'/>
<return type-id='type-id-1'/>
</function-decl>
<type-decl name='unsigned long int' size-in-bits='64' id='type-id-12'/>
<typedef-decl name='size_t' type-id='type-id-12' filepath='/usr/lib/gcc/x86_64-linux-gnu/8/include/stddef.h' line='216' column='1' id='type-id-13'/>
<function-decl name='lzbe_add_pair' mangled-name='lzbe_add_pair' filepath='/home/ryan/ZoF/lib/libzfsbootenv/lzbe_pair.c' line='182' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_add_pair'>
<parameter type-id='type-id-11' name='ptr' filepath='/home/ryan/ZoF/lib/libzfsbootenv/lzbe_pair.c' line='182' column='1'/>
<parameter type-id='type-id-4' name='key' filepath='/home/ryan/ZoF/lib/libzfsbootenv/lzbe_pair.c' line='182' column='1'/>
<parameter type-id='type-id-4' name='type' filepath='/home/ryan/ZoF/lib/libzfsbootenv/lzbe_pair.c' line='182' column='1'/>
<parameter type-id='type-id-11' name='value' filepath='/home/ryan/ZoF/lib/libzfsbootenv/lzbe_pair.c' line='182' column='1'/>
<parameter type-id='type-id-13' name='size' filepath='/home/ryan/ZoF/lib/libzfsbootenv/lzbe_pair.c' line='183' column='1'/>
<function-decl name='lzbe_add_pair' mangled-name='lzbe_add_pair' filepath='/home/ryan/zfs/lib/libzfsbootenv/lzbe_pair.c' line='182' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_add_pair'>
<parameter type-id='type-id-11' name='ptr' filepath='/home/ryan/zfs/lib/libzfsbootenv/lzbe_pair.c' line='182' column='1'/>
<parameter type-id='type-id-4' name='key' filepath='/home/ryan/zfs/lib/libzfsbootenv/lzbe_pair.c' line='182' column='1'/>
<parameter type-id='type-id-4' name='type' filepath='/home/ryan/zfs/lib/libzfsbootenv/lzbe_pair.c' line='182' column='1'/>
<parameter type-id='type-id-11' name='value' filepath='/home/ryan/zfs/lib/libzfsbootenv/lzbe_pair.c' line='182' column='1'/>
<parameter type-id='type-id-13' name='size' filepath='/home/ryan/zfs/lib/libzfsbootenv/lzbe_pair.c' line='183' column='1'/>
<return type-id='type-id-1'/>
</function-decl>
<function-decl name='lzbe_nvlist_free' mangled-name='lzbe_nvlist_free' filepath='/home/ryan/ZoF/lib/libzfsbootenv/lzbe_pair.c' line='131' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_nvlist_free'>
<parameter type-id='type-id-11' name='ptr' filepath='/home/ryan/ZoF/lib/libzfsbootenv/lzbe_pair.c' line='131' column='1'/>
<function-decl name='lzbe_nvlist_free' mangled-name='lzbe_nvlist_free' filepath='/home/ryan/zfs/lib/libzfsbootenv/lzbe_pair.c' line='131' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_nvlist_free'>
<parameter type-id='type-id-11' name='ptr' filepath='/home/ryan/zfs/lib/libzfsbootenv/lzbe_pair.c' line='131' column='1'/>
<return type-id='type-id-10'/>
</function-decl>
<function-decl name='lzbe_nvlist_set' mangled-name='lzbe_nvlist_set' filepath='/home/ryan/ZoF/lib/libzfsbootenv/lzbe_pair.c' line='74' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_nvlist_set'>
<parameter type-id='type-id-4' name='pool' filepath='/home/ryan/ZoF/lib/libzfsbootenv/lzbe_pair.c' line='74' column='1'/>
<parameter type-id='type-id-4' name='key' filepath='/home/ryan/ZoF/lib/libzfsbootenv/lzbe_pair.c' line='74' column='1'/>
<parameter type-id='type-id-11' name='ptr' filepath='/home/ryan/ZoF/lib/libzfsbootenv/lzbe_pair.c' line='74' column='1'/>
<function-decl name='lzbe_nvlist_set' mangled-name='lzbe_nvlist_set' filepath='/home/ryan/zfs/lib/libzfsbootenv/lzbe_pair.c' line='74' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_nvlist_set'>
<parameter type-id='type-id-4' name='pool' filepath='/home/ryan/zfs/lib/libzfsbootenv/lzbe_pair.c' line='74' column='1'/>
<parameter type-id='type-id-4' name='key' filepath='/home/ryan/zfs/lib/libzfsbootenv/lzbe_pair.c' line='74' column='1'/>
<parameter type-id='type-id-11' name='ptr' filepath='/home/ryan/zfs/lib/libzfsbootenv/lzbe_pair.c' line='74' column='1'/>
<return type-id='type-id-1'/>
</function-decl>
<pointer-type-def type-id='type-id-11' size-in-bits='64' id='type-id-14'/>
<function-decl name='lzbe_nvlist_get' mangled-name='lzbe_nvlist_get' filepath='/home/ryan/ZoF/lib/libzfsbootenv/lzbe_pair.c' line='27' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_nvlist_get'>
<parameter type-id='type-id-4' name='pool' filepath='/home/ryan/ZoF/lib/libzfsbootenv/lzbe_pair.c' line='27' column='1'/>
<parameter type-id='type-id-4' name='key' filepath='/home/ryan/ZoF/lib/libzfsbootenv/lzbe_pair.c' line='27' column='1'/>
<parameter type-id='type-id-14' name='ptr' filepath='/home/ryan/ZoF/lib/libzfsbootenv/lzbe_pair.c' line='27' column='1'/>
<function-decl name='lzbe_nvlist_get' mangled-name='lzbe_nvlist_get' filepath='/home/ryan/zfs/lib/libzfsbootenv/lzbe_pair.c' line='27' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_nvlist_get'>
<parameter type-id='type-id-4' name='pool' filepath='/home/ryan/zfs/lib/libzfsbootenv/lzbe_pair.c' line='27' column='1'/>
<parameter type-id='type-id-4' name='key' filepath='/home/ryan/zfs/lib/libzfsbootenv/lzbe_pair.c' line='27' column='1'/>
<parameter type-id='type-id-14' name='ptr' filepath='/home/ryan/zfs/lib/libzfsbootenv/lzbe_pair.c' line='27' column='1'/>
<return type-id='type-id-1'/>
</function-decl>
<function-decl name='nvlist_remove_all' mangled-name='nvlist_remove_all' filepath='../../include/sys/nvpair.h' line='199' column='1' visibility='default' binding='global' size-in-bits='64'>
Expand Down Expand Up @@ -224,7 +224,7 @@
<return type-id='type-id-10'/>
</function-decl>
</abi-instr>
<abi-instr version='1.0' address-size='64' path='lzbe_util.c' comp-dir-path='/home/ryan/ZoF/lib/libzfsbootenv' language='LANG_C99'>
<abi-instr version='1.0' address-size='64' path='lzbe_util.c' comp-dir-path='/home/ryan/zfs/lib/libzfsbootenv' language='LANG_C99'>
<class-decl name='_IO_FILE' size-in-bits='1728' is-struct='yes' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='49' column='1' id='type-id-15'>
<data-member access='public' layout-offset-in-bits='0'>
<var-decl name='_flags' type-id='type-id-1' visibility='default' filepath='/usr/include/x86_64-linux-gnu/bits/types/struct_FILE.h' line='51' column='1'/>
Expand Down Expand Up @@ -335,10 +335,10 @@
</array-type-def>
<typedef-decl name='FILE' type-id='type-id-15' filepath='/usr/include/x86_64-linux-gnu/bits/types/FILE.h' line='7' column='1' id='type-id-32'/>
<pointer-type-def type-id='type-id-32' size-in-bits='64' id='type-id-33'/>
<function-decl name='lzbe_bootenv_print' mangled-name='lzbe_bootenv_print' filepath='/home/ryan/ZoF/lib/libzfsbootenv/lzbe_util.c' line='24' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_bootenv_print'>
<parameter type-id='type-id-4' name='pool' filepath='/home/ryan/ZoF/lib/libzfsbootenv/lzbe_util.c' line='24' column='1'/>
<parameter type-id='type-id-4' name='nvlist' filepath='/home/ryan/ZoF/lib/libzfsbootenv/lzbe_util.c' line='24' column='1'/>
<parameter type-id='type-id-33' name='of' filepath='/home/ryan/ZoF/lib/libzfsbootenv/lzbe_util.c' line='24' column='1'/>
<function-decl name='lzbe_bootenv_print' mangled-name='lzbe_bootenv_print' filepath='/home/ryan/zfs/lib/libzfsbootenv/lzbe_util.c' line='24' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='lzbe_bootenv_print'>
<parameter type-id='type-id-4' name='pool' filepath='/home/ryan/zfs/lib/libzfsbootenv/lzbe_util.c' line='24' column='1'/>
<parameter type-id='type-id-4' name='nvlist' filepath='/home/ryan/zfs/lib/libzfsbootenv/lzbe_util.c' line='24' column='1'/>
<parameter type-id='type-id-33' name='of' filepath='/home/ryan/zfs/lib/libzfsbootenv/lzbe_util.c' line='24' column='1'/>
<return type-id='type-id-1'/>
</function-decl>
<function-decl name='lzbe_nvlist_get' mangled-name='lzbe_nvlist_get' filepath='../../include/libzfsbootenv.h' line='28' column='1' visibility='default' binding='global' size-in-bits='64'>
Expand Down
21 changes: 21 additions & 0 deletions man/man5/zpool-features.5
Original file line number Diff line number Diff line change
Expand Up @@ -1021,6 +1021,27 @@ and may take a while to complete for filesystems containing a large number of
files.
.RE

.sp
.ne 2
.na
\fBxattr_compat\fR
.ad
.RS 4n
.TS
l l .
GUID com.ixsystems:xattr_compat
READ\-ONLY COMPATIBLE yes
DEPENDENCIES extensible_dataset
.TE

This feature enables the use of a cross-platform compatible encoding for xattrs
in the user namespace on Linux.

This feature becomes \fBactive\fR on a filesystem when an xattr is written to
the user namespace on Linux after the feature has been enabled, and returns to
\fBenabled\fR after all filesystems with the feature active have been destroyed.
.RE

.sp
.ne 2
.na
Expand Down
32 changes: 32 additions & 0 deletions man/man8/zfsprops.8
Original file line number Diff line number Diff line change
Expand Up @@ -1815,6 +1815,38 @@ are equivalent to the
and
.Sy noxattr
mount options.
.It Sy xattr_compat Ns = Ns Sy all Ns | Ns Sy linux
Controls the preferred encoding of xattrs in the user namespace.
When set to
.Sy all
(the default) with
.Sy feature@xattr_compat
enabled on the pool, xattrs written in the user namespace are stored in a
format compatible across all supported platforms, and xattrs in the user
namespace from all platforms are accessible.
There is no notion of xattr namespaces on illumos, so all xattrs from
illumos are presented in the user namespace on other platforms.
The xattrs not in the user namespace are considered platform-specific and are
not exposed on other platforms.
Existing xattrs in the
.Sy xattr_compat=linux
format are accessible and are replaced with the cross-platform compatible
format when written.
When
.Sy feature@xattr_compat
is disabled, xattrs behave as with
.Sy xattr_compat=linux .
When set to
.Sy linux ,
xattrs written in the user namespace are stored in a format that is compatible
with ZFS on Linux prior to
.Sy feature@xattr_compat
but not compatible with ZFS on other platforms prior to this feature.
See
.Sy feature@xattr_compat
in
.Xr zpool-features 5
for more information.
.It Sy jailed Ns = Ns Sy off Ns | Ns Sy on
Controls whether the dataset is managed from a jail. See the
.Qq Sx Jails
Expand Down
Loading