• Goldwyn Rodrigues's avatar
    btrfs: qgroup: Prevent qgroup->reserved from going subzero · ee5dd687
    Goldwyn Rodrigues authored
    commit 0b34c261 upstream.
    
    While free'ing qgroup->reserved resources, we much check if
    the page has not been invalidated by a truncate operation
    by checking if the page is still dirty before reducing the
    qgroup resources. Resources in such a case are free'd when
    the entire extent is released by delayed_ref.
    
    This fixes a double accounting while releasing resources
    in case of truncating a file, reproduced by the following testcase.
    
    SCRATCH_DEV=/dev/vdb
    SCRATCH_MNT=/mnt
    mkfs.btrfs -f $SCRATCH_DEV
    mount -t btrfs $SCRATCH_DEV $SCRATCH_MNT
    cd $SCRATCH_MNT
    btrfs quota enable $SCRATCH_MNT
    btrfs subvolume create a
    btrfs qgroup limit 500m a $SCRATCH_MNT
    sync
    for c in {1..15}; do
    dd if=/dev/zero  bs=1M count=40 of=$SCRATCH_MNT/a/file;
    done
    
    sleep 10
    sync
    sleep 5
    
    touch $SCRATCH_MNT/a/newfile
    
    echo "Removing file"
    rm $SCRATCH_MNT/a/file
    
    Fixes: b9d0b389 ("btrfs: Add handler for invalidate page")
    Signed-off-by: default avatarGoldwyn Rodrigues <rgoldwyn@suse.com>
    Reviewed-by: default avatarQu Wenruo <quwenruo@cn.fujitsu.com>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    ee5dd687
inode.c 267 KB