• Dongsheng Yang's avatar
    Btrfs: qgroup, Account data space in more proper timings. · 237c0e9f
    Dongsheng Yang authored
    Currenly, in data writing, ->reserved is accounted in
    fill_delalloc(), but ->may_use is released in clear_bit_hook()
    which is called by btrfs_finish_ordered_io(). That's too late,
    that said, between fill_delalloc() and btrfs_finish_ordered_io(),
    the data is doublely accounted by qgroup. It will cause some
    unexpected -EDQUOT.
    
    Example:
    	# btrfs quota enable /root/btrfs-auto-test/
    	# btrfs subvolume create /root/btrfs-auto-test//sub
    	Create subvolume '/root/btrfs-auto-test/sub'
    	# btrfs qgroup limit 1G /root/btrfs-auto-test//sub
    	dd if=/dev/zero of=/root/btrfs-auto-test//sub/file bs=1024 count=1500000
    	dd: error writing '/root/btrfs-auto-test//sub/file': Disk quota exceeded
    	681353+0 records in
    	681352+0 records out
    	697704448 bytes (698 MB) copied, 8.15563 s, 85.5 MB/s
    It's (698 MB) when we got an -EDQUOT, but we limit it by 1G.
    
    This patch move the btrfs_qgroup_reserve/free() for data from
    btrfs_delalloc_reserve/release_metadata() to btrfs_check_data_free_space()
    and btrfs_free_reserved_data_space(). Then the accounter in qgroup
    will be updated at the same time with the accounter in space_info updated.
    In this way, the unexpected -EDQUOT will be killed.
    Reported-by: default avatarSatoru Takeuchi <takeuchi_satoru@jp.fujitsu.com>
    Signed-off-by: default avatarDongsheng Yang <yangds.fnst@cn.fujitsu.com>
    Signed-off-by: default avatarChris Mason <clm@fb.com>
    237c0e9f
file.c 76.2 KB