[XFS] stop using file_update_time
xfs_ichtime updates the xfs_inode and Linux inode timestamps just fine, no need to call file_update_time and then copy the values over to the XFS inode. The only additional thing in file_update_time are checks not applicable to the write path. SGI-PV: 981498 SGI-Modid: xfs-linux-melb:xfs-kern:31829a Signed-off-by: Christoph Hellwig <hch@infradead.org> Signed-off-by: Lachlan McIlroy <lachlan@sgi.com> Signed-off-by: David Chinner <david@fromorbit.com>
This commit is contained in:
committed by
Lachlan McIlroy
parent
8e5975c82f
commit
3a76c1ea07
@@ -132,45 +132,6 @@ xfs_ichgtime(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Variant on the above which avoids querying the system clock
|
|
||||||
* in situations where we know the Linux inode timestamps have
|
|
||||||
* just been updated (and so we can update our inode cheaply).
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
xfs_ichgtime_fast(
|
|
||||||
xfs_inode_t *ip,
|
|
||||||
struct inode *inode,
|
|
||||||
int flags)
|
|
||||||
{
|
|
||||||
timespec_t *tvp;
|
|
||||||
|
|
||||||
if (flags & XFS_ICHGTIME_MOD) {
|
|
||||||
tvp = &inode->i_mtime;
|
|
||||||
ip->i_d.di_mtime.t_sec = (__int32_t)tvp->tv_sec;
|
|
||||||
ip->i_d.di_mtime.t_nsec = (__int32_t)tvp->tv_nsec;
|
|
||||||
}
|
|
||||||
if (flags & XFS_ICHGTIME_CHG) {
|
|
||||||
tvp = &inode->i_ctime;
|
|
||||||
ip->i_d.di_ctime.t_sec = (__int32_t)tvp->tv_sec;
|
|
||||||
ip->i_d.di_ctime.t_nsec = (__int32_t)tvp->tv_nsec;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We update the i_update_core field _after_ changing
|
|
||||||
* the timestamps in order to coordinate properly with
|
|
||||||
* xfs_iflush() so that we don't lose timestamp updates.
|
|
||||||
* This keeps us from having to hold the inode lock
|
|
||||||
* while doing this. We use the SYNCHRONIZE macro to
|
|
||||||
* 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);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Hook in SELinux. This is not quite correct yet, what we really need
|
* Hook in SELinux. This is not quite correct yet, what we really need
|
||||||
* here (as we do for default ACLs) is a mechanism by which creation of
|
* here (as we do for default ACLs) is a mechanism by which creation of
|
||||||
|
@@ -26,9 +26,6 @@ extern const struct file_operations xfs_invis_file_operations;
|
|||||||
|
|
||||||
extern ssize_t xfs_vn_listxattr(struct dentry *, char *data, size_t size);
|
extern ssize_t xfs_vn_listxattr(struct dentry *, char *data, size_t size);
|
||||||
|
|
||||||
extern void xfs_ichgtime(struct xfs_inode *, int);
|
|
||||||
extern void xfs_ichgtime_fast(struct xfs_inode *, struct inode *, int);
|
|
||||||
|
|
||||||
extern void xfs_setup_inode(struct xfs_inode *);
|
extern void xfs_setup_inode(struct xfs_inode *);
|
||||||
|
|
||||||
#endif /* __XFS_IOPS_H__ */
|
#endif /* __XFS_IOPS_H__ */
|
||||||
|
@@ -674,9 +674,7 @@ start:
|
|||||||
*/
|
*/
|
||||||
if (likely(!(ioflags & IO_INVIS) &&
|
if (likely(!(ioflags & IO_INVIS) &&
|
||||||
!mnt_want_write(file->f_path.mnt))) {
|
!mnt_want_write(file->f_path.mnt))) {
|
||||||
file_update_time(file);
|
xfs_ichgtime(xip, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
|
||||||
xfs_ichgtime_fast(xip, inode,
|
|
||||||
XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG);
|
|
||||||
mnt_drop_write(file->f_path.mnt);
|
mnt_drop_write(file->f_path.mnt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user