.. | .. |
---|
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); |
---|