1 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2 From: Brian Behlendorf <behlendorf1@llnl.gov>
3 Date: Thu, 8 Feb 2018 14:27:59 -0800
4 Subject: [PATCH] Linux 4.16 compat: inode_set_iversion()
6 Content-Type: text/plain; charset=UTF-8
7 Content-Transfer-Encoding: 8bit
9 A new interface was added to manipulate the version field of an
10 inode. Add a inode_set_iversion() wrapper for older kernels and
11 use the new interface when available.
13 The i_version field was dropped from the trace point due to the
14 switch to an atomic64_t i_version type.
16 Reviewed-by: Olaf Faaland <faaland1@llnl.gov>
17 Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
18 Reviewed-by: Chunwei Chen <david.chen@nutanix.com>
19 Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
21 (cherry picked from commit 310e63dfd18f59ad583631dfa2f55d40cedf1415)
22 Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
24 include/linux/vfs_compat.h | 14 ++++++++++++++
25 include/sys/trace_acl.h | 6 ++----
26 module/zfs/zpl_super.c | 2 +-
27 config/kernel-inode-set-iversion.m4 | 19 +++++++++++++++++++
28 config/kernel.m4 | 1 +
29 5 files changed, 37 insertions(+), 5 deletions(-)
30 create mode 100644 config/kernel-inode-set-iversion.m4
32 diff --git a/include/linux/vfs_compat.h b/include/linux/vfs_compat.h
33 index 6111f0afc..f51ff887d 100644
34 --- a/include/linux/vfs_compat.h
35 +++ b/include/linux/vfs_compat.h
36 @@ -578,4 +578,18 @@ current_time(struct inode *ip)
42 + * Added iversion interface for managing inode version field.
44 +#ifdef HAVE_INODE_SET_IVERSION
45 +#include <linux/iversion.h>
48 +inode_set_iversion(struct inode *ip, u64 val)
50 + ip->i_version = val;
54 #endif /* _ZFS_VFS_H */
55 diff --git a/include/sys/trace_acl.h b/include/sys/trace_acl.h
56 index 1057e560b..610bbe29c 100644
57 --- a/include/sys/trace_acl.h
58 +++ b/include/sys/trace_acl.h
59 @@ -68,7 +68,6 @@ DECLARE_EVENT_CLASS(zfs_ace_class,
60 __field(uint32_t, i_gid)
61 __field(unsigned long, i_ino)
62 __field(unsigned int, i_nlink)
63 - __field(u64, i_version)
64 __field(loff_t, i_size)
65 __field(unsigned int, i_blkbits)
66 __field(unsigned short, i_bytes)
67 @@ -103,7 +102,6 @@ DECLARE_EVENT_CLASS(zfs_ace_class,
68 __entry->i_gid = KGID_TO_SGID(ZTOI(zn)->i_gid);
69 __entry->i_ino = zn->z_inode.i_ino;
70 __entry->i_nlink = zn->z_inode.i_nlink;
71 - __entry->i_version = zn->z_inode.i_version;
72 __entry->i_size = zn->z_inode.i_size;
73 __entry->i_blkbits = zn->z_inode.i_blkbits;
74 __entry->i_bytes = zn->z_inode.i_bytes;
75 @@ -121,7 +119,7 @@ DECLARE_EVENT_CLASS(zfs_ace_class,
76 "mapcnt %llu size %llu pflags %llu "
77 "sync_cnt %u mode 0x%x is_sa %d "
78 "is_mapped %d is_ctldir %d is_stale %d inode { "
79 - "uid %u gid %u ino %lu nlink %u version %llu size %lli "
80 + "uid %u gid %u ino %lu nlink %u size %lli "
81 "blkbits %u bytes %u mode 0x%x generation %x } } "
82 "ace { type %u flags %u access_mask %u } mask_matched %u",
83 __entry->z_id, __entry->z_unlinked, __entry->z_atime_dirty,
84 @@ -131,7 +129,7 @@ DECLARE_EVENT_CLASS(zfs_ace_class,
85 __entry->z_is_sa, __entry->z_is_mapped,
86 __entry->z_is_ctldir, __entry->z_is_stale, __entry->i_uid,
87 __entry->i_gid, __entry->i_ino, __entry->i_nlink,
88 - __entry->i_version, __entry->i_size, __entry->i_blkbits,
89 + __entry->i_size, __entry->i_blkbits,
90 __entry->i_bytes, __entry->i_mode, __entry->i_generation,
91 __entry->z_type, __entry->z_flags, __entry->z_access_mask,
92 __entry->mask_matched)
93 diff --git a/module/zfs/zpl_super.c b/module/zfs/zpl_super.c
94 index b6ef60277..25e75a897 100644
95 --- a/module/zfs/zpl_super.c
96 +++ b/module/zfs/zpl_super.c
97 @@ -36,7 +36,7 @@ zpl_inode_alloc(struct super_block *sb)
100 VERIFY3S(zfs_inode_alloc(sb, &ip), ==, 0);
102 + inode_set_iversion(ip, 1);
106 diff --git a/config/kernel-inode-set-iversion.m4 b/config/kernel-inode-set-iversion.m4
108 index 000000000..9a7d7890e
110 +++ b/config/kernel-inode-set-iversion.m4
113 +dnl # 4.16 API change
114 +dnl # inode_set_iversion introduced to set i_version
116 +AC_DEFUN([ZFS_AC_KERNEL_INODE_SET_IVERSION], [
117 + AC_MSG_CHECKING([whether inode_set_iversion() exists])
118 + ZFS_LINUX_TRY_COMPILE([
119 + #include <linux/iversion.h>
121 + struct inode inode;
122 + inode_set_iversion(&inode, 1);
125 + AC_DEFINE(HAVE_INODE_SET_IVERSION, 1,
126 + [inode_set_iversion() exists])
131 diff --git a/config/kernel.m4 b/config/kernel.m4
132 index b759ccd39..b83f021e8 100644
133 --- a/config/kernel.m4
134 +++ b/config/kernel.m4
135 @@ -65,6 +65,7 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [
136 ZFS_AC_KERNEL_INODE_OPERATIONS_SET_ACL
137 ZFS_AC_KERNEL_INODE_OPERATIONS_GETATTR
138 ZFS_AC_KERNEL_INODE_SET_FLAGS
139 + ZFS_AC_KERNEL_INODE_SET_IVERSION
140 ZFS_AC_KERNEL_GET_ACL_HANDLE_CACHE
141 ZFS_AC_KERNEL_SHOW_OPTIONS
142 ZFS_AC_KERNEL_FILE_INODE