2007/8/27, Chris Mason <[EMAIL PROTECTED]>:
> It is hard to comment on this patch because there's no description for
> why you think it fixes block readahead.  But, reada_for_search tries to
> cluster blocks close to the one indicated in path->nodes[level][slot],
> so always using slot=zero should make us cluster by the first block
> pointer in the node.
> The defrag code tries to keep the nodes mostly contiguous, but it
> should be better to cluster by the block we're actually looking for.
> -chris
>


int btrfs_next_leaf(struct btrfs_root *root, struct btrfs_path *path)
{
        int slot;
        int level = 1;
        u64 blocknr;
        struct buffer_head *c;
        struct btrfs_node *c_node;
        struct buffer_head *next = NULL;

        while(level < BTRFS_MAX_LEVEL) {
                if (!path->nodes[level])
                        return 1;
                slot = path->slots[level] + 1;
                c = path->nodes[level];
                c_node = btrfs_buffer_node(c);
                if (slot >= btrfs_header_nritems(&c_node->header)) {
                        level++;
                        continue;
                }
                blocknr = btrfs_node_blockptr(c_node, slot);
                if (next)
                        btrfs_block_release(root, next);
                if (path->reada)
                        reada_for_search(root, path, level, slot);
                next = read_tree_block(root, blocknr);
                BUG_ON (!next);
                break;
        }
        path->slots[level] = slot;
        while(1) {
                level--;
                c = path->nodes[level];
                btrfs_block_release(root, c);
                path->nodes[level] = next;
                path->slots[level] = 0;
                if (!level)
                        break;
                if (path->reada)
                        reada_for_search(root, path, level, slot);
                next = read_tree_block(root,
                       btrfs_node_blockptr(btrfs_buffer_node(next), 0));
        }
        return 0;
}

I think in the second while loop,  slot should set to 0.

Regards
YZ

_______________________________________________
Btrfs-devel mailing list
[email protected]
http://oss.oracle.com/mailman/listinfo/btrfs-devel

Reply via email to