diff options
| -rw-r--r-- | fs/xfs/xfs_iops.c | 66 |
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 | ||
| 477 | static void | ||
| 478 | xfs_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 | |||
| 477 | int | 503 | int |
| 478 | xfs_setattr_nonsize( | 504 | xfs_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 | ||
