aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/xfs/xfs_iops.c66
1 files changed, 30 insertions, 36 deletions
diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c
index e7f4e4f4eab9..5762282895a5 100644
--- a/fs/xfs/xfs_iops.c
+++ b/fs/xfs/xfs_iops.c
@@ -474,6 +474,32 @@ xfs_setattr_mode(
474 inode->i_mode |= mode & ~S_IFMT; 474 inode->i_mode |= mode & ~S_IFMT;
475} 475}
476 476
477static void
478xfs_setattr_time(
479 struct xfs_inode *ip,
480 struct iattr *iattr)
481{
482 struct inode *inode = VFS_I(ip);
483
484 ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
485
486 if (iattr->ia_valid & ATTR_ATIME) {
487 inode->i_atime = iattr->ia_atime;
488 ip->i_d.di_atime.t_sec = iattr->ia_atime.tv_sec;
489 ip->i_d.di_atime.t_nsec = iattr->ia_atime.tv_nsec;
490 }
491 if (iattr->ia_valid & ATTR_CTIME) {
492 inode->i_ctime = iattr->ia_ctime;
493 ip->i_d.di_ctime.t_sec = iattr->ia_ctime.tv_sec;
494 ip->i_d.di_ctime.t_nsec = iattr->ia_ctime.tv_nsec;
495 }
496 if (iattr->ia_valid & ATTR_MTIME) {
497 inode->i_mtime = iattr->ia_mtime;
498 ip->i_d.di_mtime.t_sec = iattr->ia_mtime.tv_sec;
499 ip->i_d.di_mtime.t_nsec = iattr->ia_mtime.tv_nsec;
500 }
501}
502
477int 503int
478xfs_setattr_nonsize( 504xfs_setattr_nonsize(
479 struct xfs_inode *ip, 505 struct xfs_inode *ip,
@@ -627,30 +653,10 @@ xfs_setattr_nonsize(
627 } 653 }
628 } 654 }
629 655
630 /*
631 * Change file access modes.
632 */
633 if (mask & ATTR_MODE) 656 if (mask & ATTR_MODE)
634 xfs_setattr_mode(ip, iattr); 657 xfs_setattr_mode(ip, iattr);
635 658 if (mask & (ATTR_ATIME|ATTR_CTIME|ATTR_MTIME))
636 /* 659 xfs_setattr_time(ip, iattr);
637 * Change file access or modified times.
638 */
639 if (mask & ATTR_ATIME) {
640 inode->i_atime = iattr->ia_atime;
641 ip->i_d.di_atime.t_sec = iattr->ia_atime.tv_sec;
642 ip->i_d.di_atime.t_nsec = iattr->ia_atime.tv_nsec;
643 }
644 if (mask & ATTR_CTIME) {
645 inode->i_ctime = iattr->ia_ctime;
646 ip->i_d.di_ctime.t_sec = iattr->ia_ctime.tv_sec;
647 ip->i_d.di_ctime.t_nsec = iattr->ia_ctime.tv_nsec;
648 }
649 if (mask & ATTR_MTIME) {
650 inode->i_mtime = iattr->ia_mtime;
651 ip->i_d.di_mtime.t_sec = iattr->ia_mtime.tv_sec;
652 ip->i_d.di_mtime.t_nsec = iattr->ia_mtime.tv_nsec;
653 }
654 660
655 xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); 661 xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
656 662
@@ -865,22 +871,10 @@ xfs_setattr_size(
865 xfs_inode_clear_eofblocks_tag(ip); 871 xfs_inode_clear_eofblocks_tag(ip);
866 } 872 }
867 873
868 /*
869 * Change file access modes.
870 */
871 if (mask & ATTR_MODE) 874 if (mask & ATTR_MODE)
872 xfs_setattr_mode(ip, iattr); 875 xfs_setattr_mode(ip, iattr);
873 876 if (mask & (ATTR_ATIME|ATTR_CTIME|ATTR_MTIME))
874 if (mask & ATTR_CTIME) { 877 xfs_setattr_time(ip, iattr);
875 inode->i_ctime = iattr->ia_ctime;
876 ip->i_d.di_ctime.t_sec = iattr->ia_ctime.tv_sec;
877 ip->i_d.di_ctime.t_nsec = iattr->ia_ctime.tv_nsec;
878 }
879 if (mask & ATTR_MTIME) {
880 inode->i_mtime = iattr->ia_mtime;
881 ip->i_d.di_mtime.t_sec = iattr->ia_mtime.tv_sec;
882 ip->i_d.di_mtime.t_nsec = iattr->ia_mtime.tv_nsec;
883 }
884 878
885 xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); 879 xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
886 880