• Sage Weil's avatar
    Btrfs: avoid BUG when dropping root and reference in same transaction · 15e70000
    Sage Weil authored
    If btrfs_ioctl_snap_destroy() deletes a snapshot but finishes
    with end_transaction(), the cleaner kthread may come in and
    drop the root in the same transaction.  If that's the case, the
    root's refs still == 1 in the tree when btrfs_del_root() deletes
    the item, because commit_fs_roots() hasn't updated it yet (that
    happens during the commit).
    
    This wasn't a problem before only because
    btrfs_ioctl_snap_destroy() would commit the transaction before dropping
    the dentry reference, so the dead root wouldn't get queued up until
    after the fs root item was updated in the btree.
    
    Since it is not an error to drop the root reference and the root in the
    same transaction, just drop the BUG_ON() in btrfs_del_root().
    Signed-off-by: default avatarSage Weil <sage@newdream.net>
    Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
    15e70000
root-tree.c 11.2 KB