From ace8077124e9a473bb6078fbb266bee3846a5cff Mon Sep 17 00:00:00 2001 From: Dave Kleikamp Date: Fri, 17 Jul 2015 09:32:59 -0700 Subject: [PATCH] block: loop: Enable directIO whenever possible The patches intended for mainline required a user-space change to losetup setting O_DIRECT on the backing file. We avoid this for UEK. I also made some changes to keep lo->lo_flags (LO_FLAGS_DIRECT_IO) and lo->use_dio in sync. Signed-off-by: Dave Kleikamp Signed-off-by: Santosh Shilimkar --- drivers/block/loop.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/drivers/block/loop.c b/drivers/block/loop.c index 48bfde4079d4..0fb2c0a59a59 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -541,13 +541,19 @@ static void __loop_update_dio(struct loop_device *lo, bool dio) */ blk_mq_freeze_queue(lo->lo_queue); lo->use_dio = use_dio; - lo->lo_flags |= use_dio ? LO_FLAGS_DIRECT_IO : 0; + if (use_dio) + lo->lo_flags |= LO_FLAGS_DIRECT_IO; + else + lo->lo_flags &= ~LO_FLAGS_DIRECT_IO; blk_mq_unfreeze_queue(lo->lo_queue); } static inline void loop_update_dio(struct loop_device *lo) { - __loop_update_dio(lo, io_is_direct(lo->lo_backing_file)); + /* + * UEK kernel will use direct-io whenever possible + */ + __loop_update_dio(lo, 1); } /* @@ -893,6 +899,7 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode, lo->lo_backing_file = file; lo->transfer = NULL; lo->ioctl = NULL; + lo->use_dio = 0; lo->lo_sizelimit = 0; lo->old_gfp_mask = mapping_gfp_mask(mapping); mapping_set_gfp_mask(mapping, lo->old_gfp_mask & ~(__GFP_IO|__GFP_FS)); @@ -1007,6 +1014,7 @@ static int loop_clr_fd(struct loop_device *lo) lo->lo_offset = 0; lo->lo_sizelimit = 0; lo->lo_encrypt_key_size = 0; + lo->use_dio = 0; memset(lo->lo_encrypt_key, 0, LO_KEY_SIZE); memset(lo->lo_crypt_name, 0, LO_NAME_SIZE); memset(lo->lo_file_name, 0, LO_NAME_SIZE); -- 2.50.1