From 2946a1a15aab874107b4425513c1bf805e730803 Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Wed, 10 May 2017 09:30:48 -0700 Subject: [PATCH] Linux 4.12 compat: CURRENT_TIME removed Linux 4.9 added current_time() as the preferred interface to get the filesystem time. CURRENT_TIME was retired in Linux 4.12. Reviewed-by: Chunwei Chen Signed-off-by: Brian Behlendorf Closes #6114 --- config/kernel-current-time.m4 | 19 +++++++++++++++++++ config/kernel.m4 | 1 + include/linux/vfs_compat.h | 11 +++++++++++ module/zfs/zfs_ctldir.c | 3 ++- module/zfs/zpl_ctldir.c | 15 +++++++++------ module/zfs/zpl_inode.c | 2 +- module/zfs/zpl_xattr.c | 5 ++--- 7 files changed, 45 insertions(+), 11 deletions(-) create mode 100644 config/kernel-current-time.m4 diff --git a/config/kernel-current-time.m4 b/config/kernel-current-time.m4 new file mode 100644 index 0000000000..2ede9ff38c --- /dev/null +++ b/config/kernel-current-time.m4 @@ -0,0 +1,19 @@ +dnl # +dnl # 4.9, current_time() added +dnl # +AC_DEFUN([ZFS_AC_KERNEL_CURRENT_TIME], + [AC_MSG_CHECKING([whether current_time() exists]) + ZFS_LINUX_TRY_COMPILE_SYMBOL([ + #include + ], [ + struct inode ip; + struct timespec now __attribute__ ((unused)); + + now = current_time(&ip); + ], [current_time], [fs/inode.c], [ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_CURRENT_TIME, 1, [current_time() exists]) + ], [ + AC_MSG_RESULT(no) + ]) +]) diff --git a/config/kernel.m4 b/config/kernel.m4 index 57dad7b3aa..c96c8b17fd 100644 --- a/config/kernel.m4 +++ b/config/kernel.m4 @@ -118,6 +118,7 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [ ZFS_AC_KERNEL_MODULE_PARAM_CALL_CONST ZFS_AC_KERNEL_RENAME_WANTS_FLAGS ZFS_AC_KERNEL_HAVE_GENERIC_SETXATTR + ZFS_AC_KERNEL_CURRENT_TIME AS_IF([test "$LINUX_OBJ" != "$LINUX"], [ KERNELMAKE_PARAMS="$KERNELMAKE_PARAMS O=$LINUX_OBJ" diff --git a/include/linux/vfs_compat.h b/include/linux/vfs_compat.h index 4e61b1d090..0085aa8503 100644 --- a/include/linux/vfs_compat.h +++ b/include/linux/vfs_compat.h @@ -565,5 +565,16 @@ func(const struct path *path, struct kstat *stat, u32 request_mask, \ #error #endif +/* + * 4.9 API change + * Preferred interface to get the current FS time. + */ +#if !defined(HAVE_CURRENT_TIME) +static inline struct timespec +current_time(struct inode *ip) +{ + return (timespec_trunc(current_kernel_time(), ip->i_sb->s_time_gran)); +} +#endif #endif /* _ZFS_VFS_H */ diff --git a/module/zfs/zfs_ctldir.c b/module/zfs/zfs_ctldir.c index eea1bb2e80..0c90532c10 100644 --- a/module/zfs/zfs_ctldir.c +++ b/module/zfs/zfs_ctldir.c @@ -451,7 +451,7 @@ static struct inode * zfsctl_inode_alloc(zfsvfs_t *zfsvfs, uint64_t id, const struct file_operations *fops, const struct inode_operations *ops) { - struct timespec now = current_fs_time(zfsvfs->z_sb); + struct timespec now; struct inode *ip; znode_t *zp; @@ -459,6 +459,7 @@ zfsctl_inode_alloc(zfsvfs_t *zfsvfs, uint64_t id, if (ip == NULL) return (NULL); + now = current_time(ip); zp = ITOZ(ip); ASSERT3P(zp->z_dirlocks, ==, NULL); ASSERT3P(zp->z_acl_cached, ==, NULL); diff --git a/module/zfs/zpl_ctldir.c b/module/zfs/zpl_ctldir.c index bd8af39288..1c5fb34e65 100644 --- a/module/zfs/zpl_ctldir.c +++ b/module/zfs/zpl_ctldir.c @@ -103,8 +103,10 @@ static int zpl_root_getattr_impl(const struct path *path, struct kstat *stat, u32 request_mask, unsigned int query_flags) { - generic_fillattr(path->dentry->d_inode, stat); - stat->atime = CURRENT_TIME; + struct inode *ip = path->dentry->d_inode; + + generic_fillattr(ip, stat); + stat->atime = current_time(ip); return (0); } @@ -377,14 +379,15 @@ static int zpl_snapdir_getattr_impl(const struct path *path, struct kstat *stat, u32 request_mask, unsigned int query_flags) { - zfsvfs_t *zfsvfs = ITOZSB(path->dentry->d_inode); + struct inode *ip = path->dentry->d_inode; + zfsvfs_t *zfsvfs = ITOZSB(ip); ZFS_ENTER(zfsvfs); - generic_fillattr(path->dentry->d_inode, stat); + generic_fillattr(ip, stat); stat->nlink = stat->size = 2; stat->ctime = stat->mtime = dmu_objset_snap_cmtime(zfsvfs->z_os); - stat->atime = CURRENT_TIME; + stat->atime = current_time(ip); ZFS_EXIT(zfsvfs); return (0); @@ -522,7 +525,7 @@ zpl_shares_getattr_impl(const struct path *path, struct kstat *stat, if (zfsvfs->z_shares_dir == 0) { generic_fillattr(path->dentry->d_inode, stat); stat->nlink = stat->size = 2; - stat->atime = CURRENT_TIME; + stat->atime = current_time(ip); ZFS_EXIT(zfsvfs); return (0); } diff --git a/module/zfs/zpl_inode.c b/module/zfs/zpl_inode.c index 8351ab5a0c..3b5643d091 100644 --- a/module/zfs/zpl_inode.c +++ b/module/zfs/zpl_inode.c @@ -596,7 +596,7 @@ zpl_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry) return (-EMLINK); crhold(cr); - ip->i_ctime = CURRENT_TIME_SEC; + ip->i_ctime = current_time(ip); igrab(ip); /* Use ihold() if available */ cookie = spl_fstrans_mark(); diff --git a/module/zfs/zpl_xattr.c b/module/zfs/zpl_xattr.c index 5edabedd3c..d3bb4bbf8c 100644 --- a/module/zfs/zpl_xattr.c +++ b/module/zfs/zpl_xattr.c @@ -938,7 +938,6 @@ xattr_handler_t zpl_xattr_security_handler = { int zpl_set_acl(struct inode *ip, struct posix_acl *acl, int type) { - struct super_block *sb = ITOZSB(ip)->z_sb; char *name, *value = NULL; int error = 0; size_t size = 0; @@ -964,7 +963,7 @@ zpl_set_acl(struct inode *ip, struct posix_acl *acl, int type) */ if (ip->i_mode != mode) { ip->i_mode = mode; - ip->i_ctime = current_fs_time(sb); + ip->i_ctime = current_time(ip); zfs_mark_inode_dirty(ip); } @@ -1130,7 +1129,7 @@ zpl_init_acl(struct inode *ip, struct inode *dir) if (!acl) { ip->i_mode &= ~current_umask(); - ip->i_ctime = current_fs_time(ITOZSB(ip)->z_sb); + ip->i_ctime = current_time(ip); zfs_mark_inode_dirty(ip); return (0); }