summaryrefslogtreecommitdiff
path: root/drivers/block
diff options
context:
space:
mode:
authorChristoph Hellwig <hch@lst.de>2025-01-10 08:37:33 +0100
committerJens Axboe <axboe@kernel.dk>2025-01-10 07:31:50 -0700
commit781fc49a0e5c111b1a210bd1b3499c89bb21cd81 (patch)
tree86b53ffcb2c04d8b3ccb4d7882f9a384229cf4ed /drivers/block
parent4155adb01e7406653f6b01aaca916a59567cfbfa (diff)
loop: create a lo_can_use_dio helper
Factor out a part of __loop_update_dio in preparation for further refactoring. Signed-off-by: Christoph Hellwig <hch@lst.de> Link: https://lore.kernel.org/r/20250110073750.1582447-4-hch@lst.de Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'drivers/block')
-rw-r--r--drivers/block/loop.c25
1 files changed, 14 insertions, 11 deletions
diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index 0c7dfc6eee12..55bea9c95b45 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -182,26 +182,29 @@ static bool lo_bdev_can_use_dio(struct loop_device *lo,
return true;
}
-static void __loop_update_dio(struct loop_device *lo, bool dio)
+static bool lo_can_use_dio(struct loop_device *lo)
{
- struct file *file = lo->lo_backing_file;
- struct inode *inode = file->f_mapping->host;
- struct block_device *backing_bdev = NULL;
- bool use_dio;
+ struct inode *inode = lo->lo_backing_file->f_mapping->host;
+
+ if (!(lo->lo_backing_file->f_mode & FMODE_CAN_ODIRECT))
+ return false;
if (S_ISBLK(inode->i_mode))
- backing_bdev = I_BDEV(inode);
- else if (inode->i_sb->s_bdev)
- backing_bdev = inode->i_sb->s_bdev;
+ return lo_bdev_can_use_dio(lo, I_BDEV(inode));
+ if (inode->i_sb->s_bdev)
+ return lo_bdev_can_use_dio(lo, inode->i_sb->s_bdev);
+ return true;
+}
- use_dio = dio && (file->f_mode & FMODE_CAN_ODIRECT) &&
- (!backing_bdev || lo_bdev_can_use_dio(lo, backing_bdev));
+static void __loop_update_dio(struct loop_device *lo, bool dio)
+{
+ bool use_dio = dio && lo_can_use_dio(lo);
if (lo->use_dio == use_dio)
return;
/* flush dirty pages before changing direct IO */
- vfs_fsync(file, 0);
+ vfs_fsync(lo->lo_backing_file, 0);
/*
* The flag of LO_FLAGS_DIRECT_IO is handled similarly with