lkml.org 
[lkml]   [2018]   [Mar]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL for 4.9 093/190] Btrfs: fix incorrect space accounting after failure to insert inline extent
    Date
    From: Filipe Manana <fdmanana@suse.com>

    [ Upstream commit 1c81ba237bcecad9bc885a1ddcf02d725ea38482 ]

    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: Filipe Manana <fdmanana@suse.com>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    ---
    fs/btrfs/inode.c | 6 ++++--
    1 file changed, 4 insertions(+), 2 deletions(-)

    diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
    index d196ce4be31c..ffd5831ca15c 100644
    --- a/fs/btrfs/inode.c
    +++ b/fs/btrfs/inode.c
    @@ -567,8 +567,10 @@ static noinline void compress_file_range(struct inode *inode,
    PAGE_SET_WRITEBACK |
    page_error_op |
    PAGE_END_WRITEBACK);
    - btrfs_free_reserved_data_space_noquota(inode, start,
    - end - start + 1);
    + if (ret == 0)
    + btrfs_free_reserved_data_space_noquota(inode,
    + start,
    + end - start + 1);
    goto free_pages_out;
    }
    }
    --
    2.14.1
    \
     
     \ /
      Last update: 2018-03-08 07:10    [W:4.079 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site