• Boris Burkov's avatar
    btrfs: hold block group refcount during async discard · 2b5463fc
    Boris Burkov authored
    Async discard does not acquire the block group reference count while it
    holds a reference on the discard list. This is generally OK, as the
    paths which destroy block groups tend to try to synchronize on
    cancelling async discard work. However, relying on cancelling work
    requires careful analysis to be sure it is safe from races with
    unpinning scheduling more work.
    
    While I am unable to find a race with unpinning in the current code for
    either the unused bgs or relocation paths, I believe we have one in an
    older version of auto relocation in a Meta internal build. This suggests
    that this is in fact an error prone model, and could be fragile to
    future changes to these bg deletion paths.
    
    To make this ownership more clear, add a refcount for async discard. If
    work is queued for a block group, its refcount should be incremented,
    and when work is completed or canceled, it should be decremented.
    
    CC: stable@vger.kernel.org # 5.15+
    Signed-off-by: default avatarBoris Burkov <boris@bur.io>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    2b5463fc
discard.c 23.9 KB