Skip to content

Commit

Permalink
xfs: check for invalid inode reflink flags
Browse files Browse the repository at this point in the history
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: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
  • Loading branch information
Darrick J. Wong committed Oct 5, 2016
1 parent e153aa7 commit c8e156a
Showing 2 changed files with 20 additions and 0 deletions.
16 changes: 16 additions & 0 deletions fs/xfs/libxfs/xfs_inode_buf.c
Original file line number Diff line number Diff line change
@@ -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 changes: 4 additions & 0 deletions fs/xfs/xfs_ioctl.c
Original file line number Diff line number Diff line change
@@ -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.

0 comments on commit c8e156a

Please sign in to comment.