gfs2: don't create empty buffers for NO_CREATE
authorBob Peterson <rpeterso@redhat.com>
Thu, 25 Mar 2021 12:57:00 +0000 (08:57 -0400)
committerAndreas Gruenbacher <agruenba@redhat.com>
Sat, 3 Apr 2021 19:32:09 +0000 (21:32 +0200)
Before this patch, function gfs2_getbuf would create empty buffers when
it was given the NO_CREATE directive from gfs2_journal_wipe. This is a
waste of time: the buffer_head is only used by gfs2_remove_from_journal
to determine if the buffer is pinned (which it won't be if it's newly
created) and if there's an associated bd element (same story).
This patch removes the useless buffer assignment.

Signed-off-by: Bob Peterson <rpeterso@redhat.com>
Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
fs/gfs2/meta_io.c

index 2db573e..c38e380 100644 (file)
@@ -131,16 +131,19 @@ struct buffer_head *gfs2_getbuf(struct gfs2_glock *gl, u64 blkno, int create)
                                break;
                        yield();
                }
+               if (!page_has_buffers(page))
+                       create_empty_buffers(page, sdp->sd_sb.sb_bsize, 0);
        } else {
                page = find_get_page_flags(mapping, index,
                                                FGP_LOCK|FGP_ACCESSED);
                if (!page)
                        return NULL;
+               if (!page_has_buffers(page)) {
+                       bh = NULL;
+                       goto out_unlock;
+               }
        }
 
-       if (!page_has_buffers(page))
-               create_empty_buffers(page, sdp->sd_sb.sb_bsize, 0);
-
        /* Locate header for our buffer within our page */
        for (bh = page_buffers(page); bufnum--; bh = bh->b_this_page)
                /* Do nothing */;
@@ -149,6 +152,7 @@ struct buffer_head *gfs2_getbuf(struct gfs2_glock *gl, u64 blkno, int create)
        if (!buffer_mapped(bh))
                map_bh(bh, sdp->sd_vfs, blkno);
 
+out_unlock:
        unlock_page(page);
        put_page(page);