• Boris Burkov's avatar
    btrfs: detect nocow for swap after snapshot delete · a84d5d42
    Boris Burkov authored
    can_nocow_extent and btrfs_cross_ref_exist both rely on a heuristic for
    detecting a must cow condition which is not exactly accurate, but saves
    unnecessary tree traversal. The incorrect assumption is that if the
    extent was created in a generation smaller than the last snapshot
    generation, it must be referenced by that snapshot. That is true, except
    the snapshot could have since been deleted, without affecting the last
    snapshot generation.
    
    The original patch claimed a performance win from this check, but it
    also leads to a bug where you are unable to use a swapfile if you ever
    snapshotted the subvolume it's in. Make the check slower and more strict
    for the swapon case, without modifying the general cow checks as a
    compromise. Turning swap on does not seem to be a particularly
    performance sensitive operation, so incurring a possibly unnecessary
    btrfs_search_slot seems worthwhile for the added usability.
    
    Note: Until the snapshot is competely cleaned after deletion,
    check_committed_refs will still cause the logic to think that cow is
    necessary, so the user must until 'btrfs subvolu sync' finished before
    activating the swapfile swapon.
    
    CC: stable@vger.kernel.org # 5.4+
    Suggested-by: default avatarOmar Sandoval <osandov@osandov.com>
    Signed-off-by: default avatarBoris Burkov <boris@bur.io>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    a84d5d42
extent-tree.c 156 KB