> 下面是被转发的邮件: > > 发件人: linux-block+owner@xxxxxxxxxxxxxxx > 主题: HTML message rejected: Re: [PATCH] loop: move vfs_fsync() out of loop_update_dio() > 日期: 2025年3月19日 GMT+8 09:29:24 > 收件人: huk23@xxxxxxxxxxxxxx > > Greetings! > > This is the mlmmj program managing the <linux-block@xxxxxxxxxxxxxxx> > mailing list. > > Your message to <linux-block@xxxxxxxxxxxxxxx> was not delivered to the list > because it contained a HTML part. Only text/plain messages are allowed on > this list. > > Please configure your mail client to only send plain text mail. > > For your reference, the rejected message follows below. > > 发件人: Kun Hu <huk23@xxxxxxxxxxxxxx> > 主题: 回复:[PATCH] loop: move vfs_fsync() out of loop_update_dio() > 日期: 2025年3月19日 GMT+8 09:28:24 > 收件人: Ming Lei <ming.lei@xxxxxxxxxx> > 抄送: linux-block <linux-block@xxxxxxxxxxxxxxx>, Christoph Hellwig <hch@xxxxxxxxxxxxx>, "jjtan24@xxxxxxxxxxxxxx" <jjtan24@xxxxxxxxxxxxxx> > > > > >> 2025年3月18日 09:07,Ming Lei <ming.lei@xxxxxxxxxx> 写道: >> >> On Mon, Mar 17, 2025 at 04:52:16PM +0800, 胡焜 wrote: >>>> 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? >> >> The V2 has been sent out after updating comment, please verify if it fixes your issue: >> >> https://lore.kernel.org/linux-block/20250318010318.3861682-1-ming.lei@xxxxxxxxxx/ >> >> If yes, feel free to provide one tested-by for moving on. >> >> >> Thanks, >> Ming > > > > Thank you very much, this crash has not triggered again after several rounds of testing! > > Best, > Kun >