• Andreas Gruenbacher's avatar
    gfs2: Inode dirtying fix · 706cb549
    Andreas Gruenbacher authored
    With the recent iomap write page reclaim deadlock fix, it turns out that the
    GLF_DIRTY flag isn't always set when it needs to be anymore: previously, this
    happened as a side effect of always adding the inode buffer head to the current
    transaction with gfs2_trans_add_meta, but this isn't happening consistently
    anymore.  Fix by removing an additional unnecessary gfs2_trans_add_meta call
    and by setting the GLF_DIRTY flag in gfs2_iomap_end.
    
    (The GLF_DIRTY flag causes inode_go_sync to flush the transaction log when
    syncing out the glock of that inode.  When the flag isn't set, inode_go_sync
    will skip inodes, including ones with an i_state of I_DIRTY_PAGES, which will
    lead to cluster incoherency.)
    
    In addition, in gfs2_iomap_page_done, if the metadata has changed, mark the
    inode as I_DIRTY_DATASYNC to have the inode added to the current transaction:
    we don't expect metadata to change here, but let's err on the safe side.
    
    Fixes: d0a22a4b ("gfs2: Fix iomap write page reclaim deadlock");
    Signed-off-by: default avatarAndreas Gruenbacher <agruenba@redhat.com>
    706cb549
bmap.c 64.8 KB