From a5248129b865d9b9675a6952c40a9f68e0374b83 Mon Sep 17 00:00:00 2001 From: Chunwei Chen Date: Fri, 16 Dec 2016 13:54:51 -0800 Subject: [PATCH] Use inode_set_flags when available Signed-off-by: Chunwei Chen --- config/kernel-inode-set-flags.m4 | 18 ++++++++++++++++++ config/kernel.m4 | 1 + module/zfs/zfs_znode.c | 9 +++++++++ 3 files changed, 28 insertions(+) create mode 100644 config/kernel-inode-set-flags.m4 diff --git a/config/kernel-inode-set-flags.m4 b/config/kernel-inode-set-flags.m4 new file mode 100644 index 0000000000..e0ad26796d --- /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 + ],[ + 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 b66631a9c9..08f544a787 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 e87e6d216f..92241d6a5c 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 } /*