• Justin Maggard's avatar
    btrfs: Fix quota reservation leak on preallocated files · b430b775
    Justin Maggard authored
    Commit c6887cd1 ("Btrfs: don't do nocow check unless we have to")
    changed the behavior of __btrfs_buffered_write() so that it first tries
    to get a data space reservation, and then skips the relatively expensive
    nocow check if the reservation succeeded.
    
    If we have quotas enabled, the data space reservation also includes a
    quota reservation.  But in the rewrite case, the space has already been
    accounted for in qgroups.  So btrfs_check_data_free_space() increases
    the quota reservation, but it never gets decreased when the data
    actually gets written and overwrites the pre-existing data.  So we're
    left with both the qgroup and qgroup reservation accounting for the same
    space.
    
    This commit adds the missing btrfs_qgroup_free_data() call in the case
    of BTRFS_ORDERED_PREALLOC extents.
    
    Fixes: c6887cd1 ("Btrfs: don't do nocow check unless we have to")
    Signed-off-by: default avatarJustin Maggard <jmaggard@netgear.com>
    Reviewed-by: default avatarQu Wenruo <wqu@suse.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    b430b775
inode.c 291 KB