• Darrick J. Wong's avatar
    xfs: always rejoin held resources during defer roll · 655bb2c4
    Darrick J. Wong authored
    commit 710d707d upstream.
    
    During testing of xfs/141 on a V4 filesystem, I observed some
    inconsistent behavior with regards to resources that are held (i.e.
    remain locked) across a defer roll.  The transaction roll always gives
    the defer roll function a new transaction, even if committing the old
    transaction fails.  However, the defer roll function only rejoins the
    held resources if the transaction commit succeedied.  This means that
    callers of defer roll have to figure out whether the held resources are
    attached to the transaction being passed back.
    
    Worse yet, if the defer roll was part of a defer finish call, we have a
    third possibility: the defer finish could pass back a dirty transaction
    with dirty held resources and an error code.
    
    The only sane way to handle all of these scenarios is to require that
    the code that held the resource either cancel the transaction before
    unlocking and releasing the resources, or use functions that detach
    resources from a transaction properly (e.g.  xfs_trans_brelse) if they
    need to drop the reference before committing or cancelling the
    transaction.
    
    In order to make this so, change the defer roll code to join held
    resources to the new transaction unconditionally and fix all the bhold
    callers to release the held buffers correctly.
    Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
    [mcgrof: fixes kz#204223 ]
    Signed-off-by: default avatarLuis Chamberlain <mcgrof@kernel.org>
    Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
    655bb2c4
xfs_attr.c 32.6 KB