Commit 47b71abd authored by Rajeev Mishra's avatar Rajeev Mishra Committed by Jens Axboe
Browse files

loop: use vfs_getattr_nosec for accurate file size



Use vfs_getattr_nosec() in lo_calculate_size() for getting the file
size, rather than just read the cached inode size via i_size_read().
This provides better results than cached inode data, particularly for
network filesystems where metadata may be stale.

Signed-off-by: default avatarRajeev Mishra <rajeevm@hpe.com>
Reviewed-by: default avatarYu Kuai <yukuai3@huawei.com>
Link: https://lore.kernel.org/r/20250818184821.115033-3-rajeevm@hpe.com


[axboe: massage commit message]
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 8aa5a3b6
Loading
Loading
Loading
Loading
+13 −2
Original line number Diff line number Diff line
@@ -139,9 +139,20 @@ static int part_shift;

static loff_t lo_calculate_size(struct loop_device *lo, struct file *file)
{
	struct kstat stat;
	loff_t loopsize;
	/* Compute loopsize in bytes */
	loopsize = i_size_read(file->f_mapping->host);
	int ret;

	/*
	 * Get the accurate file size. This provides better results than
	 * cached inode data, particularly for network filesystems where
	 * metadata may be stale.
	 */
	ret = vfs_getattr_nosec(&file->f_path, &stat, STATX_SIZE, 0);
	if (ret)
		return 0;

	loopsize = stat.size;
	if (lo->lo_offset > 0)
		loopsize -= lo->lo_offset;
	/* offset is beyond i_size, weird but possible */