Skip to content

Commit 47b71ab

Browse files
Rajeev Mishraaxboe
authored andcommitted
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: Rajeev Mishra <[email protected]> Reviewed-by: Yu Kuai <[email protected]> Link: https://lore.kernel.org/r/[email protected] [axboe: massage commit message] Signed-off-by: Jens Axboe <[email protected]>
1 parent 8aa5a3b commit 47b71ab

File tree

1 file changed

+13
-2
lines changed

1 file changed

+13
-2
lines changed

drivers/block/loop.c

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,9 +139,20 @@ static int part_shift;
139139

140140
static loff_t lo_calculate_size(struct loop_device *lo, struct file *file)
141141
{
142+
struct kstat stat;
142143
loff_t loopsize;
143-
/* Compute loopsize in bytes */
144-
loopsize = i_size_read(file->f_mapping->host);
144+
int ret;
145+
146+
/*
147+
* Get the accurate file size. This provides better results than
148+
* cached inode data, particularly for network filesystems where
149+
* metadata may be stale.
150+
*/
151+
ret = vfs_getattr_nosec(&file->f_path, &stat, STATX_SIZE, 0);
152+
if (ret)
153+
return 0;
154+
155+
loopsize = stat.size;
145156
if (lo->lo_offset > 0)
146157
loopsize -= lo->lo_offset;
147158
/* offset is beyond i_size, weird but possible */

0 commit comments

Comments
 (0)