[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <Z-Ly4WmAaN7aev3R@casper.infradead.org>
Date: Tue, 25 Mar 2025 18:16:01 +0000
From: Matthew Wilcox <willy@...radead.org>
To: Purva Yeshi <purvayeshi550@...il.com>
Cc: Alexander Viro <viro@...iv.linux.org.uk>, linux-fsdevel@...r.kernel.org,
linux-kernel@...r.kernel.org,
syzbot+219127d0a3bce650e1b6@...kaller.appspotmail.com
Subject: Re: [PATCH] fs: Fix jfs_fsync() Sleeping in Invalid Context
On Tue, Mar 25, 2025 at 11:03:36PM +0530, Purva Yeshi wrote:
> +++ b/fs/direct-io.c
> @@ -356,13 +356,9 @@ static void dio_bio_end_aio(struct bio *bio)
> defer_completion = dio->defer_completion ||
> (dio_op == REQ_OP_WRITE &&
> dio->inode->i_mapping->nrpages);
> - if (defer_completion) {
> - INIT_WORK(&dio->complete_work, dio_aio_complete_work);
> - queue_work(dio->inode->i_sb->s_dio_done_wq,
> - &dio->complete_work);
> - } else {
> - dio_complete(dio, 0, DIO_COMPLETE_ASYNC);
> - }
> +
> + INIT_WORK(&dio->complete_work, dio_aio_complete_work);
> + queue_work(dio->inode->i_sb->s_dio_done_wq, &dio->complete_work);
This patch is definitely wrong. If it were the right thing to do, then
since defer_completion is now un-read, we should stop calculating it.
I'm not sure what the right solution is; should we simply do:
defer_completion = dio->defer_completion ||
+ in_atomic() ||
(dio_op == REQ_OP_WRITE &&
dio->inode->i_mapping->nrpages);
I'm kind of surprised this problem hasn't cropped up before now ...
Powered by blists - more mailing lists