• Bob Peterson's avatar
    gfs2: Fix gfs2_release for non-writers regression · d3add1a9
    Bob Peterson authored
    When a file is opened for writing, the vfs code (do_dentry_open)
    calls get_write_access for the inode, thus incrementing the inode's write
    count. That writer normally then creates a multi-block reservation for
    the inode (i_res) that can be re-used by other writers, which speeds up
    writes for applications that stupidly loop on open/write/close.
    When the writes are all done, the multi-block reservation should be
    deleted when the file is closed by the last "writer."
    
    Commit 0ec9b9ea broke that concept when it moved the call to
    gfs2_rs_delete before the check for FMODE_WRITE.  Non-writers have no
    business removing the multi-block reservations of writers. In fact, if
    someone opens and closes the file for RO while a writer has a
    multi-block reservation, the RO closer will delete the reservation
    midway through the write, and this results in:
    
    kernel BUG at fs/gfs2/rgrp.c:677! (or thereabouts) which is:
    BUG_ON(rs->rs_requested); from function gfs2_rs_deltree.
    
    This patch moves the check back inside the check for FMODE_WRITE.
    
    Fixes: 0ec9b9ea ("gfs2: Check for active reservation in gfs2_release")
    Cc: stable@vger.kernel.org # v5.12+
    Signed-off-by: default avatarBob Peterson <rpeterso@redhat.com>
    Signed-off-by: default avatarAndreas Gruenbacher <agruenba@redhat.com>
    d3add1a9
file.c 40 KB