• Bob Peterson's avatar
    gfs2: Never call gfs2_block_zero_range with an open transaction · 70499cdf
    Bob Peterson authored
    Before this patch, some functions started transactions then they called
    gfs2_block_zero_range. However, gfs2_block_zero_range, like writes, can
    start transactions, which results in a recursive transaction error.
    For example:
    
    do_shrink
       trunc_start
          gfs2_trans_begin <------------------------------------------------
             gfs2_block_zero_range
                iomap_zero_range(inode, from, length, NULL, &gfs2_iomap_ops);
                   iomap_apply ... iomap_zero_range_actor
                      iomap_begin
                         gfs2_iomap_begin
                            gfs2_iomap_begin_write
                      actor (iomap_zero_range_actor)
    		     iomap_zero
    			iomap_write_begin
    			   gfs2_iomap_page_prepare
    			      gfs2_trans_begin <------------------------
    
    This patch reorders the callers of gfs2_block_zero_range so that they
    only start their transactions after the call. It also adds a BUG_ON to
    ensure this doesn't happen again.
    
    Fixes: 2257e468 ("gfs2: implement gfs2_block_zero_range using iomap_zero_range")
    Cc: stable@vger.kernel.org # v5.5+
    Signed-off-by: default avatarBob Peterson <rpeterso@redhat.com>
    Signed-off-by: default avatarAndreas Gruenbacher <agruenba@redhat.com>
    70499cdf
bmap.c 65.3 KB