lkml.org 
[lkml]   [2020]   [Jan]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 044/103] btrfs: do not delete mismatched root refs
    Date
    From: Josef Bacik <josef@toxicpanda.com>

    commit 423a716cd7be16fb08690760691befe3be97d3fc upstream.

    btrfs_del_root_ref() will simply WARN_ON() if the ref doesn't match in
    any way, and then continue to delete the reference. This shouldn't
    happen, we have these values because there's more to the reference than
    the original root and the sub root. If any of these checks fail, return
    -ENOENT.

    CC: stable@vger.kernel.org # 4.4+
    Signed-off-by: Josef Bacik <josef@toxicpanda.com>
    Reviewed-by: David Sterba <dsterba@suse.com>
    Signed-off-by: David Sterba <dsterba@suse.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    fs/btrfs/root-tree.c | 10 ++++++----
    1 file changed, 6 insertions(+), 4 deletions(-)

    --- a/fs/btrfs/root-tree.c
    +++ b/fs/btrfs/root-tree.c
    @@ -370,11 +370,13 @@ again:
    leaf = path->nodes[0];
    ref = btrfs_item_ptr(leaf, path->slots[0],
    struct btrfs_root_ref);
    -
    - WARN_ON(btrfs_root_ref_dirid(leaf, ref) != dirid);
    - WARN_ON(btrfs_root_ref_name_len(leaf, ref) != name_len);
    ptr = (unsigned long)(ref + 1);
    - WARN_ON(memcmp_extent_buffer(leaf, name, ptr, name_len));
    + if ((btrfs_root_ref_dirid(leaf, ref) != dirid) ||
    + (btrfs_root_ref_name_len(leaf, ref) != name_len) ||
    + memcmp_extent_buffer(leaf, name, ptr, name_len)) {
    + err = -ENOENT;
    + goto out;
    + }
    *sequence = btrfs_root_ref_sequence(leaf, ref);

    ret = btrfs_del_item(trans, tree_root, path);

    \
     
     \ /
      Last update: 2020-01-22 10:48    [W:4.068 / U:0.228 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site