| .. | .. |
|---|
| 595 | 595 | return 0; |
|---|
| 596 | 596 | } |
|---|
| 597 | 597 | |
|---|
| 598 | | -static void |
|---|
| 599 | | -xfs_setattr_mode( |
|---|
| 600 | | - struct xfs_inode *ip, |
|---|
| 601 | | - struct iattr *iattr) |
|---|
| 602 | | -{ |
|---|
| 603 | | - struct inode *inode = VFS_I(ip); |
|---|
| 604 | | - umode_t mode = iattr->ia_mode; |
|---|
| 605 | | - |
|---|
| 606 | | - ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); |
|---|
| 607 | | - |
|---|
| 608 | | - inode->i_mode &= S_IFMT; |
|---|
| 609 | | - inode->i_mode |= mode & ~S_IFMT; |
|---|
| 610 | | -} |
|---|
| 611 | | - |
|---|
| 612 | | -void |
|---|
| 613 | | -xfs_setattr_time( |
|---|
| 614 | | - struct xfs_inode *ip, |
|---|
| 615 | | - struct iattr *iattr) |
|---|
| 616 | | -{ |
|---|
| 617 | | - struct inode *inode = VFS_I(ip); |
|---|
| 618 | | - |
|---|
| 619 | | - ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL)); |
|---|
| 620 | | - |
|---|
| 621 | | - if (iattr->ia_valid & ATTR_ATIME) |
|---|
| 622 | | - inode->i_atime = iattr->ia_atime; |
|---|
| 623 | | - if (iattr->ia_valid & ATTR_CTIME) |
|---|
| 624 | | - inode->i_ctime = iattr->ia_ctime; |
|---|
| 625 | | - if (iattr->ia_valid & ATTR_MTIME) |
|---|
| 626 | | - inode->i_mtime = iattr->ia_mtime; |
|---|
| 627 | | -} |
|---|
| 628 | | - |
|---|
| 629 | 598 | static int |
|---|
| 630 | 599 | xfs_vn_change_ok( |
|---|
| 631 | 600 | struct dentry *dentry, |
|---|
| .. | .. |
|---|
| 741 | 710 | } |
|---|
| 742 | 711 | |
|---|
| 743 | 712 | /* |
|---|
| 744 | | - * CAP_FSETID overrides the following restrictions: |
|---|
| 745 | | - * |
|---|
| 746 | | - * The set-user-ID and set-group-ID bits of a file will be |
|---|
| 747 | | - * cleared upon successful return from chown() |
|---|
| 748 | | - */ |
|---|
| 749 | | - if ((inode->i_mode & (S_ISUID|S_ISGID)) && |
|---|
| 750 | | - !capable(CAP_FSETID)) |
|---|
| 751 | | - inode->i_mode &= ~(S_ISUID|S_ISGID); |
|---|
| 752 | | - |
|---|
| 753 | | - /* |
|---|
| 754 | 713 | * Change the ownerships and register quota modifications |
|---|
| 755 | 714 | * in the transaction. |
|---|
| 756 | 715 | */ |
|---|
| .. | .. |
|---|
| 761 | 720 | olddquot1 = xfs_qm_vop_chown(tp, ip, |
|---|
| 762 | 721 | &ip->i_udquot, udqp); |
|---|
| 763 | 722 | } |
|---|
| 764 | | - inode->i_uid = uid; |
|---|
| 765 | 723 | } |
|---|
| 766 | 724 | if (!gid_eq(igid, gid)) { |
|---|
| 767 | 725 | if (XFS_IS_QUOTA_RUNNING(mp) && XFS_IS_GQUOTA_ON(mp)) { |
|---|
| .. | .. |
|---|
| 772 | 730 | olddquot2 = xfs_qm_vop_chown(tp, ip, |
|---|
| 773 | 731 | &ip->i_gdquot, gdqp); |
|---|
| 774 | 732 | } |
|---|
| 775 | | - inode->i_gid = gid; |
|---|
| 776 | 733 | } |
|---|
| 777 | 734 | } |
|---|
| 778 | 735 | |
|---|
| 779 | | - if (mask & ATTR_MODE) |
|---|
| 780 | | - xfs_setattr_mode(ip, iattr); |
|---|
| 781 | | - if (mask & (ATTR_ATIME|ATTR_CTIME|ATTR_MTIME)) |
|---|
| 782 | | - xfs_setattr_time(ip, iattr); |
|---|
| 783 | | - |
|---|
| 736 | + setattr_copy(inode, iattr); |
|---|
| 784 | 737 | xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); |
|---|
| 785 | 738 | |
|---|
| 786 | 739 | XFS_STATS_INC(mp, xs_ig_attrchg); |
|---|
| .. | .. |
|---|
| 1025 | 978 | xfs_inode_clear_eofblocks_tag(ip); |
|---|
| 1026 | 979 | } |
|---|
| 1027 | 980 | |
|---|
| 1028 | | - if (iattr->ia_valid & ATTR_MODE) |
|---|
| 1029 | | - xfs_setattr_mode(ip, iattr); |
|---|
| 1030 | | - if (iattr->ia_valid & (ATTR_ATIME|ATTR_CTIME|ATTR_MTIME)) |
|---|
| 1031 | | - xfs_setattr_time(ip, iattr); |
|---|
| 1032 | | - |
|---|
| 981 | + ASSERT(!(iattr->ia_valid & (ATTR_UID | ATTR_GID))); |
|---|
| 982 | + setattr_copy(inode, iattr); |
|---|
| 1033 | 983 | xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); |
|---|
| 1034 | 984 | |
|---|
| 1035 | 985 | XFS_STATS_INC(mp, xs_ig_attrchg); |
|---|