> drivers/block/loop.c | 12 ++++++------ > 1 file changed, 6 insertions(+), 6 deletions(-) > diff --git a/drivers/block/loop.c b/drivers/block/loop.c > index 1ec7417c7f00..be7e20064427 100644 > --- a/drivers/block/loop.c > +++ b/drivers/block/loop.c > @@ -205,8 +205,6 @@ static bool lo_can_use_dio(struct loop_device *lo) > */ > static inline void loop_update_dio(struct loop_device *lo) > { > - bool dio_in_use = lo->lo_flags & LO_FLAGS_DIRECT_IO; > - > lockdep_assert_held(&lo->lo_mutex); > WARN_ON_ONCE(lo->lo_state == Lo_bound && > lo->lo_queue->mq_freeze_depth == 0); > @@ -215,10 +213,6 @@ static inline void loop_update_dio(struct loop_device *lo) > lo->lo_flags |= LO_FLAGS_DIRECT_IO; > if ((lo->lo_flags & LO_FLAGS_DIRECT_IO) && !lo_can_use_dio(lo)) > lo->lo_flags &= ~LO_FLAGS_DIRECT_IO; > - > - /* flush dirty pages before starting to issue direct I/O */ > - if ((lo->lo_flags & LO_FLAGS_DIRECT_IO) && !dio_in_use) > - vfs_fsync(lo->lo_backing_file, 0); > } > > /** > @@ -621,6 +615,9 @@ static int loop_change_fd(struct loop_device *lo, struct block_device *bdev, > if (get_loop_size(lo, file) != get_loop_size(lo, old_file)) > goto out_err; > + /* may work in dio, so flush page cache for avoiding race */ > + vfs_fsync(file, 0); > + > /* and ... switch */ > disk_force_media_change(lo->lo_disk); > blk_mq_freeze_queue(lo->lo_queue); > @@ -1098,6 +1095,9 @@ static int loop_configure(struct loop_device *lo, blk_mode_t mode, > if (error) > goto out_unlock; > + /* may work in dio, so flush page cache for avoiding race */ > + vfs_fsync(file, 0); > + > loop_update_dio(lo); > loop_sysfs_init(lo); > > -- > 2.44.0 Hello Ming, I would like to double check that this fix doesn't seem to have been merged into the main thread, will this version still be merged into mainline kernel tree? Thanks, Kun