xfs: ensure that fpunch, fcollapse, and finsert operations are aligned to rt extent...
authorDarrick J. Wong <darrick.wong@oracle.com>
Wed, 9 Sep 2020 21:21:06 +0000 (14:21 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Wed, 16 Sep 2020 03:52:42 +0000 (20:52 -0700)
Make sure that any fallocate operation that requires the range to be
block-aligned also checks that the range is aligned to the realtime
extent size.

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

index 5123f82..f2a8a0e 100644 (file)
@@ -946,6 +946,14 @@ xfs_free_file_space(
        startoffset_fsb = XFS_B_TO_FSB(mp, offset);
        endoffset_fsb = XFS_B_TO_FSBT(mp, offset + len);
 
+       /* We can only free complete realtime extents. */
+       if (XFS_IS_REALTIME_INODE(ip)) {
+               xfs_extlen_t    extsz = xfs_get_extsz_hint(ip);
+
+               if ((startoffset_fsb | endoffset_fsb) & (extsz - 1))
+                       return -EINVAL;
+       }
+
        /*
         * Need to zero the stuff we're not freeing, on disk.
         */
@@ -1139,6 +1147,14 @@ xfs_insert_file_space(
 
        trace_xfs_insert_file_space(ip);
 
+       /* We can only insert complete realtime extents. */
+       if (XFS_IS_REALTIME_INODE(ip)) {
+               xfs_extlen_t    extsz = xfs_get_extsz_hint(ip);
+
+               if ((stop_fsb | shift_fsb) & (extsz - 1))
+                       return -EINVAL;
+       }
+
        error = xfs_bmap_can_insert_extents(ip, stop_fsb, shift_fsb);
        if (error)
                return error;