]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/btree_iter.c
Update bcachefs sources to f7670cba39 bcachefs: Fix for building in userspace
[bcachefs-tools-debian] / libbcachefs / btree_iter.c
index ad31a07c1942b356cfa1dd05bba5b50bb7290e99..73e2c5ef2eabe2d258784326467d13030bdc9fce 100644 (file)
@@ -263,10 +263,13 @@ bool __bch2_btree_node_lock(struct btree *b, struct bpos pos,
 /* Btree iterator locking: */
 
 #ifdef CONFIG_BCACHEFS_DEBUG
-void bch2_btree_iter_verify_locks(struct btree_iter *iter)
+void __bch2_btree_iter_verify_locks(struct btree_iter *iter)
 {
        unsigned l;
 
+       BUG_ON((iter->flags & BTREE_ITER_NOUNLOCK) &&
+              !btree_node_locked(iter, 0));
+
        for (l = 0; btree_iter_node(iter, l); l++) {
                if (iter->uptodate >= BTREE_ITER_NEED_RELOCK &&
                    !btree_node_locked(iter, l))
@@ -276,6 +279,15 @@ void bch2_btree_iter_verify_locks(struct btree_iter *iter)
                       btree_node_locked_type(iter, l));
        }
 }
+
+void bch2_btree_iter_verify_locks(struct btree_iter *iter)
+{
+       struct btree_iter *linked;
+
+       for_each_btree_iter(iter, linked)
+               __bch2_btree_iter_verify_locks(linked);
+
+}
 #endif
 
 __flatten
@@ -381,9 +393,9 @@ void __bch2_btree_iter_downgrade(struct btree_iter *iter,
                                break;
                        }
                }
-
-               bch2_btree_iter_verify_locks(linked);
        }
+
+       bch2_btree_iter_verify_locks(iter);
 }
 
 int bch2_btree_iter_unlock(struct btree_iter *iter)
@@ -420,13 +432,13 @@ static void __bch2_btree_iter_verify(struct btree_iter *iter,
         * whiteouts)
         */
        k = b->level || iter->flags & BTREE_ITER_IS_EXTENTS
-               ? bch2_btree_node_iter_prev_filter(&tmp, b, KEY_TYPE_DISCARD)
+               ? bch2_btree_node_iter_prev_filter(&tmp, b, KEY_TYPE_discard)
                : bch2_btree_node_iter_prev_all(&tmp, b);
        if (k && btree_iter_pos_cmp(iter, b, k) > 0) {
                char buf[100];
                struct bkey uk = bkey_unpack_key(b, k);
 
-               bch2_bkey_to_text(buf, sizeof(buf), &uk);
+               bch2_bkey_to_text(&PBUF(buf), &uk);
                panic("prev key should be before iter pos:\n%s\n%llu:%llu\n",
                      buf, iter->pos.inode, iter->pos.offset);
        }
@@ -436,7 +448,7 @@ static void __bch2_btree_iter_verify(struct btree_iter *iter,
                char buf[100];
                struct bkey uk = bkey_unpack_key(b, k);
 
-               bch2_bkey_to_text(buf, sizeof(buf), &uk);
+               bch2_bkey_to_text(&PBUF(buf), &uk);
                panic("iter should be after current key:\n"
                      "iter pos %llu:%llu\n"
                      "cur key  %s\n",
@@ -518,8 +530,24 @@ found:
        btree_iter_set_dirty(iter, BTREE_ITER_NEED_PEEK);
 
        bch2_btree_node_iter_sort(node_iter, b);
-       if (!b->level && node_iter == &iter->l[0].iter)
+       if (!b->level && node_iter == &iter->l[0].iter) {
+               /*
+                * not legal to call bkey_debugcheck() here, because we're
+                * called midway through the update path after update has been
+                * marked but before deletes have actually happened:
+                */
+#if 0
                __btree_iter_peek_all(iter, &iter->l[0], &iter->k);
+#endif
+               struct btree_iter_level *l = &iter->l[0];
+               struct bkey_packed *k =
+                       bch2_btree_node_iter_peek_all(&l->iter, l->b);
+
+               if (unlikely(!k))
+                       iter->k.type = KEY_TYPE_deleted;
+               else
+                       bkey_disassemble(l->b, k, &iter->k);
+       }
 iter_current_key_not_modified:
 
        /*
@@ -609,7 +637,7 @@ static inline struct bkey_s_c __btree_iter_unpack(struct btree_iter *iter,
                 * signal to bch2_btree_iter_peek_slot() that we're currently at
                 * a hole
                 */
-               u->type = KEY_TYPE_DELETED;
+               u->type = KEY_TYPE_deleted;
                return bkey_s_c_null;
        }
 
@@ -686,7 +714,7 @@ static void btree_iter_verify_new_node(struct btree_iter *iter, struct btree *b)
                char buf[100];
                struct bkey uk = bkey_unpack_key(b, k);
 
-               bch2_bkey_to_text(buf, sizeof(buf), &uk);
+               bch2_bkey_to_text(&PBUF(buf), &uk);
                panic("parent iter doesn't point to new node:\n%s\n%llu:%llu\n",
                      buf, b->key.k.p.inode, b->key.k.p.offset);
        }
@@ -775,9 +803,17 @@ void bch2_btree_iter_node_drop(struct btree_iter *iter, struct btree *b)
        struct btree_iter *linked;
        unsigned level = b->level;
 
+       /* caller now responsible for unlocking @b */
+
+       BUG_ON(iter->l[level].b != b);
+       BUG_ON(!btree_node_intent_locked(iter, level));
+
+       iter->l[level].b = BTREE_ITER_NOT_END;
+       mark_btree_node_unlocked(iter, level);
+
        for_each_btree_iter(iter, linked)
                if (linked->l[level].b == b) {
-                       btree_node_unlock(linked, level);
+                       __btree_node_unlock(linked, level);
                        linked->l[level].b = BTREE_ITER_NOT_END;
                }
 }
@@ -817,7 +853,7 @@ static inline int btree_iter_lock_root(struct btree_iter *iter,
                         */
                        iter->level = depth_want;
                        iter->l[iter->level].b = NULL;
-                       return 0;
+                       return 1;
                }
 
                lock_type = __btree_lock_want(iter, iter->level);
@@ -1044,6 +1080,9 @@ int __must_check __bch2_btree_iter_traverse(struct btree_iter *iter)
                        ? btree_iter_down(iter)
                        : btree_iter_lock_root(iter, depth_want);
                if (unlikely(ret)) {
+                       if (ret == 1)
+                               return 0;
+
                        iter->level = depth_want;
                        iter->l[iter->level].b = BTREE_ITER_NOT_END;
                        return ret;
@@ -1450,18 +1489,7 @@ recheck:
                               : KEY_OFFSET_MAX) -
                              n.p.offset));
 
-       //EBUG_ON(!n.size);
-       if (!n.size) {
-               char buf[100];
-               bch2_dump_btree_node(iter->l[0].b);
-
-               bch2_bkey_to_text(buf, sizeof(buf), k.k);
-               panic("iter at %llu:%llu\n"
-                     "next key %s\n",
-                     iter->pos.inode,
-                     iter->pos.offset,
-                     buf);
-       }
+       EBUG_ON(!n.size);
 
        iter->k = n;
        iter->uptodate = BTREE_ITER_UPTODATE;