• Filipe Manana's avatar
    Btrfs: fix incorrect space accounting after failure to insert inline extent · 1c81ba23
    Filipe Manana authored
    When using compression, if we fail to insert an inline extent we
    incorrectly end up attempting to free the reserved data space twice,
    once through extent_clear_unlock_delalloc(), because we pass it the
    flag EXTENT_DO_ACCOUNTING, and once through a direct call to
    btrfs_free_reserved_data_space_noquota(). This results in a trace
    like the following:
    
    [  834.576240] ------------[ cut here ]------------
    [  834.576825] WARNING: CPU: 2 PID: 486 at fs/btrfs/extent-tree.c:4316 btrfs_free_reserved_data_space_noquota+0x60/0x9f [btrfs]
    [  834.579501] Modules linked in: btrfs crc32c_generic xor raid6_pq ppdev i2c_piix4 acpi_cpufreq psmouse tpm_tis parport_pc pcspkr serio_raw tpm_tis_core sg parport evdev i2c_core tpm button loop autofs4 ext4 crc16 jbd2 mbcache sr_mod cdrom sd_mod ata_generic virtio_scsi ata_piix virtio_pci libata virtio_ring virtio scsi_mod e1000 floppy [last unloaded: btrfs]
    [  834.592116] CPU: 2 PID: 486 Comm: kworker/u32:4 Not tainted 4.10.0-rc8-btrfs-next-37+ #2
    [  834.593316] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.9.1-0-gb3ef39f-prebuilt.qemu-project.org 04/01/2014
    [  834.595273] Workqueue: btrfs-delalloc btrfs_delalloc_helper [btrfs]
    [  834.596103] Call Trace:
    [  834.596103]  dump_stack+0x67/0x90
    [  834.596103]  __warn+0xc2/0xdd
    [  834.596103]  warn_slowpath_null+0x1d/0x1f
    [  834.596103]  btrfs_free_reserved_data_space_noquota+0x60/0x9f [btrfs]
    [  834.596103]  compress_file_range.constprop.42+0x2fa/0x3fc [btrfs]
    [  834.596103]  ? submit_compressed_extents+0x3a7/0x3a7 [btrfs]
    [  834.596103]  async_cow_start+0x32/0x4d [btrfs]
    [  834.596103]  btrfs_scrubparity_helper+0x187/0x3e7 [btrfs]
    [  834.596103]  btrfs_delalloc_helper+0xe/0x10 [btrfs]
    [  834.596103]  process_one_work+0x273/0x4e4
    [  834.596103]  worker_thread+0x1eb/0x2ca
    [  834.596103]  ? rescuer_thread+0x2b6/0x2b6
    [  834.596103]  kthread+0x100/0x108
    [  834.596103]  ? __list_del_entry+0x22/0x22
    [  834.596103]  ret_from_fork+0x2e/0x40
    [  834.611656] ---[ end trace 719902fe6bdef08f ]---
    
    So fix this by not calling directly btrfs_free_reserved_data_space_noquota()
    if an error happened.
    Signed-off-by: default avatarFilipe Manana <fdmanana@suse.com>
    1c81ba23
inode.c 286 KB