diff mbox

[RFC,v2b,5/5] fs: xfs: change inode times to use vfs_time data type

Message ID 1455270349-3187-6-git-send-email-deepa.kernel@gmail.com (mailing list archive)
State New, archived
Headers show

Commit Message

Deepa Dinamani Feb. 12, 2016, 9:45 a.m. UTC
This is in preparation for changing VFS inode timestamps to
use 64 bit time.
The VFS inode timestamps are not y2038 safe as they use
struct timespec. These will be changed to use struct timespec64
instead and that is y2038 safe.
But, since the above data type conversion will break the
end file systems, use vfs_time functions to access inode times.

current_fs_time() will change along with vfs timestamp data
type changes.

xfs_vn_update_time() is a .update callback for inode operations
and this needs to change along with vfs inode times.

Signed-off-by: Deepa Dinamani <deepa.kernel@gmail.com>
---
 fs/xfs/xfs_inode.c       |  2 +-
 fs/xfs/xfs_trans_inode.c | 24 ++++++++++++++----------
 2 files changed, 15 insertions(+), 11 deletions(-)

Comments

Dave Chinner Feb. 13, 2016, 2:18 a.m. UTC | #1
On Fri, Feb 12, 2016 at 01:45:49AM -0800, Deepa Dinamani wrote:
> This is in preparation for changing VFS inode timestamps to
> use 64 bit time.
> The VFS inode timestamps are not y2038 safe as they use
> struct timespec. These will be changed to use struct timespec64
> instead and that is y2038 safe.
> But, since the above data type conversion will break the
> end file systems, use vfs_time functions to access inode times.
> 
> current_fs_time() will change along with vfs timestamp data
> type changes.
> 
> xfs_vn_update_time() is a .update callback for inode operations
> and this needs to change along with vfs inode times.

This code is all different in the current XFS for-next branch.
XFS no longer has it's own internal timestamps - it only uses the
timestamps in the struct inode now.

Cheers,

Dave.
Arnd Bergmann Feb. 13, 2016, 2:50 p.m. UTC | #2
On Saturday 13 February 2016 13:18:32 Dave Chinner wrote:
> On Fri, Feb 12, 2016 at 01:45:49AM -0800, Deepa Dinamani wrote:
> > This is in preparation for changing VFS inode timestamps to
> > use 64 bit time.
> > The VFS inode timestamps are not y2038 safe as they use
> > struct timespec. These will be changed to use struct timespec64
> > instead and that is y2038 safe.
> > But, since the above data type conversion will break the
> > end file systems, use vfs_time functions to access inode times.
> > 
> > current_fs_time() will change along with vfs timestamp data
> > type changes.
> > 
> > xfs_vn_update_time() is a .update callback for inode operations
> > and this needs to change along with vfs inode times.
> 
> This code is all different in the current XFS for-next branch.
> XFS no longer has it's own internal timestamps - it only uses the
> timestamps in the struct inode now.

Right, but as far as I can tell, this changes only contexts
for variants 2a and 2c, and makes patch 2b a few lines shorter
but does not impact whether any of the three approaches is
workable or not.

As you had some strong opinions on v1 of the series, could
you take a look at the three variants of v2 and say if you
have any preferences? It would be nice to agree on one approach
so we can merge that patch 1/xx as soon as possible and start
merging and adding further patches for the remaining file systems
so we can eventually get to the interface change.

	Arnd
--
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
index ceba1a8..fc20e65 100644
--- a/fs/xfs/xfs_inode.c
+++ b/fs/xfs/xfs_inode.c
@@ -831,7 +831,7 @@  xfs_ialloc(
 	ip->i_d.di_nextents = 0;
 	ASSERT(ip->i_d.di_nblocks == 0);
 
-	tv = current_fs_time(mp->m_super);
+	tv = vfs_time_to_timespec(current_fs_time(mp->m_super));
 	ip->i_d.di_mtime.t_sec = (__int32_t)tv.tv_sec;
 	ip->i_d.di_mtime.t_nsec = (__int32_t)tv.tv_nsec;
 	ip->i_d.di_atime = ip->i_d.di_mtime;
diff --git a/fs/xfs/xfs_trans_inode.c b/fs/xfs/xfs_trans_inode.c
index b97f1df..e469e6a 100644
--- a/fs/xfs/xfs_trans_inode.c
+++ b/fs/xfs/xfs_trans_inode.c
@@ -68,24 +68,28 @@  xfs_trans_ichgtime(
 	int			flags)
 {
 	struct inode		*inode = VFS_I(ip);
-	struct timespec		tv;
+	struct timespec		now;
+	struct timespec     ts;
 
 	ASSERT(tp);
 	ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
 
-	tv = current_fs_time(inode->i_sb);
+	now = vfs_time_to_timespec(current_fs_time(inode->i_sb));
 
+	ts = vfs_time_to_timespec(inode->i_mtime);
 	if ((flags & XFS_ICHGTIME_MOD) &&
-	    !timespec_equal(&inode->i_mtime, &tv)) {
-		inode->i_mtime = tv;
-		ip->i_d.di_mtime.t_sec = tv.tv_sec;
-		ip->i_d.di_mtime.t_nsec = tv.tv_nsec;
+	    !timespec_equal(&ts, &now)) {
+		inode->i_mtime = timespec_to_vfs_time(now);
+		ip->i_d.di_mtime.t_sec = now.tv_sec;
+		ip->i_d.di_mtime.t_nsec = now.tv_nsec;
 	}
+
+	ts = vfs_time_to_timespec(inode->i_ctime);
 	if ((flags & XFS_ICHGTIME_CHG) &&
-	    !timespec_equal(&inode->i_ctime, &tv)) {
-		inode->i_ctime = tv;
-		ip->i_d.di_ctime.t_sec = tv.tv_sec;
-		ip->i_d.di_ctime.t_nsec = tv.tv_nsec;
+	    !timespec_equal(&ts, &now)) {
+		inode->i_ctime = timespec_to_vfs_time(now);
+		ip->i_d.di_ctime.t_sec = now.tv_sec;
+		ip->i_d.di_ctime.t_nsec = now.tv_nsec;
 	}
 }