Commit c8e156ac authored by Darrick J. Wong's avatar Darrick J. Wong
Browse files

xfs: check for invalid inode reflink flags



We don't support sharing blocks on the realtime device.  Flag inodes
with the reflink or cowextsize flags set when the reflink feature is
disabled.

Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
parent e153aa79
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -375,6 +375,9 @@ xfs_dinode_verify(
	struct xfs_inode	*ip,
	struct xfs_dinode	*dip)
{
	uint16_t		flags;
	uint64_t		flags2;

	if (dip->di_magic != cpu_to_be16(XFS_DINODE_MAGIC))
		return false;

@@ -391,6 +394,19 @@ xfs_dinode_verify(
		return false;
	if (!uuid_equal(&dip->di_uuid, &mp->m_sb.sb_meta_uuid))
		return false;

	flags = be16_to_cpu(dip->di_flags);
	flags2 = be64_to_cpu(dip->di_flags2);

	/* don't allow reflink/cowextsize if we don't have reflink */
	if ((flags2 & (XFS_DIFLAG2_REFLINK | XFS_DIFLAG2_COWEXTSIZE)) &&
            !xfs_sb_version_hasreflink(&mp->m_sb))
		return false;

	/* don't let reflink and realtime mix */
	if ((flags2 & XFS_DIFLAG2_REFLINK) && (flags & XFS_DIFLAG_REALTIME))
		return false;

	return true;
}

+4 −0
Original line number Diff line number Diff line
@@ -1034,6 +1034,10 @@ xfs_ioctl_setattr_xflags(
			return -EINVAL;
	}

	/* Don't allow us to set realtime mode for a reflinked file. */
	if ((fa->fsx_xflags & FS_XFLAG_REALTIME) && xfs_is_reflink_inode(ip))
		return -EINVAL;

	/*
	 * Can't modify an immutable/append-only file unless
	 * we have appropriate permission.