Set mapping->gfp mask to GFP_NOFS for all metadata inodes so that
allocating pages in the address space of those inodes won't call back
into the filesystem.  This allows to switch back from
find_or_create_page() to grab_cache_page() in two places.

Partially reverts commit 220cca2a4f58 ("GFS2: Change truncate page
allocation to be GFP_NOFS").

Signed-off-by: Andreas Gruenbacher <agrue...@redhat.com>
---
 fs/gfs2/inode.c | 10 ++++++++--
 fs/gfs2/lops.c  |  7 +++----
 fs/gfs2/quota.c |  2 +-
 3 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c
index 17c994a0c0d0..85ff065ac90c 100644
--- a/fs/gfs2/inode.c
+++ b/fs/gfs2/inode.c
@@ -278,8 +278,14 @@ struct inode *gfs2_lookup_simple(struct inode *dip, const 
char *name)
         */
        if (inode == NULL)
                return ERR_PTR(-ENOENT);
-       else
-               return inode;
+
+       /*
+        * Must not call back into the filesystem when allocating
+        * pages in the metadata inode's address space.
+        */
+       mapping_set_gfp_mask(inode->i_mapping, GFP_NOFS);
+
+       return inode;
 }
 
 
diff --git a/fs/gfs2/lops.c b/fs/gfs2/lops.c
index 251322b01631..483f69807062 100644
--- a/fs/gfs2/lops.c
+++ b/fs/gfs2/lops.c
@@ -456,7 +456,7 @@ static bool gfs2_jhead_pg_srch(struct gfs2_jdesc *jd,
  * Find the folio with 'index' in the journal's mapping. Search the folio for
  * the journal head if requested (cleanup == false). Release refs on the
  * folio so the page cache can reclaim it. We grabbed a
- * reference on this folio twice, first when we did a find_or_create_page()
+ * reference on this folio twice, first when we did a grab_cache_page()
  * to obtain the folio to add it to the bio and second when we do a
  * filemap_get_folio() here to get the folio to wait on while I/O on it is 
being
  * completed.
@@ -481,7 +481,7 @@ static void gfs2_jhead_process_page(struct gfs2_jdesc *jd, 
unsigned long index,
        if (!*done)
                *done = gfs2_jhead_pg_srch(jd, head, &folio->page);
 
-       /* filemap_get_folio() and the earlier find_or_create_page() */
+       /* filemap_get_folio() and the earlier grab_cache_page() */
        folio_put_refs(folio, 2);
 }
 
@@ -535,8 +535,7 @@ int gfs2_find_jhead(struct gfs2_jdesc *jd, struct 
gfs2_log_header_host *head,
 
                for (; block < je->lblock + je->blocks; block++, dblock++) {
                        if (!page) {
-                               page = find_or_create_page(mapping,
-                                               block >> shift, GFP_NOFS);
+                               page = grab_cache_page(mapping, block >> shift);
                                if (!page) {
                                        ret = -ENOMEM;
                                        done = true;
diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c
index 704192b73605..96d41ee034d7 100644
--- a/fs/gfs2/quota.c
+++ b/fs/gfs2/quota.c
@@ -724,7 +724,7 @@ static int gfs2_write_buf_to_page(struct gfs2_inode *ip, 
unsigned long index,
        blk = index << (PAGE_SHIFT - sdp->sd_sb.sb_bsize_shift);
        boff = off % bsize;
 
-       page = find_or_create_page(mapping, index, GFP_NOFS);
+       page = grab_cache_page(mapping, index);
        if (!page)
                return -ENOMEM;
        if (!page_has_buffers(page))
-- 
2.40.1

Reply via email to