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

Rajeev Mishra posted 2 patches 1 month, 3 weeks ago
[PATCH v4 2/2] loop: use vfs_getattr_nosec for accurate file size
Posted by Rajeev Mishra 1 month, 3 weeks ago
- 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@hpe.com>
---
 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 5faf8607dfb2..0a2703eda2c2 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