xfs
[Top] [All Lists]

Re: [patch] Don't change ctime in truncate is size does not change

To: David Chinner <dgc@xxxxxxx>
Subject: Re: [patch] Don't change ctime in truncate is size does not change
From: Mark Goodwin <markgw@xxxxxxx>
Date: Tue, 19 Feb 2008 10:37:48 +1100
Cc: xfs-dev <xfs-dev@xxxxxxx>, xfs-oss <xfs@xxxxxxxxxxx>
In-reply-to: <20080218233251.GV155407@xxxxxxx>
Organization: SGI Engineering
References: <20080218233251.GV155407@xxxxxxx>
Reply-to: markgw@xxxxxxx
Sender: xfs-bounce@xxxxxxxxxxx
User-agent: Thunderbird 1.5.0.14 (Windows/20071210)
Did we ever discover what was behind the comment:
"Have to do this even if the file's size doesn't change"

Cheers
-- Mark

David Chinner wrote:
XFS changes the c/mtime of an inode when truncating it to the same
size. The c/mtime is only supposed to change if the size is changed.
Not to be confused with ftruncate, where the c/mtime is supposed to
be changed even if the size is not changed.

The Linux VFS encodes this semantic difference in the flags it sends
down to ->setattr, which XFS currently ignores. We need to make XFS
pay attention to the VFS flags and hence Do The Right Thing.

Signed-off-by: Dave Chinner <dgc@xxxxxxx>
---
 fs/xfs/xfs_vnodeops.c |   13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

Index: 2.6.x-xfs-new/fs/xfs/xfs_vnodeops.c
===================================================================
--- 2.6.x-xfs-new.orig/fs/xfs/xfs_vnodeops.c    2008-01-25 16:03:23.654971763 
+1100
+++ 2.6.x-xfs-new/fs/xfs/xfs_vnodeops.c 2008-01-25 16:10:30.875397129 +1100
@@ -634,6 +634,15 @@ xfs_setattr(
         * Truncate file.  Must have write permission and not be a directory.
         */
        if (mask & XFS_AT_SIZE) {
+               /*
+                * Only change the c/mtime if we are changing the size
+                * or we are explicitly asked to change it. This handles
+                * the semantic difference between truncate() and ftruncate()
+                * as implemented in the VFS.
+                */
+               if (vap->va_size != ip->i_size || mask & XFS_AT_CTIME)
+                       timeflags |= XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG;
+
                if (vap->va_size > ip->i_size) {
                        xfs_igrow_finish(tp, ip, vap->va_size,
                            !(flags & ATTR_DMI));
@@ -662,10 +671,6 @@ xfs_setattr(
                         */
                        xfs_iflags_set(ip, XFS_ITRUNCATED);
                }
-               /*
-                * Have to do this even if the file's size doesn't change.
-                */
-               timeflags |= XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG;
        }
/*

--

 Mark Goodwin                                  markgw@xxxxxxx
 Engineering Manager for XFS and PCP    Phone: +61-3-99631937
 SGI Australian Software Group           Cell: +61-4-18969583
-------------------------------------------------------------


<Prev in Thread] Current Thread [Next in Thread>