Hello Mark Fasheh,
The patch 1152651a0817: "btrfs: qgroup: account shared subtrees
during snapshot delete" from Jul 17, 2014, leads to the following
static checker warning:
fs/btrfs/extent-tree.c:7642 account_shared_subtree()
error: off-by-one overflow 'path->nodes' size 8. index range = '1-8'
fs/btrfs/extent-tree.c
7611 BUG_ON(root_level < 0 || root_level > BTRFS_MAX_LEVEL);
At first I thought that I could just change this > to >= to fix this
warning.
7612 BUG_ON(root_eb == NULL);
7613
7614 if (!root->fs_info->quota_enabled)
7615 return 0;
7616
7617 if (!extent_buffer_uptodate(root_eb)) {
7618 ret = btrfs_read_buffer(root_eb, root_gen);
7619 if (ret)
7620 goto out;
7621 }
7622
7623 if (root_level == 0) {
7624 ret = account_leaf_items(trans, root, root_eb);
7625 goto out;
7626 }
7627
7628 path = btrfs_alloc_path();
7629 if (!path)
7630 return -ENOMEM;
7631
7632 /*
7633 * Walk down the tree. Missing extent blocks are filled in as
7634 * we go. Metadata is accounted every time we read a new
7635 * extent block.
7636 *
7637 * When we reach a leaf, we account for file extent items in it,
7638 * walk back up the tree (adjusting slot pointers as we go)
7639 * and restart the search process.
7640 */
7641 extent_buffer_get(root_eb); /* For path */
7642 path->nodes[root_level] = root_eb;
->nodes[] has BTRFS_MAX_LEVEL elements.
7643 path->slots[root_level] = 0;
7644 path->locks[root_level] = 0; /* so release_path doesn't try to unlock */
7645 walk_down:
7646 level = root_level;
7647 while (level >= 0) {
7648 if (path->nodes[level] == NULL) {
7649 int parent_slot;
7650 u64 child_gen;
7651 u64 child_bytenr;
7652
7653 /* We need to get child blockptr/gen from
7654 * parent before we can read it. */
7655 eb = path->nodes[level + 1];
^^^^^^^^^^^^^^^^^^
But when I changed that, then it introduced a warning here because we
add one. I'm not sure what to do.
7656 parent_slot = path->slots[level + 1];
7657 child_bytenr = btrfs_node_blockptr(eb, parent_slot);
7658 child_gen = btrfs_node_ptr_generation(eb, parent_slot);
7659
7660 eb = read_tree_block(root, child_bytenr, child_gen);
7661 if (!eb || !extent_buffer_uptodate(eb)) {
7662 ret = -EIO;
7663 goto out;
7664 }
7665
7666 path->nodes[level] = eb;
7667 path->slots[level] = 0;
7668
regards,
dan carpenter
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html