From 1f896b10e6e3417316e27cb573e3ab9be0eefdd4 Mon Sep 17 00:00:00 2001 From: Konstantin Germanov Date: Wed, 29 Jun 2022 10:33:26 -0400 Subject: [PATCH] Improve ntfs_device_size_get for file For avoid random read we can use IO callback for get stat. --- libntfs-3g/device.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/libntfs-3g/device.c b/libntfs-3g/device.c index a5c32f42..6c478a2d 100644 --- a/libntfs-3g/device.c +++ b/libntfs-3g/device.c @@ -529,6 +529,7 @@ static int ntfs_device_offset_valid(struct ntfs_device *dev, s64 ofs) s64 ntfs_device_size_get(struct ntfs_device *dev, int block_size) { s64 high, low; + struct stat sbuf; if (!dev || block_size <= 0 || (block_size - 1) & block_size) { errno = EINVAL; @@ -596,6 +597,18 @@ s64 ntfs_device_size_get(struct ntfs_device *dev, int block_size) } } #endif + /* + * We couldn't figure it out by using a specialized ioctl, + * so do lstat on device. + */ + if (dev->d_ops->stat(dev, &sbuf) == 0) { + ntfs_log_debug("STAT nr bytes = %llu (0x%llx)\n", + (unsigned long long)sbuf.st_size, + (unsigned long long)sbuf.st_size); + + return sbuf.st_size / block_size; + } + /* * We couldn't figure it out by using a specialized ioctl, * so do binary search to find the size of the device.