From 240db18637f016f971d2febb7807807b2d5c6a9d Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Thu, 8 Feb 2018 14:27:59 -0800 Subject: [PATCH] Linux 4.16 compat: inode_set_iversion() 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 Reviewed-by: Giuseppe Di Natale Reviewed-by: Chunwei Chen Signed-off-by: Brian Behlendorf Closes #7148 --- config/kernel-inode-set-iversion.m4 | 19 +++++++++++++++++++ config/kernel.m4 | 1 + include/linux/vfs_compat.h | 14 ++++++++++++++ include/sys/trace_acl.h | 6 ++---- module/zfs/zpl_super.c | 2 +- 5 files changed, 37 insertions(+), 5 deletions(-) create mode 100644 config/kernel-inode-set-iversion.m4 diff --git a/config/kernel-inode-set-iversion.m4 b/config/kernel-inode-set-iversion.m4 new file mode 100644 index 000000000000..9a7d7890e54e --- /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 + ],[ + 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 f8d81cdc0fb5..805ec60a1483 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 diff --git a/include/linux/vfs_compat.h b/include/linux/vfs_compat.h index 6111f0afca1d..f51ff887d6ae 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 +#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 1057e560ba6c..610bbe29c25c 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 b6ef60277664..25e75a897355 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); }