Blame SOURCES/xfsprogs-5.1.0-libxfs-create-current_time-helper-and-sync-xfs_trans.patch

5d5cbe
From b192e77cc38473964c718bd035502b702c6a6e34 Mon Sep 17 00:00:00 2001
5d5cbe
From: Eric Sandeen <sandeen@redhat.com>
5d5cbe
Date: Tue, 21 May 2019 11:03:43 -0500
5d5cbe
Subject: [PATCH] libxfs: create current_time helper and sync
5d5cbe
 xfs_trans_ichgtime
5d5cbe
5d5cbe
Make xfs_trans_ichgtime() almost match kernelspace by creating a
5d5cbe
new current_time() helper to match the kernel utility.
5d5cbe
5d5cbe
This reduces still more cosmetic change.  We may want to sync the
5d5cbe
creation flag over to the kernel even though it's not used today.
5d5cbe
5d5cbe
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
5d5cbe
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
5d5cbe
Reviewed-by: Christoph Hellwig <hch@lst.de>
5d5cbe
Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
5d5cbe
---
5d5cbe
5d5cbe
diff --git a/include/xfs_inode.h b/include/xfs_inode.h
5d5cbe
index 52d79f3..76f9ac7 100644
5d5cbe
--- a/include/xfs_inode.h
5d5cbe
+++ b/include/xfs_inode.h
5d5cbe
@@ -16,6 +16,16 @@ struct xfs_mount;
5d5cbe
 struct xfs_inode_log_item;
5d5cbe
 struct xfs_dir_ops;
5d5cbe
 
5d5cbe
+/*
5d5cbe
+ * These are not actually used, they are only for userspace build
5d5cbe
+ * compatibility in code that looks at i_state
5d5cbe
+ */
5d5cbe
+#define I_DIRTY_TIME		0
5d5cbe
+#define I_DIRTY_TIME_EXPIRED	0
5d5cbe
+
5d5cbe
+#define IS_I_VERSION(inode)			(0)
5d5cbe
+#define inode_maybe_inc_iversion(inode,flags)	(0)
5d5cbe
+
5d5cbe
 /*
5d5cbe
  * Inode interface. This fakes up a "VFS inode" to make the xfs_inode appear
5d5cbe
  * similar to the kernel which now is used tohold certain parts of the on-disk
5d5cbe
@@ -25,6 +35,7 @@ struct inode {
5d5cbe
 	mode_t		i_mode;
5d5cbe
 	uint32_t	i_nlink;
5d5cbe
 	xfs_dev_t	i_rdev;		/* This actually holds xfs_dev_t */
5d5cbe
+	unsigned long	i_state;	/* Not actually used in userspace */
5d5cbe
 	uint32_t	i_generation;
5d5cbe
 	uint64_t	i_version;
5d5cbe
 	struct timespec	i_atime;
5d5cbe
@@ -150,6 +161,9 @@ extern void	libxfs_trans_ichgtime(struct xfs_trans *,
5d5cbe
 				struct xfs_inode *, int);
5d5cbe
 extern int	libxfs_iflush_int (struct xfs_inode *, struct xfs_buf *);
5d5cbe
 
5d5cbe
+#define timespec64 timespec
5d5cbe
+extern struct timespec64 current_time(struct inode *inode);
5d5cbe
+
5d5cbe
 /* Inode Cache Interfaces */
5d5cbe
 extern bool	libxfs_inode_verify_forks(struct xfs_inode *ip);
5d5cbe
 extern int	libxfs_iget(struct xfs_mount *, struct xfs_trans *, xfs_ino_t,
5d5cbe
diff --git a/libxfs/util.c b/libxfs/util.c
5d5cbe
index 9fe9a36..951f7cf 100644
5d5cbe
--- a/libxfs/util.c
5d5cbe
+++ b/libxfs/util.c
5d5cbe
@@ -136,11 +136,21 @@ xfs_log_calc_unit_res(
5d5cbe
 	return unit_bytes;
5d5cbe
 }
5d5cbe
 
5d5cbe
+struct timespec64
5d5cbe
+current_time(struct inode *inode)
5d5cbe
+{
5d5cbe
+	struct timespec64	tv;
5d5cbe
+	struct timeval		stv;
5d5cbe
+
5d5cbe
+	gettimeofday(&stv, (struct timezone *)0);
5d5cbe
+	tv.tv_sec = stv.tv_sec;
5d5cbe
+	tv.tv_nsec = stv.tv_usec * 1000;
5d5cbe
+
5d5cbe
+	return tv;
5d5cbe
+}
5d5cbe
+
5d5cbe
 /*
5d5cbe
  * Change the requested timestamp in the given inode.
5d5cbe
- *
5d5cbe
- * This was once shared with the kernel, but has diverged to the point
5d5cbe
- * where it's no longer worth the hassle of maintaining common code.
5d5cbe
  */
5d5cbe
 void
5d5cbe
 libxfs_trans_ichgtime(
5d5cbe
@@ -148,12 +158,14 @@ libxfs_trans_ichgtime(
5d5cbe
 	struct xfs_inode	*ip,
5d5cbe
 	int			flags)
5d5cbe
 {
5d5cbe
-	struct timespec tv;
5d5cbe
-	struct timeval	stv;
5d5cbe
+	struct inode		*inode = VFS_I(ip);
5d5cbe
+	struct timespec64	tv;
5d5cbe
+
5d5cbe
+	ASSERT(tp);
5d5cbe
+	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
5d5cbe
+
5d5cbe
+	tv = current_time(inode);
5d5cbe
 
5d5cbe
-	gettimeofday(&stv, (struct timezone *)0);
5d5cbe
-	tv.tv_sec = stv.tv_sec;
5d5cbe
-	tv.tv_nsec = stv.tv_usec * 1000;
5d5cbe
 	if (flags & XFS_ICHGTIME_MOD)
5d5cbe
 		VFS_I(ip)->i_mtime = tv;
5d5cbe
 	if (flags & XFS_ICHGTIME_CHG)