udf: Truncate added extents on failed expansion

commit 70bfb3a8d6 upstream.

When a file expansion failed because we didn't have enough space for
indirect extents make sure we truncate extents created so far so that we
don't leave extents beyond EOF.

CC: stable@vger.kernel.org
Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Jan Kara 2022-12-15 14:24:03 +01:00 committed by Greg Kroah-Hartman
parent 0dae50b0de
commit 767f413688

View file

@ -521,8 +521,10 @@ static int udf_do_extend_file(struct inode *inode,
}
if (fake) {
udf_add_aext(inode, last_pos, &last_ext->extLocation,
last_ext->extLength, 1);
err = udf_add_aext(inode, last_pos, &last_ext->extLocation,
last_ext->extLength, 1);
if (err < 0)
goto out_err;
count++;
} else {
struct kernel_lb_addr tmploc;
@ -556,7 +558,7 @@ static int udf_do_extend_file(struct inode *inode,
err = udf_add_aext(inode, last_pos, &last_ext->extLocation,
last_ext->extLength, 1);
if (err)
return err;
goto out_err;
count++;
}
if (new_block_bytes) {
@ -565,7 +567,7 @@ static int udf_do_extend_file(struct inode *inode,
err = udf_add_aext(inode, last_pos, &last_ext->extLocation,
last_ext->extLength, 1);
if (err)
return err;
goto out_err;
count++;
}
@ -579,6 +581,11 @@ static int udf_do_extend_file(struct inode *inode,
return -EIO;
return count;
out_err:
/* Remove extents we've created so far */
udf_clear_extent_cache(inode);
udf_truncate_extents(inode);
return err;
}
/* Extend the final block of the file to final_block_len bytes */