146 lines
5.0 KiB
Diff
146 lines
5.0 KiB
Diff
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||
|
From: Brian Behlendorf <behlendorf1@llnl.gov>
|
||
|
Date: Thu, 8 Feb 2018 14:27:59 -0800
|
||
|
Subject: [PATCH] Linux 4.16 compat: inode_set_iversion()
|
||
|
MIME-Version: 1.0
|
||
|
Content-Type: text/plain; charset=UTF-8
|
||
|
Content-Transfer-Encoding: 8bit
|
||
|
|
||
|
A new interface was added to manipulate the version field of an
|
||
|
inode. Add a inode_set_iversion() wrapper for older kernels and
|
||
|
use the new interface when available.
|
||
|
|
||
|
The i_version field was dropped from the trace point due to the
|
||
|
switch to an atomic64_t i_version type.
|
||
|
|
||
|
Reviewed-by: Olaf Faaland <faaland1@llnl.gov>
|
||
|
Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
|
||
|
Reviewed-by: Chunwei Chen <david.chen@nutanix.com>
|
||
|
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
||
|
Closes #7148
|
||
|
(cherry picked from commit 310e63dfd18f59ad583631dfa2f55d40cedf1415)
|
||
|
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||
|
---
|
||
|
include/linux/vfs_compat.h | 14 ++++++++++++++
|
||
|
include/sys/trace_acl.h | 6 ++----
|
||
|
module/zfs/zpl_super.c | 2 +-
|
||
|
config/kernel-inode-set-iversion.m4 | 19 +++++++++++++++++++
|
||
|
config/kernel.m4 | 1 +
|
||
|
5 files changed, 37 insertions(+), 5 deletions(-)
|
||
|
create mode 100644 config/kernel-inode-set-iversion.m4
|
||
|
|
||
|
diff --git a/include/linux/vfs_compat.h b/include/linux/vfs_compat.h
|
||
|
index 6111f0afc..f51ff887d 100644
|
||
|
--- a/include/linux/vfs_compat.h
|
||
|
+++ b/include/linux/vfs_compat.h
|
||
|
@@ -578,4 +578,18 @@ current_time(struct inode *ip)
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
+/*
|
||
|
+ * 4.16 API change
|
||
|
+ * Added iversion interface for managing inode version field.
|
||
|
+ */
|
||
|
+#ifdef HAVE_INODE_SET_IVERSION
|
||
|
+#include <linux/iversion.h>
|
||
|
+#else
|
||
|
+static inline void
|
||
|
+inode_set_iversion(struct inode *ip, u64 val)
|
||
|
+{
|
||
|
+ ip->i_version = val;
|
||
|
+}
|
||
|
+#endif
|
||
|
+
|
||
|
#endif /* _ZFS_VFS_H */
|
||
|
diff --git a/include/sys/trace_acl.h b/include/sys/trace_acl.h
|
||
|
index 1057e560b..610bbe29c 100644
|
||
|
--- a/include/sys/trace_acl.h
|
||
|
+++ b/include/sys/trace_acl.h
|
||
|
@@ -68,7 +68,6 @@ DECLARE_EVENT_CLASS(zfs_ace_class,
|
||
|
__field(uint32_t, i_gid)
|
||
|
__field(unsigned long, i_ino)
|
||
|
__field(unsigned int, i_nlink)
|
||
|
- __field(u64, i_version)
|
||
|
__field(loff_t, i_size)
|
||
|
__field(unsigned int, i_blkbits)
|
||
|
__field(unsigned short, i_bytes)
|
||
|
@@ -103,7 +102,6 @@ DECLARE_EVENT_CLASS(zfs_ace_class,
|
||
|
__entry->i_gid = KGID_TO_SGID(ZTOI(zn)->i_gid);
|
||
|
__entry->i_ino = zn->z_inode.i_ino;
|
||
|
__entry->i_nlink = zn->z_inode.i_nlink;
|
||
|
- __entry->i_version = zn->z_inode.i_version;
|
||
|
__entry->i_size = zn->z_inode.i_size;
|
||
|
__entry->i_blkbits = zn->z_inode.i_blkbits;
|
||
|
__entry->i_bytes = zn->z_inode.i_bytes;
|
||
|
@@ -121,7 +119,7 @@ DECLARE_EVENT_CLASS(zfs_ace_class,
|
||
|
"mapcnt %llu size %llu pflags %llu "
|
||
|
"sync_cnt %u mode 0x%x is_sa %d "
|
||
|
"is_mapped %d is_ctldir %d is_stale %d inode { "
|
||
|
- "uid %u gid %u ino %lu nlink %u version %llu size %lli "
|
||
|
+ "uid %u gid %u ino %lu nlink %u size %lli "
|
||
|
"blkbits %u bytes %u mode 0x%x generation %x } } "
|
||
|
"ace { type %u flags %u access_mask %u } mask_matched %u",
|
||
|
__entry->z_id, __entry->z_unlinked, __entry->z_atime_dirty,
|
||
|
@@ -131,7 +129,7 @@ DECLARE_EVENT_CLASS(zfs_ace_class,
|
||
|
__entry->z_is_sa, __entry->z_is_mapped,
|
||
|
__entry->z_is_ctldir, __entry->z_is_stale, __entry->i_uid,
|
||
|
__entry->i_gid, __entry->i_ino, __entry->i_nlink,
|
||
|
- __entry->i_version, __entry->i_size, __entry->i_blkbits,
|
||
|
+ __entry->i_size, __entry->i_blkbits,
|
||
|
__entry->i_bytes, __entry->i_mode, __entry->i_generation,
|
||
|
__entry->z_type, __entry->z_flags, __entry->z_access_mask,
|
||
|
__entry->mask_matched)
|
||
|
diff --git a/module/zfs/zpl_super.c b/module/zfs/zpl_super.c
|
||
|
index b6ef60277..25e75a897 100644
|
||
|
--- a/module/zfs/zpl_super.c
|
||
|
+++ b/module/zfs/zpl_super.c
|
||
|
@@ -36,7 +36,7 @@ zpl_inode_alloc(struct super_block *sb)
|
||
|
struct inode *ip;
|
||
|
|
||
|
VERIFY3S(zfs_inode_alloc(sb, &ip), ==, 0);
|
||
|
- ip->i_version = 1;
|
||
|
+ inode_set_iversion(ip, 1);
|
||
|
|
||
|
return (ip);
|
||
|
}
|
||
|
diff --git a/config/kernel-inode-set-iversion.m4 b/config/kernel-inode-set-iversion.m4
|
||
|
new file mode 100644
|
||
|
index 000000000..9a7d7890e
|
||
|
--- /dev/null
|
||
|
+++ b/config/kernel-inode-set-iversion.m4
|
||
|
@@ -0,0 +1,19 @@
|
||
|
+dnl #
|
||
|
+dnl # 4.16 API change
|
||
|
+dnl # inode_set_iversion introduced to set i_version
|
||
|
+dnl #
|
||
|
+AC_DEFUN([ZFS_AC_KERNEL_INODE_SET_IVERSION], [
|
||
|
+ AC_MSG_CHECKING([whether inode_set_iversion() exists])
|
||
|
+ ZFS_LINUX_TRY_COMPILE([
|
||
|
+ #include <linux/iversion.h>
|
||
|
+ ],[
|
||
|
+ struct inode inode;
|
||
|
+ inode_set_iversion(&inode, 1);
|
||
|
+ ],[
|
||
|
+ AC_MSG_RESULT(yes)
|
||
|
+ AC_DEFINE(HAVE_INODE_SET_IVERSION, 1,
|
||
|
+ [inode_set_iversion() exists])
|
||
|
+ ],[
|
||
|
+ AC_MSG_RESULT(no)
|
||
|
+ ])
|
||
|
+])
|
||
|
diff --git a/config/kernel.m4 b/config/kernel.m4
|
||
|
index b759ccd39..b83f021e8 100644
|
||
|
--- a/config/kernel.m4
|
||
|
+++ b/config/kernel.m4
|
||
|
@@ -65,6 +65,7 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [
|
||
|
ZFS_AC_KERNEL_INODE_OPERATIONS_SET_ACL
|
||
|
ZFS_AC_KERNEL_INODE_OPERATIONS_GETATTR
|
||
|
ZFS_AC_KERNEL_INODE_SET_FLAGS
|
||
|
+ ZFS_AC_KERNEL_INODE_SET_IVERSION
|
||
|
ZFS_AC_KERNEL_GET_ACL_HANDLE_CACHE
|
||
|
ZFS_AC_KERNEL_SHOW_OPTIONS
|
||
|
ZFS_AC_KERNEL_FILE_INODE
|
||
|
--
|
||
|
2.14.2
|
||
|
|