xfs: don't allow SWAPEXT if we'd screw up quota accounting
authorDarrick J. Wong <darrick.wong@oracle.com>
Tue, 12 May 2020 23:42:51 +0000 (16:42 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Tue, 19 May 2020 16:40:56 +0000 (09:40 -0700)
Since the old SWAPEXT ioctl doesn't know how to adjust quota ids,
bail out of the ids don't match and quotas are enabled.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Eric Sandeen <sandeen@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
fs/xfs/xfs_bmap_util.c

index cc23a3e23e2d10a6ef217ceb77f94ba9edbea123..b8acfd4d3ca64ca52bff1ab19e6a46e9b6d1bbc1 100644 (file)
@@ -1211,6 +1211,13 @@ xfs_swap_extents_check_format(
        struct xfs_inode        *tip)   /* tmp inode */
 {
 
+       /* User/group/project quota ids must match if quotas are enforced. */
+       if (XFS_IS_QUOTA_ON(ip->i_mount) &&
+           (!uid_eq(VFS_I(ip)->i_uid, VFS_I(tip)->i_uid) ||
+            !gid_eq(VFS_I(ip)->i_gid, VFS_I(tip)->i_gid) ||
+            ip->i_d.di_projid != tip->i_d.di_projid))
+               return -EINVAL;
+
        /* Should never get a local format */
        if (ip->i_d.di_format == XFS_DINODE_FMT_LOCAL ||
            tip->i_d.di_format == XFS_DINODE_FMT_LOCAL)