aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChunwei Chen <[email protected]>2016-12-16 13:54:51 -0800
committerChunwei Chen <[email protected]>2016-12-16 13:54:51 -0800
commita5248129b865d9b9675a6952c40a9f68e0374b83 (patch)
treeb7b9832013d9a9aca7d402870b0fd9a7af124153
parentc360af541117a0978b7fe146b59c12ad2f80d162 (diff)
Use inode_set_flags when available
Signed-off-by: Chunwei Chen <[email protected]>
-rw-r--r--config/kernel-inode-set-flags.m418
-rw-r--r--config/kernel.m41
-rw-r--r--module/zfs/zfs_znode.c9
3 files changed, 28 insertions, 0 deletions
diff --git a/config/kernel-inode-set-flags.m4 b/config/kernel-inode-set-flags.m4
new file mode 100644
index 000000000..e0ad26796
--- /dev/null
+++ b/config/kernel-inode-set-flags.m4
@@ -0,0 +1,18 @@
+dnl #
+dnl # 3.15 API change
+dnl # inode_set_flags introduced to set i_flags
+dnl #
+AC_DEFUN([ZFS_AC_KERNEL_INODE_SET_FLAGS], [
+ AC_MSG_CHECKING([whether inode_set_flags() exists])
+ ZFS_LINUX_TRY_COMPILE([
+ #include <linux/fs.h>
+ ],[
+ struct inode inode;
+ inode_set_flags(&inode, S_IMMUTABLE, S_IMMUTABLE);
+ ],[
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_INODE_SET_FLAGS, 1, [inode_set_flags() exists])
+ ],[
+ AC_MSG_RESULT(no)
+ ])
+])
diff --git a/config/kernel.m4 b/config/kernel.m4
index b66631a9c..08f544a78 100644
--- a/config/kernel.m4
+++ b/config/kernel.m4
@@ -56,6 +56,7 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [
ZFS_AC_KERNEL_INODE_OPERATIONS_CHECK_ACL_WITH_FLAGS
ZFS_AC_KERNEL_INODE_OPERATIONS_GET_ACL
ZFS_AC_KERNEL_INODE_OPERATIONS_SET_ACL
+ ZFS_AC_KERNEL_INODE_SET_FLAGS
ZFS_AC_KERNEL_GET_ACL_HANDLE_CACHE
ZFS_AC_KERNEL_SHOW_OPTIONS
ZFS_AC_KERNEL_FILE_INODE
diff --git a/module/zfs/zfs_znode.c b/module/zfs/zfs_znode.c
index e87e6d216..92241d6a5 100644
--- a/module/zfs/zfs_znode.c
+++ b/module/zfs/zfs_znode.c
@@ -486,7 +486,15 @@ zfs_set_inode_flags(znode_t *zp, struct inode *ip)
* Linux and Solaris have different sets of file attributes, so we
* restrict this conversion to the intersection of the two.
*/
+#ifdef HAVE_INODE_SET_FLAGS
+ unsigned int flags = 0;
+ if (zp->z_pflags & ZFS_IMMUTABLE)
+ flags |= S_IMMUTABLE;
+ if (zp->z_pflags & ZFS_APPENDONLY)
+ flags |= S_APPEND;
+ inode_set_flags(ip, flags, S_IMMUTABLE|S_APPEND);
+#else
if (zp->z_pflags & ZFS_IMMUTABLE)
ip->i_flags |= S_IMMUTABLE;
else
@@ -496,6 +504,7 @@ zfs_set_inode_flags(znode_t *zp, struct inode *ip)
ip->i_flags |= S_APPEND;
else
ip->i_flags &= ~S_APPEND;
+#endif
}
/*