Set BIO_COMPLETE_IN_TASK on iomap writeback bios when IOMAP_IOEND_DONTCACHE is set. This ensures that bi_end_io runs in task context, where folio_end_dropbehind() can safely invalidate folios. With the bio layer now handling task-context deferral generically, XFS no longer needs to route DONTCACHE ioends through its completion workqueue for page cache invalidation. Remove the DONTCACHE check from xfs_ioend_needs_wq_completion(). Signed-off-by: Tal Zussman --- fs/iomap/ioend.c | 2 ++ fs/xfs/xfs_aops.c | 4 ---- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/fs/iomap/ioend.c b/fs/iomap/ioend.c index e4d57cb969f1..6b8375d11cc0 100644 --- a/fs/iomap/ioend.c +++ b/fs/iomap/ioend.c @@ -113,6 +113,8 @@ static struct iomap_ioend *iomap_alloc_ioend(struct iomap_writepage_ctx *wpc, GFP_NOFS, &iomap_ioend_bioset); bio->bi_iter.bi_sector = iomap_sector(&wpc->iomap, pos); bio->bi_write_hint = wpc->inode->i_write_hint; + if (ioend_flags & IOMAP_IOEND_DONTCACHE) + bio_set_flag(bio, BIO_COMPLETE_IN_TASK); wbc_init_bio(wpc->wbc, bio); wpc->nr_folios = 0; return iomap_init_ioend(wpc->inode, bio, pos, ioend_flags); diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 76678814f46f..0d469b91377d 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -510,10 +510,6 @@ xfs_ioend_needs_wq_completion( if (ioend->io_flags & (IOMAP_IOEND_UNWRITTEN | IOMAP_IOEND_SHARED)) return true; - /* Page cache invalidation cannot be done in irq context. */ - if (ioend->io_flags & IOMAP_IOEND_DONTCACHE) - return true; - return false; } -- 2.39.5