ext4: treat end of range as exclusive in ext4_zero_range()
authorOjaswin Mujoo <ojaswin@linux.ibm.com>
Wed, 1 Nov 2023 16:38:10 +0000 (22:08 +0530)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 5 Feb 2024 20:14:17 +0000 (20:14 +0000)
[ Upstream commit 92573369144f40397e8514440afdf59f24905b40 ]

The call to filemap_write_and_wait_range() assumes the range passed to be
inclusive, so fix the call to make sure we follow that.

Signed-off-by: Ojaswin Mujoo <ojaswin@linux.ibm.com>
Reviewed-by: Jan Kara <jack@suse.cz>
Link: https://lore.kernel.org/r/e503107a7c73a2b68dec645c5ad798c437717c45.1698856309.git.ojaswin@linux.ibm.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/ext4/extents.c

index 4d8496d..4c3e2f3 100644 (file)
@@ -4522,7 +4522,8 @@ static long ext4_zero_range(struct file *file, loff_t offset,
         * Round up offset. This is not fallocate, we need to zero out
         * blocks, so convert interior block aligned part of the range to
         * unwritten and possibly manually zero out unaligned parts of the
-        * range.
+        * range. Here, start and partial_begin are inclusive, end and
+        * partial_end are exclusive.
         */
        start = round_up(offset, 1 << blkbits);
        end = round_down((offset + len), 1 << blkbits);
@@ -4608,7 +4609,8 @@ static long ext4_zero_range(struct file *file, loff_t offset,
                 * disk in case of crash before zeroing trans is committed.
                 */
                if (ext4_should_journal_data(inode)) {
-                       ret = filemap_write_and_wait_range(mapping, start, end);
+                       ret = filemap_write_and_wait_range(mapping, start,
+                                                          end - 1);
                        if (ret) {
                                filemap_invalidate_unlock(mapping);
                                goto out_mutex;