]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
iomap: always run error completions in user context
authorChristoph Hellwig <hch@lst.de>
Thu, 13 Nov 2025 17:06:27 +0000 (18:06 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 18 Dec 2025 13:03:17 +0000 (14:03 +0100)
[ Upstream commit ddb4873286e03e193c5a3bebb5fc6fa820e9ee3a ]

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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
fs/iomap/direct-io.c

index 5d5d63efbd57678f29eb309bd87fbd83633656cc..143160042552b345fdbbfb33aca3591b473770cc 100644 (file)
@@ -179,7 +179,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 if (dio->flags & IOMAP_DIO_CALLER_COMP) {