btrfs: concentrate all tree block parentness check parameters into one structure
[sfrench/cifs-2.6.git] / fs / btrfs / tree-log.c
index 7be540fb5c4af23491f3774e7cedf806ee9488a0..4d9f6803bfbe26ca3d7c9f8c449971a00e7b2ae2 100644 (file)
@@ -27,6 +27,8 @@
 #include "root-tree.h"
 #include "dir-item.h"
 #include "file-item.h"
+#include "file.h"
+#include "orphan.h"
 
 #define MAX_CONFLICT_INODES 10
 
@@ -339,7 +341,12 @@ static int process_one_buffer(struct btrfs_root *log,
         * pin down any logged extents, so we have to read the block.
         */
        if (btrfs_fs_incompat(fs_info, MIXED_GROUPS)) {
-               ret = btrfs_read_extent_buffer(eb, gen, level, NULL);
+               struct btrfs_tree_parent_check check = {
+                       .level = level,
+                       .transid = gen
+               };
+
+               ret = btrfs_read_extent_buffer(eb, &check);
                if (ret)
                        return ret;
        }
@@ -2409,13 +2416,17 @@ static int replay_one_buffer(struct btrfs_root *log, struct extent_buffer *eb,
                             struct walk_control *wc, u64 gen, int level)
 {
        int nritems;
+       struct btrfs_tree_parent_check check = {
+               .transid = gen,
+               .level = level
+       };
        struct btrfs_path *path;
        struct btrfs_root *root = wc->replay_dest;
        struct btrfs_key key;
        int i;
        int ret;
 
-       ret = btrfs_read_extent_buffer(eb, gen, level, NULL);
+       ret = btrfs_read_extent_buffer(eb, &check);
        if (ret)
                return ret;
 
@@ -2595,7 +2606,7 @@ static noinline int walk_down_log_tree(struct btrfs_trans_handle *trans,
        int ret = 0;
 
        while (*level > 0) {
-               struct btrfs_key first_key;
+               struct btrfs_tree_parent_check check = { 0 };
 
                cur = path->nodes[*level];
 
@@ -2607,7 +2618,10 @@ static noinline int walk_down_log_tree(struct btrfs_trans_handle *trans,
 
                bytenr = btrfs_node_blockptr(cur, path->slots[*level]);
                ptr_gen = btrfs_node_ptr_generation(cur, path->slots[*level]);
-               btrfs_node_key_to_cpu(cur, &first_key, path->slots[*level]);
+               check.transid = ptr_gen;
+               check.level = *level - 1;
+               check.has_first_key = true;
+               btrfs_node_key_to_cpu(cur, &check.first_key, path->slots[*level]);
                blocksize = fs_info->nodesize;
 
                next = btrfs_find_create_tree_block(fs_info, bytenr,
@@ -2626,8 +2640,7 @@ static noinline int walk_down_log_tree(struct btrfs_trans_handle *trans,
 
                        path->slots[*level]++;
                        if (wc->free) {
-                               ret = btrfs_read_extent_buffer(next, ptr_gen,
-                                                       *level - 1, &first_key);
+                               ret = btrfs_read_extent_buffer(next, &check);
                                if (ret) {
                                        free_extent_buffer(next);
                                        return ret;
@@ -2655,7 +2668,7 @@ static noinline int walk_down_log_tree(struct btrfs_trans_handle *trans,
                        free_extent_buffer(next);
                        continue;
                }
-               ret = btrfs_read_extent_buffer(next, ptr_gen, *level - 1, &first_key);
+               ret = btrfs_read_extent_buffer(next, &check);
                if (ret) {
                        free_extent_buffer(next);
                        return ret;
@@ -5471,7 +5484,7 @@ again:
                        }
 
                        if (!need_log_inode(trans, BTRFS_I(di_inode))) {
-                               btrfs_add_delayed_iput(di_inode);
+                               btrfs_add_delayed_iput(BTRFS_I(di_inode));
                                break;
                        }
 
@@ -5480,7 +5493,7 @@ again:
                                log_mode = LOG_INODE_ALL;
                        ret = btrfs_log_inode(trans, BTRFS_I(di_inode),
                                              log_mode, ctx);
-                       btrfs_add_delayed_iput(di_inode);
+                       btrfs_add_delayed_iput(BTRFS_I(di_inode));
                        if (ret)
                                goto out;
                        if (ctx->log_new_dentries) {
@@ -5674,11 +5687,11 @@ static int add_conflicting_inode(struct btrfs_trans_handle *trans,
         * so that the log ends up with the new name and without the old name.
         */
        if (!need_log_inode(trans, BTRFS_I(inode))) {
-               btrfs_add_delayed_iput(inode);
+               btrfs_add_delayed_iput(BTRFS_I(inode));
                return 0;
        }
 
-       btrfs_add_delayed_iput(inode);
+       btrfs_add_delayed_iput(BTRFS_I(inode));
 
        ino_elem = kmalloc(sizeof(*ino_elem), GFP_NOFS);
        if (!ino_elem)
@@ -5753,7 +5766,7 @@ static int log_conflicting_inodes(struct btrfs_trans_handle *trans,
                         */
                        ret = btrfs_log_inode(trans, BTRFS_I(inode),
                                              LOG_INODE_ALL, ctx);
-                       btrfs_add_delayed_iput(inode);
+                       btrfs_add_delayed_iput(BTRFS_I(inode));
                        if (ret)
                                break;
                        continue;
@@ -5770,7 +5783,7 @@ static int log_conflicting_inodes(struct btrfs_trans_handle *trans,
                 * that, we can avoid doing it again.
                 */
                if (!need_log_inode(trans, BTRFS_I(inode))) {
-                       btrfs_add_delayed_iput(inode);
+                       btrfs_add_delayed_iput(BTRFS_I(inode));
                        continue;
                }
 
@@ -5782,7 +5795,7 @@ static int log_conflicting_inodes(struct btrfs_trans_handle *trans,
                 * log with the new name before we unpin it.
                 */
                ret = btrfs_log_inode(trans, BTRFS_I(inode), LOG_INODE_EXISTS, ctx);
-               btrfs_add_delayed_iput(inode);
+               btrfs_add_delayed_iput(BTRFS_I(inode));
                if (ret)
                        break;
        }
@@ -6292,7 +6305,7 @@ static int log_new_delayed_dentries(struct btrfs_trans_handle *trans,
                }
 
                if (!need_log_inode(trans, BTRFS_I(di_inode))) {
-                       btrfs_add_delayed_iput(di_inode);
+                       btrfs_add_delayed_iput(BTRFS_I(di_inode));
                        continue;
                }
 
@@ -6305,7 +6318,7 @@ static int log_new_delayed_dentries(struct btrfs_trans_handle *trans,
                if (!ret && ctx->log_new_dentries)
                        ret = log_new_dir_dentries(trans, BTRFS_I(di_inode), ctx);
 
-               btrfs_add_delayed_iput(di_inode);
+               btrfs_add_delayed_iput(BTRFS_I(di_inode));
 
                if (ret)
                        break;
@@ -6766,7 +6779,7 @@ static int btrfs_log_all_parents(struct btrfs_trans_handle *trans,
                        }
 
                        if (!need_log_inode(trans, BTRFS_I(dir_inode))) {
-                               btrfs_add_delayed_iput(dir_inode);
+                               btrfs_add_delayed_iput(BTRFS_I(dir_inode));
                                continue;
                        }
 
@@ -6776,7 +6789,7 @@ static int btrfs_log_all_parents(struct btrfs_trans_handle *trans,
                        if (!ret && ctx->log_new_dentries)
                                ret = log_new_dir_dentries(trans,
                                                   BTRFS_I(dir_inode), ctx);
-                       btrfs_add_delayed_iput(dir_inode);
+                       btrfs_add_delayed_iput(BTRFS_I(dir_inode));
                        if (ret)
                                goto out;
                }
@@ -6821,7 +6834,7 @@ static int log_new_ancestors(struct btrfs_trans_handle *trans,
                    need_log_inode(trans, BTRFS_I(inode)))
                        ret = btrfs_log_inode(trans, BTRFS_I(inode),
                                              LOG_INODE_EXISTS, ctx);
-               btrfs_add_delayed_iput(inode);
+               btrfs_add_delayed_iput(BTRFS_I(inode));
                if (ret)
                        return ret;