]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Honor CONFIG_FS_POSIX_ACL kernel option
authorMassimo Maggi <me@massimo-maggi.eu>
Sat, 2 Nov 2013 23:40:26 +0000 (00:40 +0100)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Wed, 6 Nov 2013 00:22:05 +0000 (16:22 -0800)
The required Posix ACL interfaces are only available for kernels
with CONFIG_FS_POSIX_ACL defined.  Therefore, only enable Posix
ACL support for these kernels.  All major distribution kernels
enable CONFIG_FS_POSIX_ACL by default.

If your kernel does not support Posix ACLs the following warning
will be printed at ZFS module load time.

  "ZFS: Posix ACLs disabled by kernel"

Signed-off-by: Massimo Maggi <me@massimo-maggi.eu>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #1825

include/linux/vfs_compat.h
include/sys/zpl.h
module/zfs/zfs_ioctl.c
module/zfs/zfs_vfsops.c
module/zfs/zpl_inode.c
module/zfs/zpl_super.c
module/zfs/zpl_xattr.c

index e5371dacd1fd4219636e21cc5b78f90f0d1afc35..8ec1bccad6691b45ab0588b12a9653745f05e199 100644 (file)
@@ -174,6 +174,7 @@ lseek_execute(struct file *filp, struct inode *inode,
 }
 #endif /* SEEK_HOLE && SEEK_DATA && !HAVE_LSEEK_EXECUTE */
 
+#if defined(CONFIG_FS_POSIX_ACL)
 /*
  * These functions safely approximates the behavior of posix_acl_release()
  * which cannot be used because it calls the GPL-only symbol kfree_rcu().
@@ -315,5 +316,6 @@ typedef umode_t zpl_equivmode_t;
 #else
 typedef mode_t zpl_equivmode_t;
 #endif /* HAVE_POSIX_ACL_EQUIV_MODE_UMODE_T */
+#endif /* CONFIG_FS_POSIX_ACL */
 
 #endif /* _ZFS_VFS_H */
index 1e338b1cd926b4df33acaa306f0c886cbd9e917c..d513785c411d7ef96b2669d5c2ff6a4db0a5a08c 100644 (file)
@@ -71,6 +71,7 @@ extern struct file_system_type zpl_fs_type;
 extern ssize_t zpl_xattr_list(struct dentry *dentry, char *buf, size_t size);
 extern int zpl_xattr_security_init(struct inode *ip, struct inode *dip,
     const struct qstr *qstr);
+#if defined(CONFIG_FS_POSIX_ACL)
 extern int zpl_set_acl(struct inode *ip, int type, struct posix_acl *acl);
 extern struct posix_acl *zpl_get_acl(struct inode *ip, int type);
 #if !defined(HAVE_GET_ACL)
@@ -87,6 +88,19 @@ extern int zpl_permission(struct inode *ip, int mask);
 
 extern int zpl_init_acl(struct inode *ip, struct inode *dir);
 extern int zpl_chmod_acl(struct inode *ip);
+#else
+static inline int
+zpl_init_acl(struct inode *ip, struct inode *dir)
+{
+       return (0);
+}
+
+static inline int
+zpl_chmod_acl(struct inode *ip)
+{
+       return (0);
+}
+#endif /* CONFIG_FS_POSIX_ACL */
 
 extern xattr_handler_t *zpl_xattr_handlers[];
 
index 62387d96895bb11a95a316cf80128a91cee31799..9b7237f36b268e7f84e309046cdb60b895481182 100644 (file)
@@ -5814,6 +5814,9 @@ _init(void)
               "ZFS pool version %s, ZFS filesystem version %s\n",
               ZFS_META_VERSION, ZFS_META_RELEASE, ZFS_DEBUG_STR,
               SPA_VERSION_STRING, ZPL_VERSION_STRING);
+#ifndef CONFIG_FS_POSIX_ACL
+       printk(KERN_NOTICE "ZFS: Posix ACLs disabled by kernel\n");
+#endif /* CONFIG_FS_POSIX_ACL */
 
        return (0);
 
index 9fc6c6fe13033dddd439687f5765865540da4e84..9097273e449d5b8cae3ff695490f697f70e35386 100644 (file)
@@ -165,8 +165,13 @@ acltype_changed_cb(void *arg, uint64_t newval)
                zsb->z_sb->s_flags &= ~MS_POSIXACL;
                break;
        case ZFS_ACLTYPE_POSIXACL:
+#ifdef CONFIG_FS_POSIX_ACL
                zsb->z_acl_type = ZFS_ACLTYPE_POSIXACL;
                zsb->z_sb->s_flags |= MS_POSIXACL;
+#else
+               zsb->z_acl_type = ZFS_ACLTYPE_OFF;
+               zsb->z_sb->s_flags &= ~MS_POSIXACL;
+#endif /* CONFIG_FS_POSIX_ACL */
                break;
        default:
                break;
