lkml.org 
[lkml]   [2018]   [Nov]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 069/124] Btrfs: fix cur_offset in the error case for nocow
    Date
    4.14-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Robbie Ko <robbieko@synology.com>

    commit 506481b20e818db40b6198815904ecd2d6daee64 upstream.

    When the cow_file_range fails, the related resources are unlocked
    according to the range [start..end), so the unlock cannot be repeated in
    run_delalloc_nocow.

    In some cases (e.g. cur_offset <= end && cow_start != -1), cur_offset is
    not updated correctly, so move the cur_offset update before
    cow_file_range.

    kernel BUG at mm/page-writeback.c:2663!
    Internal error: Oops - BUG: 0 [#1] SMP
    CPU: 3 PID: 31525 Comm: kworker/u8:7 Tainted: P O
    Hardware name: Realtek_RTD1296 (DT)
    Workqueue: writeback wb_workfn (flush-btrfs-1)
    task: ffffffc076db3380 ti: ffffffc02e9ac000 task.ti: ffffffc02e9ac000
    PC is at clear_page_dirty_for_io+0x1bc/0x1e8
    LR is at clear_page_dirty_for_io+0x14/0x1e8
    pc : [<ffffffc00033c91c>] lr : [<ffffffc00033c774>] pstate: 40000145
    sp : ffffffc02e9af4f0
    Process kworker/u8:7 (pid: 31525, stack limit = 0xffffffc02e9ac020)
    Call trace:
    [<ffffffc00033c91c>] clear_page_dirty_for_io+0x1bc/0x1e8
    [<ffffffbffc514674>] extent_clear_unlock_delalloc+0x1e4/0x210 [btrfs]
    [<ffffffbffc4fb168>] run_delalloc_nocow+0x3b8/0x948 [btrfs]
    [<ffffffbffc4fb948>] run_delalloc_range+0x250/0x3a8 [btrfs]
    [<ffffffbffc514c0c>] writepage_delalloc.isra.21+0xbc/0x1d8 [btrfs]
    [<ffffffbffc516048>] __extent_writepage+0xe8/0x248 [btrfs]
    [<ffffffbffc51630c>] extent_write_cache_pages.isra.17+0x164/0x378 [btrfs]
    [<ffffffbffc5185a8>] extent_writepages+0x48/0x68 [btrfs]
    [<ffffffbffc4f5828>] btrfs_writepages+0x20/0x30 [btrfs]
    [<ffffffc00033d758>] do_writepages+0x30/0x88
    [<ffffffc0003ba0f4>] __writeback_single_inode+0x34/0x198
    [<ffffffc0003ba6c4>] writeback_sb_inodes+0x184/0x3c0
    [<ffffffc0003ba96c>] __writeback_inodes_wb+0x6c/0xc0
    [<ffffffc0003bac20>] wb_writeback+0x1b8/0x1c0
    [<ffffffc0003bb0f0>] wb_workfn+0x150/0x250
    [<ffffffc0002b0014>] process_one_work+0x1dc/0x388
    [<ffffffc0002b02f0>] worker_thread+0x130/0x500
    [<ffffffc0002b6344>] kthread+0x10c/0x110
    [<ffffffc000284590>] ret_from_fork+0x10/0x40
    Code: d503201f a9025bb5 a90363b7 f90023b9 (d4210000)

    CC: stable@vger.kernel.org # 4.4+
    Reviewed-by: Filipe Manana <fdmanana@suse.com>
    Signed-off-by: Robbie Ko <robbieko@synology.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    fs/btrfs/inode.c | 5 ++---
    1 file changed, 2 insertions(+), 3 deletions(-)

    --- a/fs/btrfs/inode.c
    +++ b/fs/btrfs/inode.c
    @@ -1565,12 +1565,11 @@ out_check:
    }
    btrfs_release_path(path);

    - if (cur_offset <= end && cow_start == (u64)-1) {
    + if (cur_offset <= end && cow_start == (u64)-1)
    cow_start = cur_offset;
    - cur_offset = end;
    - }

    if (cow_start != (u64)-1) {
    + cur_offset = end;
    ret = cow_file_range(inode, locked_page, cow_start, end, end,
    page_started, nr_written, 1, NULL);
    if (ret)

    \
     
     \ /
      Last update: 2018-11-19 19:19    [W:4.112 / U:0.048 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site