iomap: move the PF_MEMALLOC check to iomap_writepages
authorChristoph Hellwig <hch@lst.de>
Thu, 7 Dec 2023 07:27:00 +0000 (08:27 +0100)
committerChristian Brauner <brauner@kernel.org>
Thu, 1 Feb 2024 13:20:11 +0000 (14:20 +0100)
The iomap writepage implementation has been removed in commit
478af190cb6c ("iomap: remove iomap_writepage") and this code is now only
called through ->writepages which never happens from memory reclaim.

Nove the check from iomap_do_writepage to iomap_writepages so that is
only called once per ->writepage invocation.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20231207072710.176093-5-hch@lst.de
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/iomap/buffered-io.c

index c013d35b07b78a258130df53cd501db1ce9e1a55..292ab7dade213a86f96c6d93dc995563544fa388 100644 (file)
@@ -1902,20 +1902,6 @@ static int iomap_do_writepage(struct folio *folio,
 
        trace_iomap_writepage(inode, folio_pos(folio), folio_size(folio));
 
-       /*
-        * Refuse to write the folio out if we're called from reclaim context.
-        *
-        * This avoids stack overflows when called from deeply used stacks in
-        * random callers for direct reclaim or memcg reclaim.  We explicitly
-        * allow reclaim from kswapd as the stack usage there is relatively low.
-        *
-        * This should never happen except in the case of a VM regression so
-        * warn about it.
-        */
-       if (WARN_ON_ONCE((current->flags & (PF_MEMALLOC|PF_KSWAPD)) ==
-                       PF_MEMALLOC))
-               goto redirty;
-
        /*
         * Is this folio beyond the end of the file?
         *
@@ -1981,8 +1967,6 @@ static int iomap_do_writepage(struct folio *folio,
 
        return iomap_writepage_map(wpc, wbc, inode, folio, end_pos);
 
-redirty:
-       folio_redirty_for_writepage(wbc, folio);
 unlock:
        folio_unlock(folio);
        return 0;
@@ -1995,6 +1979,14 @@ iomap_writepages(struct address_space *mapping, struct writeback_control *wbc,
 {
        int                     ret;
 
+       /*
+        * Writeback from reclaim context should never happen except in the case
+        * of a VM regression so warn about it and refuse to write the data.
+        */
+       if (WARN_ON_ONCE((current->flags & (PF_MEMALLOC | PF_KSWAPD)) ==
+                       PF_MEMALLOC))
+               return -EIO;
+
        wpc->ops = ops;
        ret = write_cache_pages(mapping, wbc, iomap_do_writepage, wpc);
        if (!wpc->ioend)