]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - fs/btrfs/backref.c
Merge tag 'drm-intel-next-2017-05-29' of git://anongit.freedesktop.org/git/drm-intel...
[karo-tx-linux.git] / fs / btrfs / backref.c
index 7699e16784d313459181c746d0b8c30d468e23a7..24865da63d8fdfd2a979429a426b42fe8781e0aa 100644 (file)
 #include "delayed-ref.h"
 #include "locking.h"
 
+enum merge_mode {
+       MERGE_IDENTICAL_KEYS = 1,
+       MERGE_IDENTICAL_PARENTS,
+};
+
 /* Just an arbitrary number so we can be sure this happened */
 #define BACKREF_FOUND_SHARED 6
 
@@ -533,7 +538,7 @@ static int add_all_parents(struct btrfs_root *root, struct btrfs_path *path,
         * slot==nritems. In that case, go to the next leaf before we continue.
         */
        if (path->slots[0] >= btrfs_header_nritems(path->nodes[0])) {
-               if (time_seq == (u64)-1)
+               if (time_seq == SEQ_LAST)
                        ret = btrfs_next_leaf(root, path);
                else
                        ret = btrfs_next_old_leaf(root, path, time_seq);
@@ -577,7 +582,7 @@ static int add_all_parents(struct btrfs_root *root, struct btrfs_path *path,
                        eie = NULL;
                }
 next:
-               if (time_seq == (u64)-1)
+               if (time_seq == SEQ_LAST)
                        ret = btrfs_next_item(root, path);
                else
                        ret = btrfs_next_old_item(root, path, time_seq);
@@ -629,7 +634,7 @@ static int __resolve_indirect_ref(struct btrfs_fs_info *fs_info,
 
        if (path->search_commit_root)
                root_level = btrfs_header_level(root->commit_root);
-       else if (time_seq == (u64)-1)
+       else if (time_seq == SEQ_LAST)
                root_level = btrfs_header_level(root->node);
        else
                root_level = btrfs_old_root_level(root, time_seq);
@@ -640,7 +645,7 @@ static int __resolve_indirect_ref(struct btrfs_fs_info *fs_info,
        }
 
        path->lowest_level = level;
-       if (time_seq == (u64)-1)
+       if (time_seq == SEQ_LAST)
                ret = btrfs_search_slot(NULL, root, &ref->key_for_search, path,
                                        0, 0);
        else
@@ -809,14 +814,12 @@ static int __add_missing_keys(struct btrfs_fs_info *fs_info,
 /*
  * merge backrefs and adjust counts accordingly
  *
- * mode = 1: merge identical keys, if key is set
- *    FIXME: if we add more keys in __add_prelim_ref, we can merge more here.
- *           additionally, we could even add a key range for the blocks we
- *           looked into to merge even more (-> replace unresolved refs by those
- *           having a parent).
- * mode = 2: merge identical parents
+ *    FIXME: For MERGE_IDENTICAL_KEYS, if we add more keys in __add_prelim_ref
+ *           then we can merge more here. Additionally, we could even add a key
+ *           range for the blocks we looked into to merge even more (-> replace
+ *           unresolved refs by those having a parent).
  */
-static void __merge_refs(struct list_head *head, int mode)
+static void __merge_refs(struct list_head *head, enum merge_mode mode)
 {
        struct __prelim_ref *pos1;
 
@@ -829,7 +832,7 @@ static void __merge_refs(struct list_head *head, int mode)
 
                        if (!ref_for_same_block(ref1, ref2))
                                continue;
-                       if (mode == 1) {
+                       if (mode == MERGE_IDENTICAL_KEYS) {
                                if (!ref1->parent && ref2->parent)
                                        swap(ref1, ref2);
                        } else {
@@ -1196,7 +1199,7 @@ static int __add_keyed_refs(struct btrfs_fs_info *fs_info,
  *
  * NOTE: This can return values > 0
  *
- * If time_seq is set to (u64)-1, it will not search delayed_refs, and behave
+ * If time_seq is set to SEQ_LAST, it will not search delayed_refs, and behave
  * much like trans == NULL case, the difference only lies in it will not
  * commit root.
  * The special case is for qgroup to search roots in commit_transaction().
@@ -1243,7 +1246,7 @@ static int find_parent_nodes(struct btrfs_trans_handle *trans,
                path->skip_locking = 1;
        }
 
-       if (time_seq == (u64)-1)
+       if (time_seq == SEQ_LAST)
                path->skip_locking = 1;
 
        /*
@@ -1273,9 +1276,9 @@ again:
 
 #ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS
        if (trans && likely(trans->type != __TRANS_DUMMY) &&
-           time_seq != (u64)-1) {
+           time_seq != SEQ_LAST) {
 #else
-       if (trans && time_seq != (u64)-1) {
+       if (trans && time_seq != SEQ_LAST) {
 #endif
                /*
                 * look if there are updates for this ref queued and lock the
@@ -1286,7 +1289,7 @@ again:
                head = btrfs_find_delayed_ref_head(delayed_refs, bytenr);
                if (head) {
                        if (!mutex_trylock(&head->mutex)) {
-                               atomic_inc(&head->node.refs);
+                               refcount_inc(&head->node.refs);
                                spin_unlock(&delayed_refs->lock);
 
                                btrfs_release_path(path);
@@ -1374,7 +1377,7 @@ again:
        if (ret)
                goto out;
 
-       __merge_refs(&prefs, 1);
+       __merge_refs(&prefs, MERGE_IDENTICAL_KEYS);
 
        ret = __resolve_indirect_refs(fs_info, path, time_seq, &prefs,
                                      extent_item_pos, total_refs,
@@ -1382,7 +1385,7 @@ again:
        if (ret)
                goto out;
 
-       __merge_refs(&prefs, 2);
+       __merge_refs(&prefs, MERGE_IDENTICAL_PARENTS);
 
        while (!list_empty(&prefs)) {
                ref = list_first_entry(&prefs, struct __prelim_ref, list);