index e15f0451a49367a1c368a734fe2c462f8c15d2a1..98420b2fece104fd2c9c370c5f50598656490cd8 100644 (file)
@@ -462,6 +462,7 @@ const struct inode_operations zpl_inode_operations = {
 #ifdef HAVE_INODE_FALLOCATE
        .fallocate      = zpl_fallocate,
 #endif /* HAVE_INODE_FALLOCATE */
+#if defined(CONFIG_FS_POSIX_ACL)
 #if defined(HAVE_GET_ACL)
        .get_acl        = zpl_get_acl,
 #elif defined(HAVE_CHECK_ACL)
@@ -469,6 +470,7 @@ const struct inode_operations zpl_inode_operations = {
 #elif defined(HAVE_PERMISSION)
        .permission     = zpl_permission,
 #endif /* HAVE_GET_ACL | HAVE_CHECK_ACL | HAVE_PERMISSION */
+#endif /* CONFIG_FS_POSIX_ACL */
 };
 
 const struct inode_operations zpl_dir_inode_operations = {
@@ -487,6 +489,7 @@ const struct inode_operations zpl_dir_inode_operations = {
        .getxattr       = generic_getxattr,
        .removexattr    = generic_removexattr,
        .listxattr      = zpl_xattr_list,
+#if defined(CONFIG_FS_POSIX_ACL)
 #if defined(HAVE_GET_ACL)
        .get_acl        = zpl_get_acl,
 #elif defined(HAVE_CHECK_ACL)
@@ -494,6 +497,7 @@ const struct inode_operations zpl_dir_inode_operations = {
 #elif defined(HAVE_PERMISSION)
        .permission     = zpl_permission,
 #endif /* HAVE_GET_ACL | HAVE_CHECK_ACL | HAVE_PERMISSION */
+#endif /* CONFIG_FS_POSIX_ACL */
 };
 
 const struct inode_operations zpl_symlink_inode_operations = {
@@ -515,6 +519,7 @@ const struct inode_operations zpl_special_inode_operations = {
        .getxattr       = generic_getxattr,
        .removexattr    = generic_removexattr,
        .listxattr      = zpl_xattr_list,
+#if defined(CONFIG_FS_POSIX_ACL)
 #if defined(HAVE_GET_ACL)
        .get_acl        = zpl_get_acl,
 #elif defined(HAVE_CHECK_ACL)
@@ -522,6 +527,7 @@ const struct inode_operations zpl_special_inode_operations = {
 #elif defined(HAVE_PERMISSION)
        .permission     = zpl_permission,
 #endif /* HAVE_GET_ACL | HAVE_CHECK_ACL | HAVE_PERMISSION */
+#endif /* CONFIG_FS_POSIX_ACL */
 };
 
 dentry_operations_t zpl_dentry_operations = {
index 72859ac5c1c4c4f4c8300d50dd42ed048ea34507..92779bcab8bb86f11650570f2792197f89bc4578 100644 (file)
@@ -198,6 +198,7 @@ __zpl_show_options(struct seq_file *seq, zfs_sb_t *zsb)
 {
        seq_printf(seq, ",%s", zsb->z_flags & ZSB_XATTR ? "xattr" : "noxattr");
 
+#ifdef CONFIG_FS_POSIX_ACL
        switch (zsb->z_acl_type) {
        case ZFS_ACLTYPE_POSIXACL:
                seq_puts(seq, ",posixacl");
@@ -206,6 +207,7 @@ __zpl_show_options(struct seq_file *seq, zfs_sb_t *zsb)
                seq_puts(seq, ",noacl");
                break;
        }
+#endif /* CONFIG_FS_POSIX_ACL */
 
        return (0);
 }
index 276ea3361c66dfff33ae702e334160e95004b6cd..63dca3ae7521a2bd8af36c437a8b343949196f69 100644 (file)
@@ -722,6 +722,8 @@ xattr_handler_t zpl_xattr_security_handler = {
        .set    = zpl_xattr_security_set,
 };
 
+#ifdef CONFIG_FS_POSIX_ACL
+
 int
 zpl_set_acl(struct inode *ip, int type, struct posix_acl *acl)
 {
@@ -1187,11 +1189,15 @@ struct xattr_handler zpl_xattr_acl_default_handler =
 #endif /* HAVE_DENTRY_XATTR_LIST */
 };
 
+#endif /* CONFIG_FS_POSIX_ACL */
+
 xattr_handler_t *zpl_xattr_handlers[] = {
        &zpl_xattr_security_handler,
        &zpl_xattr_trusted_handler,
        &zpl_xattr_user_handler,
+#ifdef CONFIG_FS_POSIX_ACL
        &zpl_xattr_acl_access_handler,
        &zpl_xattr_acl_default_handler,
+#endif /* CONFIG_FS_POSIX_ACL */
        NULL
 };