15 Feb, 2017

1 commit

  • commit 2a362249187a8d0f6d942d6e1d763d150a296f47 upstream.

    Commit 4c63c2454ef incorrectly assumed that returning -ENOIOCTLCMD would
    cause the native ioctl to be called. The ->compat_ioctl callback is
    expected to handle all ioctls, not just compat variants. As a result,
    when using 32-bit userspace on 64-bit kernels, everything except those
    three ioctls would return -ENOTTY.

    Fixes: 4c63c2454ef ("btrfs: bugfix: handle FS_IOC32_{GETFLAGS,SETFLAGS,GETVERSION} in btrfs_ioctl")
    Signed-off-by: Jeff Mahoney
    Reviewed-by: David Sterba
    Signed-off-by: David Sterba
    Signed-off-by: Greg Kroah-Hartman

    Jeff Mahoney
     

01 Feb, 2017

3 commits

  • commit 57b59ed2e5b91e958843609c7884794e29e6c4cb upstream.

    Subvolume directory inodes can't have ACLs.

    Signed-off-by: Omar Sandoval
    Reviewed-by: David Sterba
    Signed-off-by: Chris Mason
    Signed-off-by: Greg Kroah-Hartman

    Omar Sandoval
     
  • commit 1fdf41941b8010691679638f8d0c8d08cfee7726 upstream.

    When you snapshot a subvolume containing a subvolume, you get a
    placeholder directory where the subvolume would be. These directory
    inodes have ->i_ops set to btrfs_dir_ro_inode_operations. Previously,
    these i_ops didn't include the xattr operation callbacks. The conversion
    to xattr_handlers missed this case, leading to bogus attempts to set
    xattrs on these inodes. This manifested itself as failures when running
    delayed inodes.

    To fix this, clear IOP_XATTR in ->i_opflags on these inodes.

    Fixes: 6c6ef9f26e59 ("xattr: Stop calling {get,set,remove}xattr inode operations")
    Cc: Andreas Gruenbacher
    Reported-by: Chris Murphy
    Tested-by: Chris Murphy
    Signed-off-by: Omar Sandoval
    Reviewed-by: David Sterba
    Signed-off-by: Chris Mason
    Signed-off-by: Greg Kroah-Hartman

    Omar Sandoval
     
  • commit 67ade058ef2c65a3e56878af9c293ec76722a2e5 upstream.

    As Jeff explained in c2951f32d36c ("btrfs: remove old tree_root dirent
    processing in btrfs_real_readdir()"), supporting this old format is no
    longer necessary since the Btrfs magic number has been updated since we
    changed to the current format. There are other places where we still
    handle this old format, but since this is part of a fix that is going to
    stable, I'm only removing this one for now.

    Signed-off-by: Omar Sandoval
    Reviewed-by: David Sterba
    Signed-off-by: Chris Mason
    Signed-off-by: Greg Kroah-Hartman

    Omar Sandoval
     

20 Jan, 2017

3 commits

  • commit aa7c8da35d1905d80e840d075f07d26ec90144b5 upstream.

    In __btrfs_run_delayed_refs, the error path when run_delayed_extent_op
    fails sets locked_ref->processing = 0 but doesn't re-increment
    delayed_refs->num_heads_ready. As a result, we end up triggering
    the WARN_ON in btrfs_select_ref_head.

    Fixes: d7df2c796d7 (Btrfs: attach delayed ref updates to delayed ref heads)
    Reported-by: Jon Nelson
    Signed-off-by: Jeff Mahoney
    Reviewed-by: Liu Bo
    Signed-off-by: David Sterba
    Signed-off-by: Greg Kroah-Hartman

    Jeff Mahoney
     
  • commit d0280996437081dd12ed1e982ac8aeaa62835ec4 upstream.

    In __btrfs_run_delayed_refs, when we put back a delayed ref that's too
    new, we have already dropped the lock on locked_ref when we set
    ->processing = 0.

    This patch keeps the lock to cover that assignment.

    Fixes: d7df2c796d7 (Btrfs: attach delayed ref updates to delayed ref heads)
    Signed-off-by: Jeff Mahoney
    Reviewed-by: Liu Bo
    Signed-off-by: David Sterba
    Signed-off-by: Greg Kroah-Hartman

    Jeff Mahoney
     
  • commit ac0c7cf8be00f269f82964cf7b144ca3edc5dbc4 upstream.

    Enabling btrfs tracepoints leads to instant crash, as reported. The wq
    callbacks could free the memory and the tracepoints started to
    dereference the members to get to fs_info.

    The proposed fix https://marc.info/?l=linux-btrfs&m=148172436722606&w=2
    removed the tracepoints but we could preserve them by passing only the
    required data in a safe way.

    Fixes: bc074524e123 ("btrfs: prefix fsid to all trace events")
    Reported-by: Sebastian Andrzej Siewior
    Reviewed-by: Qu Wenruo
    Signed-off-by: David Sterba
    Signed-off-by: Greg Kroah-Hartman

    David Sterba
     

06 Jan, 2017

8 commits

  • commit 8d9eddad19467b008e0c881bc3133d7da94b7ec1 upstream.

    We were setting the qgroup_rescan_running flag to true only after the
    rescan worker started (which is a task run by a queue). So if a user
    space task starts a rescan and immediately after asks to wait for the
    rescan worker to finish, this second call might happen before the rescan
    worker task starts running, in which case the rescan wait ioctl returns
    immediatley, not waiting for the rescan worker to finish.

    This was making the fstest btrfs/022 fail very often.

    Fixes: d2c609b834d6 (btrfs: properly track when rescan worker is running)
    Signed-off-by: Filipe Manana
    Reviewed-by: David Sterba
    Signed-off-by: Greg Kroah-Hartman

    Filipe Manana
     
  • commit f177d73949bf758542ca15a1c1945bd2e802cc65 upstream.

    We can not simply use the owner field from an extent buffer's header to
    get the id of the respective tree when the extent buffer is from a
    relocation tree. When we create the root for a relocation tree we leave
    (on purpose) the owner field with the same value as the subvolume's tree
    root (we do this at ctree.c:btrfs_copy_root()). So we must ignore extent
    buffers from relocation trees, which have the BTRFS_HEADER_FLAG_RELOC
    flag set, because otherwise we will always consider the extent buffer
    as not being the root of the tree (the root of original subvolume tree
    is always different from the root of the respective relocation tree).

    This lead to assertion failures when running with the integrity checker
    enabled (CONFIG_BTRFS_FS_CHECK_INTEGRITY=y) such as the following:

    [ 643.393409] BTRFS critical (device sdg): corrupt leaf, non-root leaf's nritems is 0: block=38506496, root=260, slot=0
    [ 643.397609] BTRFS info (device sdg): leaf 38506496 total ptrs 0 free space 3995
    [ 643.407075] assertion failed: 0, file: fs/btrfs/disk-io.c, line: 4078
    [ 643.408425] ------------[ cut here ]------------
    [ 643.409112] kernel BUG at fs/btrfs/ctree.h:3419!
    [ 643.409773] invalid opcode: 0000 [#1] PREEMPT SMP
    [ 643.410447] Modules linked in: dm_flakey dm_mod crc32c_generic btrfs xor raid6_pq ppdev psmouse acpi_cpufreq parport_pc evdev parport tpm_tis tpm_tis_core pcspkr serio_raw i2c_piix4 sg tpm i2c_core button processor loop autofs4 ext4 crc16 jbd2 mbcache sr_mod cdrom sd_mod ata_generic virtio_scsi ata_piix libata virtio_pci virtio_ring scsi_mod virtio e1000 floppy
    [ 643.414356] CPU: 11 PID: 32726 Comm: btrfs Not tainted 4.8.0-rc8-btrfs-next-35+ #1
    [ 643.414356] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.9.1-0-gb3ef39f-prebuilt.qemu-project.org 04/01/2014
    [ 643.414356] task: ffff880145e95b00 task.stack: ffff88014826c000
    [ 643.414356] RIP: 0010:[] [] assfail.constprop.41+0x1c/0x1e [btrfs]
    [ 643.414356] RSP: 0018:ffff88014826fa28 EFLAGS: 00010292
    [ 643.414356] RAX: 0000000000000039 RBX: ffff88014e2d7c38 RCX: 0000000000000001
    [ 643.414356] RDX: ffff88023f4d2f58 RSI: ffffffff81806c63 RDI: 00000000ffffffff
    [ 643.414356] RBP: ffff88014826fa28 R08: 0000000000000001 R09: 0000000000000000
    [ 643.414356] R10: ffff88014826f918 R11: ffffffff82f3c5ed R12: ffff880172910000
    [ 643.414356] R13: ffff880233992230 R14: ffff8801a68a3310 R15: fffffffffffffff8
    [ 643.414356] FS: 00007f9ca305e8c0(0000) GS:ffff88023f4c0000(0000) knlGS:0000000000000000
    [ 643.414356] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    [ 643.414356] CR2: 00007f9ca3071000 CR3: 000000015d01b000 CR4: 00000000000006e0
    [ 643.414356] Stack:
    [ 643.414356] ffff88014826fa50 ffffffffa02d655a 000000000000000a ffff88014e2d7c38
    [ 643.414356] 0000000000000000 ffff88014826faa8 ffffffffa02b72f3 ffff88014826fab8
    [ 643.414356] 00ffffffa03228e4 0000000000000000 0000000000000000 ffff8801bbd4e000
    [ 643.414356] Call Trace:
    [ 643.414356] [] btrfs_mark_buffer_dirty+0xdf/0xe5 [btrfs]
    [ 643.414356] [] btrfs_copy_root+0x18a/0x1d1 [btrfs]
    [ 643.414356] [] create_reloc_root+0x72/0x1ba [btrfs]
    [ 643.414356] [] btrfs_init_reloc_root+0x7b/0xa7 [btrfs]
    [ 643.414356] [] record_root_in_trans+0xdf/0xed [btrfs]
    [ 643.414356] [] btrfs_record_root_in_trans+0x50/0x6a [btrfs]
    [ 643.414356] [] create_subvol+0x472/0x773 [btrfs]
    [ 643.414356] [] btrfs_mksubvol+0x3da/0x463 [btrfs]
    [ 643.414356] [] ? btrfs_mksubvol+0x3da/0x463 [btrfs]
    [ 643.414356] [] ? preempt_count_add+0x65/0x68
    [ 643.414356] [] ? __mnt_want_write+0x62/0x77
    [ 643.414356] [] btrfs_ioctl_snap_create_transid+0xce/0x187 [btrfs]
    [ 643.414356] [] btrfs_ioctl_snap_create+0x67/0x81 [btrfs]
    [ 643.414356] [] btrfs_ioctl+0x508/0x20dd [btrfs]
    [ 643.414356] [] ? __this_cpu_preempt_check+0x13/0x15
    [ 643.414356] [] ? handle_mm_fault+0x976/0x9ab
    [ 643.414356] [] ? arch_local_irq_save+0x9/0xc
    [ 643.414356] [] vfs_ioctl+0x18/0x34
    [ 643.414356] [] do_vfs_ioctl+0x581/0x600
    [ 643.414356] [] ? entry_SYSCALL_64_fastpath+0x5/0xa8
    [ 643.414356] [] ? trace_hardirqs_on_caller+0x17b/0x197
    [ 643.414356] [] SyS_ioctl+0x57/0x79
    [ 643.414356] [] entry_SYSCALL_64_fastpath+0x18/0xa8
    [ 643.414356] [] ? trace_hardirqs_off_caller+0x3f/0xaa
    [ 643.414356] Code: 89 83 88 00 00 00 31 c0 5b 41 5c 41 5d 5d c3 55 89 f1 48 c7 c2 98 bc 35 a0 48 89 fe 48 c7 c7 05 be 35 a0 48 89 e5 e8 13 46 dd e0 0b 55 89 f1 48 c7 c2 9f d3 35 a0 48 89 fe 48 c7 c7 7a d5 35
    [ 643.414356] RIP [] assfail.constprop.41+0x1c/0x1e [btrfs]
    [ 643.414356] RSP
    [ 643.468267] ---[ end trace 6a1b3fb1a9d7d6e3 ]---

    This can be easily reproduced by running xfstests with the integrity
    checker enabled.

    Fixes: 1ba98d086fe3 (Btrfs: detect corruption when non-root leaf has zero item)
    Signed-off-by: Filipe Manana
    Reviewed-by: Liu Bo
    Signed-off-by: Greg Kroah-Hartman

    Filipe Manana
     
  • commit ed0df618b1b06d7431ee4d985317fc5419a5d559 upstream.

    The balance status item contains currently known filter values, but the
    stripes filter was unintentionally not among them. This would mean, that
    interrupted and automatically restarted balance does not apply the
    stripe filters.

    Fixes: dee32d0ac3719ef8d640efaf0884111df444730f
    Signed-off-by: David Sterba
    Signed-off-by: Greg Kroah-Hartman

    David Sterba
     
  • commit 054570a1dc94de20e7a612cddcc5a97db9c37b6f upstream.

    During relocation of a data block group we create a relocation tree
    for each fs/subvol tree by making a snapshot of each tree using
    btrfs_copy_root() and the tree's commit root, and then setting the last
    snapshot field for the fs/subvol tree's root to the value of the current
    transaction id minus 1. However this can lead to relocation later
    dropping references that it did not create if we have qgroups enabled,
    leaving the filesystem in an inconsistent state that keeps aborting
    transactions.

    Lets consider the following example to explain the problem, which requires
    qgroups to be enabled.

    We are relocating data block group Y, we have a subvolume with id 258 that
    has a root at level 1, that subvolume is used to store directory entries
    for snapshots and we are currently at transaction 3404.

    When committing transaction 3404, we have a pending snapshot and therefore
    we call btrfs_run_delayed_items() at transaction.c:create_pending_snapshot()
    in order to create its dentry at subvolume 258. This results in COWing
    leaf A from root 258 in order to add the dentry. Note that leaf A
    also contains file extent items referring to extents from some other
    block group X (we are currently relocating block group Y). Later on, still
    at create_pending_snapshot() we call qgroup_account_snapshot(), which
    switches the commit root for root 258 when it calls switch_commit_roots(),
    so now the COWed version of leaf A, lets call it leaf A', is accessible
    from the commit root of tree 258. At the end of qgroup_account_snapshot(),
    we call record_root_in_trans() with 258 as its argument, which results
    in btrfs_init_reloc_root() being called, which in turn calls
    relocation.c:create_reloc_root() in order to create a relocation tree
    associated to root 258, which results in assigning the value of 3403
    (which is the current transaction id minus 1 = 3404 - 1) to the
    last_snapshot field of root 258. When creating the relocation tree root
    at ctree.c:btrfs_copy_root() we add a shared reference for leaf A',
    corresponding to the relocation tree's root, when we call btrfs_inc_ref()
    against the COWed root (a copy of the commit root from tree 258), which
    is at level 1. So at this point leaf A' has 2 references, one normal
    reference corresponding to root 258 and one shared reference corresponding
    to the root of the relocation tree.

    Transaction 3404 finishes its commit and transaction 3405 is started by
    relocation when calling merge_reloc_root() for the relocation tree
    associated to root 258. In the meanwhile leaf A' is COWed again, in
    response to some filesystem operation, when we are still at transaction
    3405. However when we COW leaf A', at ctree.c:update_ref_for_cow(), we
    call btrfs_block_can_be_shared() in order to figure out if other trees
    refer to the leaf and if any such trees exists, add a full back reference
    to leaf A' - but btrfs_block_can_be_shared() incorrectly returns false
    because the following condition is false:

    btrfs_header_generation(buf) root_item)

    which evaluates to 3404 refs[0] is 1, it does call
    btrfs_dec_ref() against leaf A', which results in removing the single
    references that the extents from block group X have which are associated
    to root 258 - the expectation was to have each of these extents with 2
    references - one reference for root 258 and one shared reference related
    to the root of the relocation tree, and so we would drop only the shared
    reference (because leaf A' was supposed to have the flag
    BTRFS_BLOCK_FLAG_FULL_BACKREF set).

    This leaves the filesystem in an inconsistent state as we now have file
    extent items in a subvolume tree that point to extents from block group X
    without references in the extent tree. So later on when we try to decrement
    the references for these extents, for example due to a file unlink operation,
    truncate operation or overwriting ranges of a file, we fail because the
    expected references do not exist in the extent tree.

    This leads to warnings and transaction aborts like the following:

    [ 588.965795] ------------[ cut here ]------------
    [ 588.965815] WARNING: CPU: 2 PID: 2479 at fs/btrfs/extent-tree.c:1625 lookup_inline_extent_backref+0x432/0x5b0 [btrfs]
    [ 588.965816] Modules linked in: af_packet iscsi_ibft iscsi_boot_sysfs xfs libcrc32c ppdev acpi_cpufreq button tpm_tis e1000 i2c_piix4 pcspkr parport_pc
    parport tpm qemu_fw_cfg joydev btrfs xor raid6_pq sr_mod cdrom ata_generic virtio_scsi ata_piix virtio_pci bochs_drm virtio_ring drm_kms_helper syscopyarea
    sysfillrect sysimgblt fb_sys_fops virtio ttm serio_raw drm floppy sg
    [ 588.965831] CPU: 2 PID: 2479 Comm: kworker/u8:7 Not tainted 4.7.3-3-default-fdm+ #1
    [ 588.965832] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.9.1-0-gb3ef39f-prebuilt.qemu-project.org 04/01/2014
    [ 588.965844] Workqueue: btrfs-extent-refs btrfs_extent_refs_helper [btrfs]
    [ 588.965845] 0000000000000000 ffff8802263bfa28 ffffffff813af542 0000000000000000
    [ 588.965847] 0000000000000000 ffff8802263bfa68 ffffffff81081e8b 0000065900000000
    [ 588.965848] ffff8801db2af000 000000012bbe2000 0000000000000000 ffff880215703b48
    [ 588.965849] Call Trace:
    [ 588.965852] [] dump_stack+0x63/0x81
    [ 588.965854] [] __warn+0xcb/0xf0
    [ 588.965855] [] warn_slowpath_null+0x1d/0x20
    [ 588.965863] [] lookup_inline_extent_backref+0x432/0x5b0 [btrfs]
    [ 588.965865] [] ? trace_clock_local+0x10/0x30
    [ 588.965867] [] ? rb_reserve_next_event+0x6f/0x460
    [ 588.965875] [] insert_inline_extent_backref+0x55/0xd0 [btrfs]
    [ 588.965882] [] __btrfs_inc_extent_ref.isra.55+0x8f/0x240 [btrfs]
    [ 588.965890] [] __btrfs_run_delayed_refs+0x74a/0x1260 [btrfs]
    [ 588.965892] [] ? cpuacct_charge+0x86/0xa0
    [ 588.965900] [] btrfs_run_delayed_refs+0x9f/0x2c0 [btrfs]
    [ 588.965908] [] delayed_ref_async_start+0x94/0xb0 [btrfs]
    [ 588.965918] [] btrfs_scrubparity_helper+0xca/0x350 [btrfs]
    [ 588.965928] [] btrfs_extent_refs_helper+0xe/0x10 [btrfs]
    [ 588.965930] [] process_one_work+0x1f3/0x4e0
    [ 588.965931] [] worker_thread+0x48/0x4e0
    [ 588.965932] [] ? process_one_work+0x4e0/0x4e0
    [ 588.965934] [] kthread+0xc9/0xe0
    [ 588.965936] [] ret_from_fork+0x1f/0x40
    [ 588.965937] [] ? kthread_worker_fn+0x170/0x170
    [ 588.965938] ---[ end trace 34e5232c933a1749 ]---
    [ 588.966187] ------------[ cut here ]------------
    [ 588.966196] WARNING: CPU: 2 PID: 2479 at fs/btrfs/extent-tree.c:2966 btrfs_run_delayed_refs+0x28c/0x2c0 [btrfs]
    [ 588.966196] BTRFS: Transaction aborted (error -5)
    [ 588.966197] Modules linked in: af_packet iscsi_ibft iscsi_boot_sysfs xfs libcrc32c ppdev acpi_cpufreq button tpm_tis e1000 i2c_piix4 pcspkr parport_pc
    parport tpm qemu_fw_cfg joydev btrfs xor raid6_pq sr_mod cdrom ata_generic virtio_scsi ata_piix virtio_pci bochs_drm virtio_ring drm_kms_helper syscopyarea
    sysfillrect sysimgblt fb_sys_fops virtio ttm serio_raw drm floppy sg
    [ 588.966206] CPU: 2 PID: 2479 Comm: kworker/u8:7 Tainted: G W 4.7.3-3-default-fdm+ #1
    [ 588.966207] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.9.1-0-gb3ef39f-prebuilt.qemu-project.org 04/01/2014
    [ 588.966217] Workqueue: btrfs-extent-refs btrfs_extent_refs_helper [btrfs]
    [ 588.966217] 0000000000000000 ffff8802263bfc98 ffffffff813af542 ffff8802263bfce8
    [ 588.966219] 0000000000000000 ffff8802263bfcd8 ffffffff81081e8b 00000b96345ee000
    [ 588.966220] ffffffffa021ae1c ffff880215703b48 00000000000005fe ffff8802345ee000
    [ 588.966221] Call Trace:
    [ 588.966223] [] dump_stack+0x63/0x81
    [ 588.966224] [] __warn+0xcb/0xf0
    [ 588.966225] [] warn_slowpath_fmt+0x4f/0x60
    [ 588.966233] [] btrfs_run_delayed_refs+0x28c/0x2c0 [btrfs]
    [ 588.966241] [] delayed_ref_async_start+0x94/0xb0 [btrfs]
    [ 588.966250] [] btrfs_scrubparity_helper+0xca/0x350 [btrfs]
    [ 588.966259] [] btrfs_extent_refs_helper+0xe/0x10 [btrfs]
    [ 588.966260] [] process_one_work+0x1f3/0x4e0
    [ 588.966261] [] worker_thread+0x48/0x4e0
    [ 588.966263] [] ? process_one_work+0x4e0/0x4e0
    [ 588.966264] [] kthread+0xc9/0xe0
    [ 588.966265] [] ret_from_fork+0x1f/0x40
    [ 588.966267] [] ? kthread_worker_fn+0x170/0x170
    [ 588.966268] ---[ end trace 34e5232c933a174a ]---
    [ 588.966269] BTRFS: error (device sda2) in btrfs_run_delayed_refs:2966: errno=-5 IO failure
    [ 588.966270] BTRFS info (device sda2): forced readonly

    This was happening often on openSUSE and SLE systems using btrfs as the
    root filesystem (with its default layout where multiple subvolumes are
    used) where balance happens in the background triggered by a cron job and
    snapshots are automatically created before/after package installations,
    upgrades and removals. The issue could be triggered simply by running the
    following loop on the first system boot post installation:

    while true; do
    zypper -n in nfs-kernel-server
    zypper -n rm nfs-kernel-server
    done

    (If we were fast enough and made that loop before the cron job triggered
    a balance operation and the balance finished)

    So fix by setting the last_snapshot field of the root to the value of the
    generation of its commit root. Like this btrfs_block_can_be_shared()
    behaves correctly for the case where the relocation root is created during
    a transaction commit and for the case where it's created before a
    transaction commit.

    Fixes: 6426c7ad697d (btrfs: qgroup: Fix qgroup accounting when creating snapshot)
    Signed-off-by: Filipe Manana
    Reviewed-by: Josef Bacik
    Signed-off-by: Greg Kroah-Hartman

    Filipe Manana
     
  • commit 2a7bf53f577e49c43de4ffa7776056de26db65d9 upstream.

    If a log tree has a layout like the following:

    leaf N:
    ...
    item 240 key (282 DIR_LOG_ITEM 0) itemoff 8189 itemsize 8
    dir log end 1275809046
    leaf N + 1:
    item 0 key (282 DIR_LOG_ITEM 3936149215) itemoff 16275 itemsize 8
    dir log end 18446744073709551615
    ...

    When we pass the value 1275809046 + 1 as the parameter start_ret to the
    function tree-log.c:find_dir_range() (done by replay_dir_deletes()), we
    end up with path->slots[0] having the value 239 (points to the last item
    of leaf N, item 240). Because the dir log item in that position has an
    offset value smaller than *start_ret (1275809046 + 1) we need to move on
    to the next leaf, however the logic for that is wrong since it compares
    the current slot to the number of items in the leaf, which is smaller
    and therefore we don't lookup for the next leaf but instead we set the
    slot to point to an item that does not exist, at slot 240, and we later
    operate on that slot which has unexpected content or in the worst case
    can result in an invalid memory access (accessing beyond the last page
    of leaf N's extent buffer).

    So fix the logic that checks when we need to lookup at the next leaf
    by first incrementing the slot and only after to check if that slot
    is beyond the last item of the current leaf.

    Signed-off-by: Robbie Ko
    Reviewed-by: Filipe Manana
    Fixes: e02119d5a7b4 (Btrfs: Add a write ahead tree log to optimize synchronous operations)
    Signed-off-by: Filipe Manana
    [Modified changelog for clarity and correctness]
    Signed-off-by: Greg Kroah-Hartman

    Robbie Ko
     
  • commit ec125cfb7ae2157af3dd45dd8abe823e3e233eec upstream.

    While logging new directory entries, at tree-log.c:log_new_dir_dentries(),
    after we call btrfs_search_forward() we get a leaf with a read lock on it,
    and without unlocking that leaf we can end up calling btrfs_iget() to get
    an inode pointer. The later (btrfs_iget()) can end up doing a read-only
    search on the same tree again, if the inode is not in memory already, which
    ends up causing a deadlock if some other task in the meanwhile started a
    write search on the tree and is attempting to write lock the same leaf
    that btrfs_search_forward() locked while holding write locks on upper
    levels of the tree blocking the read search from btrfs_iget(). In this
    scenario we get a deadlock.

    So fix this by releasing the search path before calling btrfs_iget() at
    tree-log.c:log_new_dir_dentries().

    Example trace of such deadlock:

    [ 4077.478852] kworker/u24:10 D ffff88107fc90640 0 14431 2 0x00000000
    [ 4077.486752] Workqueue: btrfs-endio-write btrfs_endio_write_helper [btrfs]
    [ 4077.494346] ffff880ffa56bad0 0000000000000046 0000000000009000 ffff880ffa56bfd8
    [ 4077.502629] ffff880ffa56bfd8 ffff881016ce21c0 ffffffffa06ecb26 ffff88101a5d6138
    [ 4077.510915] ffff880ebb5173b0 ffff880ffa56baf8 ffff880ebb517410 ffff881016ce21c0
    [ 4077.519202] Call Trace:
    [ 4077.528752] [] ? btrfs_tree_lock+0xdd/0x2f0 [btrfs]
    [ 4077.536049] [] ? wake_up_atomic_t+0x30/0x30
    [ 4077.542574] [] ? btrfs_search_slot+0x79f/0xb10 [btrfs]
    [ 4077.550171] [] ? btrfs_lookup_file_extent+0x33/0x40 [btrfs]
    [ 4077.558252] [] ? __btrfs_drop_extents+0x13b/0xdf0 [btrfs]
    [ 4077.566140] [] ? add_delayed_data_ref+0xe2/0x150 [btrfs]
    [ 4077.573928] [] ? btrfs_add_delayed_data_ref+0x149/0x1d0 [btrfs]
    [ 4077.582399] [] ? __set_extent_bit+0x4c0/0x5c0 [btrfs]
    [ 4077.589896] [] ? insert_reserved_file_extent.constprop.75+0xa4/0x320 [btrfs]
    [ 4077.599632] [] ? start_transaction+0x8d/0x470 [btrfs]
    [ 4077.607134] [] ? btrfs_finish_ordered_io+0x2e7/0x600 [btrfs]
    [ 4077.615329] [] ? process_one_work+0x142/0x3d0
    [ 4077.622043] [] ? worker_thread+0x109/0x3b0
    [ 4077.628459] [] ? manage_workers.isra.26+0x270/0x270
    [ 4077.635759] [] ? kthread+0xaf/0xc0
    [ 4077.641404] [] ? kthread_create_on_node+0x110/0x110
    [ 4077.648696] [] ? ret_from_fork+0x58/0x90
    [ 4077.654926] [] ? kthread_create_on_node+0x110/0x110

    [ 4078.358087] kworker/u24:15 D ffff88107fcd0640 0 14436 2 0x00000000
    [ 4078.365981] Workqueue: btrfs-endio-write btrfs_endio_write_helper [btrfs]
    [ 4078.373574] ffff880ffa57fad0 0000000000000046 0000000000009000 ffff880ffa57ffd8
    [ 4078.381864] ffff880ffa57ffd8 ffff88103004d0a0 ffffffffa06ecb26 ffff88101a5d6138
    [ 4078.390163] ffff880fbeffc298 ffff880ffa57faf8 ffff880fbeffc2f8 ffff88103004d0a0
    [ 4078.398466] Call Trace:
    [ 4078.408019] [] ? btrfs_tree_lock+0xdd/0x2f0 [btrfs]
    [ 4078.415322] [] ? wake_up_atomic_t+0x30/0x30
    [ 4078.421844] [] ? btrfs_search_slot+0x79f/0xb10 [btrfs]
    [ 4078.429438] [] ? btrfs_lookup_file_extent+0x33/0x40 [btrfs]
    [ 4078.437518] [] ? __btrfs_drop_extents+0x13b/0xdf0 [btrfs]
    [ 4078.445404] [] ? add_delayed_data_ref+0xe2/0x150 [btrfs]
    [ 4078.453194] [] ? btrfs_add_delayed_data_ref+0x149/0x1d0 [btrfs]
    [ 4078.461663] [] ? __set_extent_bit+0x4c0/0x5c0 [btrfs]
    [ 4078.469161] [] ? insert_reserved_file_extent.constprop.75+0xa4/0x320 [btrfs]
    [ 4078.478893] [] ? start_transaction+0x8d/0x470 [btrfs]
    [ 4078.486388] [] ? btrfs_finish_ordered_io+0x2e7/0x600 [btrfs]
    [ 4078.494561] [] ? process_one_work+0x142/0x3d0
    [ 4078.501278] [] ? pwq_activate_delayed_work+0x27/0x40
    [ 4078.508673] [] ? worker_thread+0x109/0x3b0
    [ 4078.515098] [] ? manage_workers.isra.26+0x270/0x270
    [ 4078.522396] [] ? kthread+0xaf/0xc0
    [ 4078.528032] [] ? kthread_create_on_node+0x110/0x110
    [ 4078.535325] [] ? ret_from_fork+0x58/0x90
    [ 4078.541552] [] ? kthread_create_on_node+0x110/0x110

    [ 4079.355824] user-space-program D ffff88107fd30640 0 32020 1 0x00000000
    [ 4079.363716] ffff880eae8eba10 0000000000000086 0000000000009000 ffff880eae8ebfd8
    [ 4079.372003] ffff880eae8ebfd8 ffff881016c162c0 ffffffffa06ecb26 ffff88101a5d6138
    [ 4079.380294] ffff880fbed4b4c8 ffff880eae8eba38 ffff880fbed4b528 ffff881016c162c0
    [ 4079.388586] Call Trace:
    [ 4079.398134] [] ? btrfs_tree_lock+0x85/0x2f0 [btrfs]
    [ 4079.405431] [] ? wake_up_atomic_t+0x30/0x30
    [ 4079.411955] [] ? btrfs_lock_root_node+0x2b/0x40 [btrfs]
    [ 4079.419644] [] ? btrfs_search_slot+0xa03/0xb10 [btrfs]
    [ 4079.427237] [] ? btrfs_buffer_uptodate+0x52/0x70 [btrfs]
    [ 4079.435041] [] ? generic_bin_search.constprop.38+0x80/0x190 [btrfs]
    [ 4079.443897] [] ? btrfs_insert_empty_items+0x74/0xd0 [btrfs]
    [ 4079.451975] [] ? copy_items+0x128/0x850 [btrfs]
    [ 4079.458890] [] ? btrfs_log_inode+0x629/0xbf3 [btrfs]
    [ 4079.466292] [] ? btrfs_log_inode_parent+0xc61/0xf30 [btrfs]
    [ 4079.474373] [] ? btrfs_log_dentry_safe+0x59/0x80 [btrfs]
    [ 4079.482161] [] ? btrfs_sync_file+0x20d/0x330 [btrfs]
    [ 4079.489558] [] ? do_fsync+0x4c/0x80
    [ 4079.495300] [] ? SyS_fdatasync+0xa/0x10
    [ 4079.501422] [] ? system_call_fastpath+0x16/0x1b

    [ 4079.508334] user-space-program D ffff88107fc30640 0 32021 1 0x00000004
    [ 4079.516226] ffff880eae8efbf8 0000000000000086 0000000000009000 ffff880eae8effd8
    [ 4079.524513] ffff880eae8effd8 ffff881030279610 ffffffffa06ecb26 ffff88101a5d6138
    [ 4079.532802] ffff880ebb671d88 ffff880eae8efc20 ffff880ebb671de8 ffff881030279610
    [ 4079.541092] Call Trace:
    [ 4079.550642] [] ? btrfs_tree_lock+0x85/0x2f0 [btrfs]
    [ 4079.557941] [] ? wake_up_atomic_t+0x30/0x30
    [ 4079.564463] [] ? btrfs_search_slot+0x79f/0xb10 [btrfs]
    [ 4079.572058] [] ? btrfs_truncate_inode_items+0x168/0xb90 [btrfs]
    [ 4079.580526] [] ? join_transaction.isra.15+0x1e/0x3a0 [btrfs]
    [ 4079.588701] [] ? start_transaction+0x8d/0x470 [btrfs]
    [ 4079.596196] [] ? block_rsv_add_bytes+0x16/0x50 [btrfs]
    [ 4079.603789] [] ? btrfs_truncate+0xe9/0x2e0 [btrfs]
    [ 4079.610994] [] ? btrfs_setattr+0x30b/0x410 [btrfs]
    [ 4079.618197] [] ? notify_change+0x1dc/0x680
    [ 4079.624625] [] ? aa_path_perm+0xd4/0x160
    [ 4079.630854] [] ? do_truncate+0x5b/0x90
    [ 4079.636889] [] ? do_sys_ftruncate.constprop.15+0x10a/0x160
    [ 4079.644869] [] ? SyS_fcntl+0x5b/0x570
    [ 4079.650805] [] ? system_call_fastpath+0x16/0x1b

    [ 4080.410607] user-space-program D ffff88107fc70640 0 32028 12639 0x00000004
    [ 4080.418489] ffff880eaeccbbe0 0000000000000086 0000000000009000 ffff880eaeccbfd8
    [ 4080.426778] ffff880eaeccbfd8 ffff880f317ef1e0 ffffffffa06ecb26 ffff88101a5d6138
    [ 4080.435067] ffff880ef7e93928 ffff880f317ef1e0 ffff880eaeccbc08 ffff880f317ef1e0
    [ 4080.443353] Call Trace:
    [ 4080.452920] [] ? btrfs_tree_read_lock+0xdd/0x190 [btrfs]
    [ 4080.460703] [] ? wake_up_atomic_t+0x30/0x30
    [ 4080.467225] [] ? btrfs_read_lock_root_node+0x2b/0x40 [btrfs]
    [ 4080.475400] [] ? btrfs_search_slot+0x801/0xb10 [btrfs]
    [ 4080.482994] [] ? btrfs_clean_one_deleted_snapshot+0xe0/0xe0 [btrfs]
    [ 4080.491857] [] ? btrfs_lookup_inode+0x26/0x90 [btrfs]
    [ 4080.499353] [] ? kmem_cache_alloc+0xaf/0xc0
    [ 4080.505879] [] ? btrfs_iget+0xd5/0x5d0 [btrfs]
    [ 4080.512696] [] ? btrfs_get_token_64+0x104/0x120 [btrfs]
    [ 4080.520387] [] ? btrfs_log_inode_parent+0xbdf/0xf30 [btrfs]
    [ 4080.528469] [] ? btrfs_log_dentry_safe+0x59/0x80 [btrfs]
    [ 4080.536258] [] ? btrfs_sync_file+0x20d/0x330 [btrfs]
    [ 4080.543657] [] ? do_fsync+0x4c/0x80
    [ 4080.549399] [] ? SyS_fdatasync+0xa/0x10
    [ 4080.555534] [] ? system_call_fastpath+0x16/0x1b

    Signed-off-by: Robbie Ko
    Reviewed-by: Filipe Manana
    Fixes: 2f2ff0ee5e43 (Btrfs: fix metadata inconsistencies after directory fsync)
    Signed-off-by: Filipe Manana
    [Modified changelog for clarity and correctness]
    Signed-off-by: Greg Kroah-Hartman

    Robbie Ko
     
  • commit ef85b25e982b5bba1530b936e283ef129f02ab9d upstream.

    This can only happen with CONFIG_BTRFS_FS_CHECK_INTEGRITY=y.

    Commit 1ba98d0 ("Btrfs: detect corruption when non-root leaf has zero item")
    assumes that a leaf is its root when leaf->bytenr == btrfs_root_bytenr(root),
    however, we should not use btrfs_root_bytenr(root) since it's mainly got
    updated during committing transaction. So the check can fail when doing
    COW on this leaf while it is a root.

    This changes to use "if (leaf == btrfs_root_node(root))" instead, just like
    how we check whether leaf is a root in __btrfs_cow_block().

    Fixes: 1ba98d086fe3 (Btrfs: detect corruption when non-root leaf has zero item)
    Reported-by: Jeff Mahoney
    Signed-off-by: Liu Bo
    Reviewed-by: Filipe Manana
    Signed-off-by: Greg Kroah-Hartman

    Liu Bo
     
  • commit 2939e1a86f758b55cdba73e29397dd3d94df13bc upstream.

    Problem statement: unprivileged user who has read-write access to more than
    one btrfs subvolume may easily consume all kernel memory (eventually
    triggering oom-killer).

    Reproducer (./mkrmdir below essentially loops over mkdir/rmdir):

    [root@kteam1 ~]# cat prep.sh

    DEV=/dev/sdb
    mkfs.btrfs -f $DEV
    mount $DEV /mnt
    for i in `seq 1 16`
    do
    mkdir /mnt/$i
    btrfs subvolume create /mnt/SV_$i
    ID=`btrfs subvolume list /mnt |grep "SV_$i$" |cut -d ' ' -f 2`
    mount -t btrfs -o subvolid=$ID $DEV /mnt/$i
    chmod a+rwx /mnt/$i
    done

    [root@kteam1 ~]# sh prep.sh

    [maxim@kteam1 ~]$ for i in `seq 1 16`; do ./mkrmdir /mnt/$i 2000 2000 & done

    [root@kteam1 ~]# for i in `seq 1 4`; do grep "kmalloc-128" /proc/slabinfo | grep -v dma; sleep 60; done
    kmalloc-128 10144 10144 128 32 1 : tunables 0 0 0 : slabdata 317 317 0
    kmalloc-128 9992352 9992352 128 32 1 : tunables 0 0 0 : slabdata 312261 312261 0
    kmalloc-128 24226752 24226752 128 32 1 : tunables 0 0 0 : slabdata 757086 757086 0
    kmalloc-128 42754240 42754240 128 32 1 : tunables 0 0 0 : slabdata 1336070 1336070 0

    The huge numbers above come from insane number of async_work-s allocated
    and queued by btrfs_wq_run_delayed_node.

    The problem is caused by btrfs_wq_run_delayed_node() queuing more and more
    works if the number of delayed items is above BTRFS_DELAYED_BACKGROUND. The
    worker func (btrfs_async_run_delayed_root) processes at least
    BTRFS_DELAYED_BATCH items (if they are present in the list). So, the machinery
    works as expected while the list is almost empty. As soon as it is getting
    bigger, worker func starts to process more than one item at a time, it takes
    longer, and the chances to have async_works queued more than needed is getting
    higher.

    The problem above is worsened by another flaw of delayed-inode implementation:
    if async_work was queued in a throttling branch (number of items >=
    BTRFS_DELAYED_WRITEBACK), corresponding worker func won't quit until
    the number of items < BTRFS_DELAYED_BACKGROUND / 2. So, it is possible that
    the func occupies CPU infinitely (up to 30sec in my experiments): while the
    func is trying to drain the list, the user activity may add more and more
    items to the list.

    The patch fixes both problems in straightforward way: refuse queuing too
    many works in btrfs_wq_run_delayed_node and bail out of worker func if
    at least BTRFS_DELAYED_WRITEBACK items are processed.

    Changed in v2: remove support of thresh == NO_THRESHOLD.

    Signed-off-by: Maxim Patlasov
    Signed-off-by: Chris Mason
    Signed-off-by: Greg Kroah-Hartman

    Maxim Patlasov
     

05 Nov, 2016

1 commit

  • Pull btrfs fixes from Chris Mason:
    "Some fixes that Dave Sterba collected. We held off on these last week
    because I was focused on the memory corruption testing"

    * 'for-4.9-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux:
    btrfs: fix WARNING in btrfs_select_ref_head()
    Btrfs: remove some no-op casts
    btrfs: pass correct args to btrfs_async_run_delayed_refs()
    btrfs: make file clone aware of fatal signals
    btrfs: qgroup: Prevent qgroup->reserved from going subzero
    Btrfs: kill BUG_ON in do_relocation

    Linus Torvalds
     

29 Oct, 2016

1 commit

  • Pull btrfs fixes from Chris Mason:
    "My patch fixes the btrfs list_head abuse that we tracked down during
    Dave Jones' memory corruption investigation. With both Jens and my
    patches in place, I'm no longer able to trigger problems.

    Filipe is fixing a difficult old bug between snapshots, balance and
    send. Dave is cooking a few more for the next rc, but these are tested
    and ready"

    * 'for-linus-4.9' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux-btrfs:
    btrfs: fix races on root_log_ctx lists
    btrfs: fix incremental send failure caused by balance

    Linus Torvalds
     

28 Oct, 2016

1 commit

  • btrfs_remove_all_log_ctxs takes a shortcut where it avoids walking the
    list because it knows all of the waiters are patiently waiting for the
    commit to finish.

    But, there's a small race where btrfs_sync_log can remove itself from
    the list if it finds a log commit is already done. Also, it uses
    list_del_init() to remove itself from the list, but there's no way to
    know if btrfs_remove_all_log_ctxs has already run, so we don't know for
    sure if it is safe to call list_del_init().

    This gets rid of all the shortcuts for btrfs_remove_all_log_ctxs(), and
    just calls it with the proper locking.

    This is part two of the corruption fixed by cbd60aa7cd1. I should have
    done this in the first place, but convinced myself the optimizations were
    safe. A 12 hour run of dbench 2048 will eventually trigger a list debug
    WARN_ON for the list_del_init() in btrfs_sync_log().

    Fixes: d1433debe7f4346cf9fc0dafc71c3137d2a97bc4
    Reported-by: Dave Jones
    cc: stable@vger.kernel.org # 3.15+
    Signed-off-by: Chris Mason

    Chris Mason
     

25 Oct, 2016

5 commits

  • This issue was found when testing in-band dedupe enospc behaviour,
    sometimes run_one_delayed_ref() may fail for enospc reason, then
    __btrfs_run_delayed_refs()will return, but forget to add num_heads_read
    back, which will trigger "WARN_ON(delayed_refs->num_heads_ready == 0)" in
    btrfs_select_ref_head().

    Signed-off-by: Wang Xiaoguang
    Signed-off-by: David Sterba

    Wang Xiaoguang
     
  • We cast 0 to a u8 but then because of type promotion, it's immediately
    cast to int back to int before we do a bitwise negate. The cast doesn't
    matter in this case, the code works as intended. It causes a static
    checker warning though so let's remove it.

    Signed-off-by: Dan Carpenter
    Reviewed-by: David Sterba
    Signed-off-by: David Sterba

    Dan Carpenter
     
  • In btrfs_truncate_inode_items()->btrfs_async_run_delayed_refs(), we
    swap the arg2 and arg3 wrongly, fix this.

    This bug just impacts asynchronous delayed refs handle when we truncate inodes.
    In delayed_ref_async_start(), there is such codes:

    trans = btrfs_join_transaction(async->root);
    if (trans->transid > async->transid)
    goto end;
    ret = btrfs_run_delayed_refs(trans, async->root, async->count);

    From this codes, we can see that this just influence whether can we handle
    delayed refs or the number of delayed refs to handle, this may impact
    performance, but will not result in missing delayed refs, all delayed refs will
    be handled in btrfs_commit_transaction().

    Signed-off-by: Wang Xiaoguang
    Reviewed-by: Holger Hoffstätte
    Signed-off-by: David Sterba

    Wang Xiaoguang
     
  • Indeed this just make the behavior similar to xfs when process has
    fatal signals pending, and it'll make fstests/generic/298 happy.

    Signed-off-by: Wang Xiaoguang
    Reviewed-by: David Sterba
    Signed-off-by: David Sterba

    Wang Xiaoguang
     
  • 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: b9d0b38928 ("btrfs: Add handler for invalidate page")
    Signed-off-by: Goldwyn Rodrigues
    Reviewed-by: Qu Wenruo
    Signed-off-by: David Sterba

    Goldwyn Rodrigues
     

18 Oct, 2016

2 commits


17 Oct, 2016

1 commit

  • While updating btree, we try to push items between sibling
    nodes/leaves in order to keep height as low as possible.
    But we don't memset the original places with zero when
    pushing items so that we could end up leaving stale content
    in nodes/leaves. One may read the above stale content by
    increasing btree blocks' @nritems.

    One case I've come across is that in fs tree, a leaf has two
    parent nodes, hence running balance ends up with processing
    this leaf with two parent nodes, but it can only reach the
    valid parent node through btrfs_search_slot, so it'd be like,

    do_relocation
    for P in all parent nodes of block A:
    if !P->eb:
    btrfs_search_slot(key); --> get path from P to A.
    if lowest:
    BUG_ON(A->bytenr != bytenr of A recorded in P);
    btrfs_cow_block(P, A); --> change A's bytenr in P.

    After btrfs_cow_block, P has the new bytenr of A, but with the
    same @key, we get the same path again, and get panic by BUG_ON.

    Note that this is only happening in a corrupted fs, for a
    regular fs in which we have correct @nritems so that we won't
    read stale content in any case.

    Reviewed-by: Josef Bacik
    Signed-off-by: Liu Bo
    Signed-off-by: David Sterba

    Liu Bo
     

15 Oct, 2016

1 commit

  • Pull btrfs fixes from Chris Mason:
    "Some fixes from Omar and Dave Sterba for our new free space tree.

    This isn't heavily used yet, but as we move toward making it the new
    default we wanted to nail down an endian bug"

    * 'for-linus-4.9' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux-btrfs:
    btrfs: tests: uninline member definitions in free_space_extent
    btrfs: tests: constify free space extent specs
    Btrfs: expand free space tree sanity tests to catch endianness bug
    Btrfs: fix extent buffer bitmap tests on big-endian systems
    Btrfs: catch invalid free space trees
    Btrfs: fix mount -o clear_cache,space_cache=v2
    Btrfs: fix free space tree bitmaps on big-endian systems

    Linus Torvalds
     

13 Oct, 2016

1 commit


12 Oct, 2016

2 commits

  • Commit 951555856b88 ("Btrfs: send, don't bug on inconsistent snapshots")
    removed some BUG_ON() statements (replacing them with returning errors
    to user space and logging error messages) when a snapshot is in an
    inconsistent state due to failures to update a delayed inode item (ENOMEM
    or ENOSPC) after adding/updating/deleting references, xattrs or file
    extent items.

    However there is a case, when no errors happen, where a file extent item
    can be modified without having the corresponding inode item updated. This
    case happens during balance under very specific timings, when relocation
    is in the stage where it updates data pointers and a leaf that contains
    file extent items is COWed. When that happens file extent items get their
    disk_bytenr field updated to a new value that reflects the post relocation
    logical address of the extent, without updating their respective inode
    items (as there is nothing that needs to be updated on them). This is
    performed at relocation.c:replace_file_extents() through
    relocation.c:btrfs_reloc_cow_block().

    So make an incremental send deal with this case and don't do any processing
    for a file extent item that got its disk_bytenr field updated by relocation,
    since the extent's data is the same as the one pointed by the file extent
    item in the parent snapshot.

    After the recent commit mentioned above this case resulted in EIO errors
    returned to user space (and an error message logged to dmesg/syslog) when
    doing an incremental send, while before it, it resulted in hitting a
    BUG_ON leading to the following trace:

    [ 952.206705] ------------[ cut here ]------------
    [ 952.206714] kernel BUG at ../fs/btrfs/send.c:5653!
    [ 952.206719] Internal error: Oops - BUG: 0 [#1] SMP
    [ 952.209854] Modules linked in: st dm_mod nls_utf8 isofs fuse nf_log_ipv6 xt_pkttype xt_physdev br_netfilter nf_log_ipv4 nf_log_common xt_LOG xt_limit ebtable_filter ebtables af_packet bridge stp llc ip6t_REJECT xt_tcpudp nf_conntrack_ipv6 nf_defrag_ipv6 ip6table_raw ipt_REJECT iptable_raw xt_CT iptable_filter ip6table_mangle nf_conntrack_netbios_ns nf_conntrack_broadcast nf_conntrack_ipv4 nf_defrag_ipv4 ip_tables xt_conntrack nf_conntrack ip6table_filter ip6_tables x_tables xfs libcrc32c nls_iso8859_1 nls_cp437 vfat fat joydev aes_ce_blk ablk_helper cryptd snd_intel8x0 aes_ce_cipher snd_ac97_codec ac97_bus snd_pcm ghash_ce sha2_ce sha1_ce snd_timer snd virtio_net soundcore btrfs xor sr_mod cdrom hid_generic usbhid raid6_pq virtio_blk virtio_scsi bochs_drm drm_kms_helper syscopyarea sysfillrect sysimgblt fb_sys_fops ttm virtio_mmio xhci_pci xhci_hcd usbcore usb_common virtio_pci virtio_ring virtio drm sg efivarfs
    [ 952.228333] Supported: Yes
    [ 952.228908] CPU: 0 PID: 12779 Comm: snapperd Not tainted 4.4.14-50-default #1
    [ 952.230329] Hardware name: QEMU KVM Virtual Machine, BIOS 0.0.0 02/06/2015
    [ 952.231683] task: ffff800058e94100 ti: ffff8000d866c000 task.ti: ffff8000d866c000
    [ 952.233279] PC is at changed_cb+0x9f4/0xa48 [btrfs]
    [ 952.234375] LR is at changed_cb+0x58/0xa48 [btrfs]
    [ 952.236552] pc : [] lr : [] pstate: 80000145
    [ 952.238049] sp : ffff8000d866fa20
    [ 952.238732] x29: ffff8000d866fa20 x28: 0000000000000019
    [ 952.239840] x27: 00000000000028d5 x26: 00000000000024a2
    [ 952.241008] x25: 0000000000000002 x24: ffff8000e66e92f0
    [ 952.242131] x23: ffff8000b8c76800 x22: ffff800092879140
    [ 952.243238] x21: 0000000000000002 x20: ffff8000d866fb78
    [ 952.244348] x19: ffff8000b8f8c200 x18: 0000000000002710
    [ 952.245607] x17: 0000ffff90d42480 x16: ffff800000237dc0
    [ 952.246719] x15: 0000ffff90de7510 x14: ab000c000a2faf08
    [ 952.247835] x13: 0000000000577c2b x12: ab000c000b696665
    [ 952.248981] x11: 2e65726f632f6966 x10: 652d34366d72612f
    [ 952.250101] x9 : 32627572672f746f x8 : ab000c00092f1671
    [ 952.251352] x7 : 8000000000577c2b x6 : ffff800053eadf45
    [ 952.252468] x5 : 0000000000000000 x4 : ffff80005e169494
    [ 952.253582] x3 : 0000000000000004 x2 : ffff8000d866fb78
    [ 952.254695] x1 : 000000000003e2a3 x0 : 000000000003e2a4
    [ 952.255803]
    [ 952.256150] Process snapperd (pid: 12779, stack limit = 0xffff8000d866c020)
    [ 952.257516] Stack: (0xffff8000d866fa20 to 0xffff8000d8670000)
    [ 952.258654] fa20: ffff8000d866fae0 ffff7ffffc308fc0 ffff800092879140 ffff8000e66e92f0
    [ 952.260219] fa40: 0000000000000035 ffff800055de6000 ffff8000b8c76800 ffff8000d866fb78
    [ 952.261745] fa60: 0000000000000002 00000000000024a2 00000000000028d5 0000000000000019
    [ 952.263269] fa80: ffff8000d866fae0 ffff7ffffc3090f0 ffff8000d866fae0 ffff7ffffc309128
    [ 952.264797] faa0: ffff800092879140 ffff8000e66e92f0 0000000000000035 ffff800055de6000
    [ 952.268261] fac0: ffff8000b8c76800 ffff8000d866fb78 0000000000000002 0000000000001000
    [ 952.269822] fae0: ffff8000d866fbc0 ffff7ffffc39ecfc ffff8000b8f8c200 ffff8000b8f8c368
    [ 952.271368] fb00: ffff8000b8f8c378 ffff800055de6000 0000000000000001 ffff8000ecb17500
    [ 952.272893] fb20: ffff8000b8c76800 ffff800092879140 ffff800062b6d000 ffff80007a9e2470
    [ 952.274420] fb40: ffff8000b8f8c208 0000000005784000 ffff8000580a8000 ffff8000b8f8c200
    [ 952.276088] fb60: ffff7ffffc39d488 00000002b8f8c368 0000000000000000 000000000003e2a4
    [ 952.280275] fb80: 000000000000006c ffff7ffffc39ec00 000000000003e2a4 000000000000006c
    [ 952.283219] fba0: ffff8000b8f8c300 0000000000000100 0000000000000001 ffff8000ecb17500
    [ 952.286166] fbc0: ffff8000d866fcd0 ffff7ffffc3643c0 ffff8000f8842700 0000ffff8ffe9278
    [ 952.289136] fbe0: 0000000040489426 ffff800055de6000 0000ffff8ffe9278 0000000040489426
    [ 952.292083] fc00: 000000000000011d 000000000000001d ffff80007a9e4598 ffff80007a9e43e8
    [ 952.294959] fc20: ffff8000b8c7693f 0000000000003b24 0000000000000019 ffff8000b8f8c218
    [ 952.301161] fc40: 00000001d866fc70 ffff8000b8c76800 0000000000000128 ffffffffffffff84
    [ 952.305749] fc60: ffff800058e941ff 0000000000003a58 ffff8000d866fcb0 ffff8000000f7390
    [ 952.308875] fc80: 000000000000012a 0000000000010290 ffff8000d866fc00 000000000000007b
    [ 952.311915] fca0: 0000000000010290 ffff800046c1b100 74732d7366727462 000001006d616572
    [ 952.314937] fcc0: ffff8000fffc4100 cb88537fdc8ba60e ffff8000d866fe10 ffff8000002499e8
    [ 952.318008] fce0: 0000000040489426 ffff8000f8842700 0000ffff8ffe9278 ffff80007a9e4598
    [ 952.321321] fd00: 0000ffff8ffe9278 0000000040489426 000000000000011d 000000000000001d
    [ 952.324280] fd20: ffff80000072c000 ffff8000d866c000 ffff8000d866fda0 ffff8000000e997c
    [ 952.327156] fd40: ffff8000fffc4180 00000000000031ed ffff8000fffc4180 ffff800046c1b7d4
    [ 952.329895] fd60: 0000000000000140 0000ffff907ea170 000000000000011d 00000000000000dc
    [ 952.334641] fd80: ffff80000072c000 ffff8000d866c000 0000000000000000 0000000000000002
    [ 952.338002] fda0: ffff8000d866fdd0 ffff8000000ebacc ffff800046c1b080 ffff800046c1b7d4
    [ 952.340724] fdc0: ffff8000d866fdf0 ffff8000000db67c 0000000000000040 ffff800000e69198
    [ 952.343415] fde0: 0000ffff8ffea790 00000000000031ed ffff8000d866fe20 ffff800000254000
    [ 952.346101] fe00: 000000000000001d 0000000000000004 ffff8000d866fe90 ffff800000249d3c
    [ 952.348980] fe20: ffff8000f8842700 0000000000000000 ffff8000f8842701 0000000000000008
    [ 952.351696] fe40: ffff8000d866fe70 0000000000000008 ffff8000d866fe90 ffff800000249cf8
    [ 952.354387] fe60: ffff8000f8842700 0000ffff8ffe9170 ffff8000f8842701 0000000000000008
    [ 952.357083] fe80: 0000ffff8ffe9278 ffff80008ff85500 0000ffff8ffe90c0 ffff800000085c84
    [ 952.359800] fea0: 0000000000000000 0000ffff8ffe9170 ffffffffffffffff 0000ffff90d473bc
    [ 952.365351] fec0: 0000000000000000 0000000000000015 0000000000000008 0000000040489426
    [ 952.369550] fee0: 0000ffff8ffe9278 0000ffff907ea790 0000ffff907ea170 0000ffff907ea790
    [ 952.372416] ff00: 0000ffff907ea170 0000000000000000 000000000000001d 0000000000000004
    [ 952.375223] ff20: 0000ffff90a32220 00000000003d0f00 0000ffff907ea0a0 0000ffff8ffe8f30
    [ 952.378099] ff40: 0000ffff9100f554 0000ffff91147000 0000ffff91117bc0 0000ffff90d473b0
    [ 952.381115] ff60: 0000ffff9100f620 0000ffff880069b0 0000ffff8ffe9170 0000ffff8ffe91a0
    [ 952.384003] ff80: 0000ffff8ffe9160 0000ffff8ffe9140 0000ffff88006990 0000ffff8ffe9278
    [ 952.386860] ffa0: 0000ffff88008a60 0000ffff8ffe9480 0000ffff88014ca0 0000ffff8ffe90c0
    [ 952.389654] ffc0: 0000ffff910be8e8 0000ffff8ffe90c0 0000ffff90d473bc 0000000000000000
    [ 952.410986] ffe0: 0000000000000008 000000000000001d 6e2079747265706f 72616d223d656d61
    [ 952.415497] Call trace:
    [ 952.417403] [] changed_cb+0x9f4/0xa48 [btrfs]
    [ 952.420023] [] btrfs_compare_trees+0x500/0x6b0 [btrfs]
    [ 952.422759] [] btrfs_ioctl_send+0xb4c/0xe10 [btrfs]
    [ 952.425601] [] btrfs_ioctl+0x374/0x29a4 [btrfs]
    [ 952.428031] [] do_vfs_ioctl+0x33c/0x600
    [ 952.430360] [] SyS_ioctl+0x90/0xa4
    [ 952.432552] [] el0_svc_naked+0x38/0x3c
    [ 952.434803] Code: 2a1503e0 17fffdac b9404282 17ffff28 (d4210000)
    [ 952.437457] ---[ end trace 9afd7090c466cf15 ]---

    Signed-off-by: Filipe Manana

    Filipe Manana
     
  • Pull btrfs updates from Chris Mason:
    "This is a big variety of fixes and cleanups.

    Liu Bo continues to fixup fuzzer related problems, and some of Josef's
    cleanups are prep for his bigger extent buffer changes (slated for
    v4.10)"

    * 'for-linus-4.9' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux-btrfs: (39 commits)
    Revert "btrfs: let btrfs_delete_unused_bgs() to clean relocated bgs"
    Btrfs: remove unnecessary btrfs_mark_buffer_dirty in split_leaf
    Btrfs: don't BUG() during drop snapshot
    btrfs: fix btrfs_no_printk stub helper
    Btrfs: memset to avoid stale content in btree leaf
    btrfs: parent_start initialization cleanup
    btrfs: Remove already completed TODO comment
    btrfs: Do not reassign count in btrfs_run_delayed_refs
    btrfs: fix a possible umount deadlock
    Btrfs: fix memory leak in do_walk_down
    btrfs: btrfs_debug should consume fs_info when DEBUG is not defined
    btrfs: convert send's verbose_printk to btrfs_debug
    btrfs: convert pr_* to btrfs_* where possible
    btrfs: convert printk(KERN_* to use pr_* calls
    btrfs: unsplit printed strings
    btrfs: clean the old superblocks before freeing the device
    Btrfs: kill BUG_ON in run_delayed_tree_ref
    Btrfs: don't leak reloc root nodes on error
    btrfs: squash lines for simple wrapper functions
    Btrfs: improve check_node to avoid reading corrupted nodes
    ...

    Linus Torvalds
     

11 Oct, 2016

7 commits

  • Pull more vfs updates from Al Viro:
    ">rename2() work from Miklos + current_time() from Deepa"

    * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
    fs: Replace current_fs_time() with current_time()
    fs: Replace CURRENT_TIME_SEC with current_time() for inode timestamps
    fs: Replace CURRENT_TIME with current_time() for inode timestamps
    fs: proc: Delete inode time initializations in proc_alloc_inode()
    vfs: Add current_time() api
    vfs: add note about i_op->rename changes to porting
    fs: rename "rename2" i_op to "rename"
    vfs: remove unused i_op->rename
    fs: make remaining filesystems use .rename2
    libfs: support RENAME_NOREPLACE in simple_rename()
    fs: support RENAME_NOREPLACE for local filesystems
    ncpfs: fix unused variable warning

    Linus Torvalds
     
  • Al Viro
     
  • Pull vfs xattr updates from Al Viro:
    "xattr stuff from Andreas

    This completes the switch to xattr_handler ->get()/->set() from
    ->getxattr/->setxattr/->removexattr"

    * 'work.xattr' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
    vfs: Remove {get,set,remove}xattr inode operations
    xattr: Stop calling {get,set,remove}xattr inode operations
    vfs: Check for the IOP_XATTR flag in listxattr
    xattr: Add __vfs_{get,set,remove}xattr helpers
    libfs: Use IOP_XATTR flag for empty directory handling
    vfs: Use IOP_XATTR flag for bad-inode handling
    vfs: Add IOP_XATTR inode operations flag
    vfs: Move xattr_resolve_name to the front of fs/xattr.c
    ecryptfs: Switch to generic xattr handlers
    sockfs: Get rid of getxattr iop
    sockfs: getxattr: Fail with -EOPNOTSUPP for invalid attribute names
    kernfs: Switch to generic xattr handlers
    hfs: Switch to generic xattr handlers
    jffs2: Remove jffs2_{get,set,remove}xattr macros
    xattr: Remove unnecessary NULL attribute name check

    Linus Torvalds
     
  • This reverts commit 5d8eb6fe517583f9c6d5b94faf2254a0207a45c9.

    When we remove devices, we free the device structures. Delaying
    btfs_remove_chunk() ends up hitting a use-after-free on them.

    Signed-off-by: Chris Mason

    Chris Mason
     
  • Pull splice fixups from Al Viro:
    "A couple of fixups for interaction of pipe-backed iov_iter with
    O_DIRECT reads + constification of a couple of primitives in uio.h
    missed by previous rounds.

    Kudos to davej - his fuzzing has caught those bugs"

    * 'work.splice_read' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
    [btrfs] fix check_direct_IO() for non-iovec iterators
    constify iov_iter_count() and iter_is_iovec()
    fix ITER_PIPE interaction with direct_IO

    Linus Torvalds
     
  • Pull misc vfs updates from Al Viro:
    "Assorted misc bits and pieces.

    There are several single-topic branches left after this (rename2
    series from Miklos, current_time series from Deepa Dinamani, xattr
    series from Andreas, uaccess stuff from from me) and I'd prefer to
    send those separately"

    * 'work.misc' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (39 commits)
    proc: switch auxv to use of __mem_open()
    hpfs: support FIEMAP
    cifs: get rid of unused arguments of CIFSSMBWrite()
    posix_acl: uapi header split
    posix_acl: xattr representation cleanups
    fs/aio.c: eliminate redundant loads in put_aio_ring_file
    fs/internal.h: add const to ns_dentry_operations declaration
    compat: remove compat_printk()
    fs/buffer.c: make __getblk_slow() static
    proc: unsigned file descriptors
    fs/file: more unsigned file descriptors
    fs: compat: remove redundant check of nr_segs
    cachefiles: Fix attempt to read i_blocks after deleting file [ver #2]
    cifs: don't use memcpy() to copy struct iov_iter
    get rid of separate multipage fault-in primitives
    fs: Avoid premature clearing of capabilities
    fs: Give dentry to inode_change_ok() instead of inode
    fuse: Propagate dentry down to inode_change_ok()
    ceph: Propagate dentry down to inode_change_ok()
    xfs: Propagate dentry down to inode_change_ok()
    ...

    Linus Torvalds
     
  • looking for duplicate ->iov_base makes sense only for
    iovec-backed iterators; for kvec-backed ones it's pointless,
    for bvec-backed ones it's pointless and broken on 32bit (we
    walk through an array of struct bio_vec accessing them as if
    they were struct iovec; works by accident on 64bit, but on
    32bit it'll blow up) and for pipe-backed ones it's pointless
    and ends up oopsing.

    Signed-off-by: Al Viro

    Al Viro
     

08 Oct, 2016

3 commits