]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
iomap: avoid avoid truncating 64-bit offset to 32 bits
authorMarco Nelissen <marco.nelissen@gmail.com>
Thu, 9 Jan 2025 04:11:50 +0000 (20:11 -0800)
committerChristian Brauner <brauner@kernel.org>
Thu, 9 Jan 2025 15:09:20 +0000 (16:09 +0100)
on 32-bit kernels, iomap_write_delalloc_scan() was inadvertently using a
32-bit position due to folio_next_index() returning an unsigned long.
This could lead to an infinite loop when writing to an xfs filesystem.

Signed-off-by: Marco Nelissen <marco.nelissen@gmail.com>
Link: https://lore.kernel.org/r/20250109041253.2494374-1-marco.nelissen@gmail.com
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/iomap/buffered-io.c

index 54dc27d9278102b1733df0f376d0af18acea98e7..d303e6c8900cd1eba296b34a94849954b40d46cc 100644 (file)
@@ -1138,7 +1138,7 @@ static void iomap_write_delalloc_scan(struct inode *inode,
                                start_byte, end_byte, iomap, punch);
 
                /* move offset to start of next folio in range */
-               start_byte = folio_next_index(folio) << PAGE_SHIFT;
+               start_byte = folio_pos(folio) + folio_size(folio);
                folio_unlock(folio);
                folio_put(folio);
        }