[PATCH v4 2/2] loop: use vfs_getattr_nosec for accurate file size

From: Rajeev Mishra
Date: Thu Aug 14 2025 - 15:11:15 EST


- Use vfs_getattr_nosec() instead of i_size_read() in lo_calculate_size.
- Improves accuracy for network/distributed filesystems.

Signed-off-by: Rajeev Mishra <rajeevm@xxxxxxx>
---
drivers/block/loop.c | 15 +++++++++++++--
1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index 0e1b9eb9db10..57263c273f0f 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -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 */
--
2.43.7