Fix btrfs_del_ordered_inode to allow forcing the drop during unlinks
[safe/jmp/linux-2.6] / fs / btrfs / ctree.c
index 1b756fa..9601241 100644 (file)
@@ -1245,7 +1245,10 @@ int btrfs_search_slot(struct btrfs_trans_handle *trans, struct btrfs_root
        int level;
        int should_reada = p->reada;
        int lowest_unlock = 1;
+       int blocksize;
        u8 lowest_level = 0;
+       u64 blocknr;
+       u64 gen;
 
        lowest_level = p->lowest_level;
        WARN_ON(lowest_level && ins_len);
@@ -1320,11 +1323,12 @@ again:
                                reada_for_search(root, p, level, slot,
                                                 key->objectid);
 
-                       tmp = btrfs_find_tree_block(root,
-                                         btrfs_node_blockptr(b, slot),
-                                         btrfs_level_size(root, level - 1));
-                       if (tmp && btrfs_buffer_uptodate(tmp,
-                                  btrfs_node_ptr_generation(b, slot))) {
+                       blocknr = btrfs_node_blockptr(b, slot);
+                       gen = btrfs_node_ptr_generation(b, slot);
+                       blocksize = btrfs_level_size(root, level - 1);
+
+                       tmp = btrfs_find_tree_block(root, blocknr, blocksize);
+                       if (tmp && btrfs_buffer_uptodate(tmp, gen)) {
                                b = tmp;
                        } else {
                                /*
@@ -1336,6 +1340,10 @@ again:
                                        btrfs_release_path(NULL, p);
                                        if (tmp)
                                                free_extent_buffer(tmp);
+                                       tmp = read_tree_block(root, blocknr,
+                                                        blocksize, gen);
+                                       if (tmp)
+                                               free_extent_buffer(tmp);
                                        goto again;
                                } else {
                                        b = read_node_slot(root, b, slot);