xfs
[Top] [All Lists]

[PATCH 2/3] optimize xfs_ichgtime

To: xfs@xxxxxxxxxxx
Subject: [PATCH 2/3] optimize xfs_ichgtime
From: Christoph Hellwig <hch@xxxxxx>
Date: Sat, 26 Jul 2008 08:33:35 +0200
Sender: xfs-bounce@xxxxxxxxxxx
User-agent: Mutt/1.3.28i
Port a little optmization from file_update_time to xfs_ichgtime, and
only update the timestamp and mark the inode dirty if the timestamp
actually changes in the timer tick resultion supported by the running
kernel.


Signed-off-by: Christoph Hellwig <hch@xxxxxx>

Index: linux-2.6-xfs/fs/xfs/linux-2.6/xfs_iops.c
===================================================================
--- linux-2.6-xfs.orig/fs/xfs/linux-2.6/xfs_iops.c      2008-07-23 
23:31:32.000000000 +0200
+++ linux-2.6-xfs/fs/xfs/linux-2.6/xfs_iops.c   2008-07-23 23:34:20.000000000 
+0200
@@ -97,17 +97,23 @@ xfs_ichgtime(
 {
        struct inode    *inode = VFS_I(ip);
        timespec_t      tv;
+       int             sync_it = 0;
 
-       nanotime(&tv);
-       if (flags & XFS_ICHGTIME_MOD) {
+       tv = current_fs_time(inode->i_sb);
+
+       if ((flags & XFS_ICHGTIME_MOD) &&
+           !timespec_equal(&inode->i_mtime, &tv)) {
                inode->i_mtime = tv;
                ip->i_d.di_mtime.t_sec = (__int32_t)tv.tv_sec;
                ip->i_d.di_mtime.t_nsec = (__int32_t)tv.tv_nsec;
+               sync_it = 1;
        }
-       if (flags & XFS_ICHGTIME_CHG) {
+       if ((flags & XFS_ICHGTIME_CHG) &&
+           !timespec_equal(&inode->i_ctime, &tv)) {
                inode->i_ctime = tv;
                ip->i_d.di_ctime.t_sec = (__int32_t)tv.tv_sec;
                ip->i_d.di_ctime.t_nsec = (__int32_t)tv.tv_nsec;
+               sync_it = 1;
        }
 
        /*
@@ -119,10 +125,12 @@ xfs_ichgtime(
         * ensure that the compiler does not reorder the update
         * of i_update_core above the timestamp updates above.
         */
-       SYNCHRONIZE();
-       ip->i_update_core = 1;
-       if (!(inode->i_state & I_NEW))
-               mark_inode_dirty_sync(inode);
+       if (sync_it) {
+               SYNCHRONIZE();
+               ip->i_update_core = 1;
+               if (!(inode->i_state & I_NEW))
+                       mark_inode_dirty_sync(inode);
+       }
 }
 
 /*


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