diff options
| author | Christoph Hellwig <hch@lst.de> | 2025-11-13 18:06:27 +0100 |
|---|---|---|
| committer | Christian Brauner <brauner@kernel.org> | 2025-11-14 12:46:35 +0100 |
| commit | 222f2c7c6d14d789c64c8376c0984818e4e0258a (patch) | |
| tree | 05a433616f4038fb8f53172a88033d42f1f36f22 | |
| parent | 56749ed317e256c6dc3ca83e246fc17479366f83 (diff) | |
| download | tip-222f2c7c6d14.tar.gz | |
iomap: always run error completions in user context
Notice: this object is not reachable from any branch.
At least zonefs expects error completions to be able to sleep. Because
error completions aren't performance critical, just defer them to workqueue
context unconditionally.
Fixes: 8dcc1a9d90c1 ("fs: New zonefs file system")
Signed-off-by: Christoph Hellwig <hch@lst.de>
Link: https://patch.msgid.link/20251113170633.1453259-3-hch@lst.de
Reviewed-by: Jan Kara <jack@suse.cz>
Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com>
Signed-off-by: Christian Brauner <brauner@kernel.org>
Notice: this object is not reachable from any branch.
| -rw-r--r-- | fs/iomap/direct-io.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/fs/iomap/direct-io.c b/fs/iomap/direct-io.c index 7659db85083afa..765ab6dd66374f 100644 --- a/fs/iomap/direct-io.c +++ b/fs/iomap/direct-io.c @@ -173,7 +173,18 @@ static void iomap_dio_done(struct iomap_dio *dio) WRITE_ONCE(dio->submit.waiter, NULL); blk_wake_io_task(waiter); - } else if (dio->flags & IOMAP_DIO_INLINE_COMP) { + return; + } + + /* + * Always run error completions in user context. These are not + * performance critical and some code relies on taking sleeping locks + * for error handling. + */ + if (dio->error) + dio->flags &= ~IOMAP_DIO_INLINE_COMP; + + if (dio->flags & IOMAP_DIO_INLINE_COMP) { WRITE_ONCE(iocb->private, NULL); iomap_dio_complete_work(&dio->aio.work); } else { |
