]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
block: loop: Enable directIO whenever possible
authorDave Kleikamp <dave.kleikamp@oracle.com>
Fri, 17 Jul 2015 16:32:59 +0000 (09:32 -0700)
committerSantosh Shilimkar <santosh.shilimkar@oracle.com>
Fri, 17 Jul 2015 16:32:59 +0000 (09:32 -0700)
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 <dave.kleikamp@oracle.com>
Signed-off-by: Santosh Shilimkar <santosh.shilimkar@oracle.com>
drivers/block/loop.c

index 48bfde4079d4480d6fb59f0701461969f9b845c5..0fb2c0a59a59b28b7c66db26c8e6edbc1db71b07 100644 (file)
@@ -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);