]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Honor xattr=sa dataset property
authorNed Bass <bass6@llnl.gov>
Wed, 16 Sep 2015 09:49:09 +0000 (02:49 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Sat, 19 Sep 2015 21:04:14 +0000 (14:04 -0700)
ZFS incorrectly uses directory-based extended attributes even when
xattr=sa is specified as a dataset property or mount option. Support to
honor temporary mount options including "xattr" was added in commit
0282c4137e7409e6d85289f4955adf07fac834f5. There are two issues with the
mount option handling:

* Libzfs has historically included "xattr" in its list of default mount
  options. This overrides the dataset property, so the dataset is always
  configured to use directory-based xattrs even when the xattr dataset
  property is set to off or sa. Address this by removing "xattr" from
  the set of default mount options in libzfs.

* There was no way to enable system attribute-based extended attributes
  using temporary mount options. Add the mount options "saxattr" and
  "dirxattr" which enable the xattr behavior their names suggest.  This
  approach has the advantages of mirroring the valid xattr dataset
  property values and following existing conventions for mount option
  names.

Signed-off-by: Ned Bass <bass6@llnl.gov>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #3787

include/sys/mntent.h
include/sys/zfs_vfsops.h
lib/libzfs/libzfs_mount.c
man/man8/mount.zfs.8
module/zfs/zpl_super.c

index e6ce117769a406294597d1de915fe2f092c94327..7284f05b1db22120a523a5758c647826073f2aaf 100644 (file)
@@ -88,6 +88,8 @@
 #define        MNTOPT_LOUD     "loud"          /* verbose mount */
 #define        MNTOPT_BIND     "bind"          /* remount part of a tree */
 #define        MNTOPT_RBIND    "rbind"         /* include subtrees */
+#define        MNTOPT_DIRXATTR "dirxattr"      /* enable directory xattrs */
+#define        MNTOPT_SAXATTR  "saxattr"       /* enable system-attribute xattrs */
 #define        MNTOPT_XATTR    "xattr"         /* enable extended attributes */
 #define        MNTOPT_NOXATTR  "noxattr"       /* disable extended attributes */
 #define        MNTOPT_COMMENT  "comment"       /* comment */
index 3d2b249c9f3dbefa6f985fe1482ccc74e9357703..28407c6f76fe1c725b3a56aff10e6d7bccaa0129 100644 (file)
@@ -44,6 +44,7 @@ struct znode;
 typedef struct zfs_mntopts {
        char            *z_osname;      /* Objset name */
        char            *z_mntpoint;    /* Primary mount point */
+       uint64_t        z_xattr;
        boolean_t       z_readonly;
        boolean_t       z_do_readonly;
        boolean_t       z_setuid;
@@ -52,7 +53,6 @@ typedef struct zfs_mntopts {
        boolean_t       z_do_exec;
        boolean_t       z_devices;
        boolean_t       z_do_devices;
-       boolean_t       z_xattr;
        boolean_t       z_do_xattr;
        boolean_t       z_atime;
        boolean_t       z_do_atime;
index 0e3332e0e3ed6c017e6f2c5f3c8b1be10e309792..c01ec105e4a42746a6eeb13c1a8658c90d98bc34 100644 (file)
@@ -371,8 +371,6 @@ zfs_add_options(zfs_handle_t *zhp, char *options, int len)
            ZFS_PROP_READONLY, MNTOPT_RO, MNTOPT_RW);
        error = error ? error : zfs_add_option(zhp, options, len,
            ZFS_PROP_SETUID, MNTOPT_SETUID, MNTOPT_NOSETUID);
-       error = error ? error : zfs_add_option(zhp, options, len,
-           ZFS_PROP_XATTR, MNTOPT_XATTR, MNTOPT_NOXATTR);
        error = error ? error : zfs_add_option(zhp, options, len,
            ZFS_PROP_NBMAND, MNTOPT_NBMAND, MNTOPT_NONBMAND);
 
index b4e2406a22e7a099e19bb01702ddcb287f4f079d..362a8332fb09ffbaff43c8e8fdee223eb3fd8002 100644 (file)
@@ -83,7 +83,7 @@ under that mountpoint.
 This flag sets the SELinux context for the filesytem being mounted.
 .TP
 .BI "\-o defcontext"
-This flag sets the SELinux context for unlabled files.
+This flag sets the SELinux context for unlabeled files.
 .TP
 .BI "\-o rootcontext"
 This flag sets the SELinux context for the root inode of the filesystem.
@@ -97,8 +97,16 @@ has an entry in the /etc/fstab file.
 This private flag disables extended attributes.
 .TP
 .BI "\-o xattr
-This private flag enables extended attributes and, if appropriate,
-adds a ZFS context to the selinux system policy.
+This private flag enables directory-based extended attributes and, if
+appropriate, adds a ZFS context to the selinux system policy.
+.TP
+.BI "\-o saxattr
+This private flag enables system attributed-based extended attributes and, if
+appropriate, adds a ZFS context to the selinux system policy.
+.TP
+.BI "\-o dirxattr
+Equivalent to
+.BR xattr .
 .TP
 .BI "\-o zfsutil"
 This private flag indicates that
index 80cc15725c8f08c0eaaafbb5b8583a3e02f60d63..87895d6ba2b2414d95458fea54382497a4ddc52c 100644 (file)
@@ -193,6 +193,8 @@ enum {
        TOKEN_NOEXEC,
        TOKEN_DEVICES,
        TOKEN_NODEVICES,
+       TOKEN_DIRXATTR,
+       TOKEN_SAXATTR,
        TOKEN_XATTR,
        TOKEN_NOXATTR,
        TOKEN_ATIME,
@@ -214,6 +216,8 @@ static const match_table_t zpl_tokens = {
        { TOKEN_NOEXEC,         MNTOPT_NOEXEC },
        { TOKEN_DEVICES,        MNTOPT_DEVICES },
        { TOKEN_NODEVICES,      MNTOPT_NODEVICES },
+       { TOKEN_DIRXATTR,       MNTOPT_DIRXATTR },
+       { TOKEN_SAXATTR,        MNTOPT_SAXATTR },
        { TOKEN_XATTR,          MNTOPT_XATTR },
        { TOKEN_NOXATTR,        MNTOPT_NOXATTR },
        { TOKEN_ATIME,          MNTOPT_ATIME },
@@ -262,12 +266,20 @@ zpl_parse_option(char *option, int token, substring_t *args, zfs_mntopts_t *zmo)
                zmo->z_devices = B_FALSE;
                zmo->z_do_devices = B_TRUE;
                break;
+       case TOKEN_DIRXATTR:
+               zmo->z_xattr = ZFS_XATTR_DIR;
+               zmo->z_do_xattr = B_TRUE;
+               break;
+       case TOKEN_SAXATTR:
+               zmo->z_xattr = ZFS_XATTR_SA;
+               zmo->z_do_xattr = B_TRUE;
+               break;
        case TOKEN_XATTR:
-               zmo->z_xattr = B_TRUE;
+               zmo->z_xattr = ZFS_XATTR_DIR;
                zmo->z_do_xattr = B_TRUE;
                break;
        case TOKEN_NOXATTR:
-               zmo->z_xattr = B_FALSE;
+               zmo->z_xattr = ZFS_XATTR_OFF;
                zmo->z_do_xattr = B_TRUE;
                break;
        case TOKEN_ATIME: