]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/btree_cache.c
Update bcachefs sources to ae6e8a59d3 bcachefs: quota limit enforcement
[bcachefs-tools-debian] / libbcachefs / btree_cache.c
index 22846d8acbfbd949f63f131fff049b1128df6493..78e36299b7a675ce60cf8a5846c610dfc56cfe81 100644 (file)
@@ -178,9 +178,9 @@ static int __btree_node_reclaim(struct bch_fs *c, struct btree *b, bool flush)
                 * the post write cleanup:
                 */
                if (verify_btree_ondisk(c))
-                       bch2_btree_node_write(c, b, NULL, SIX_LOCK_intent);
+                       bch2_btree_node_write(c, b, SIX_LOCK_intent);
                else
-                       __bch2_btree_node_write(c, b, NULL, SIX_LOCK_read);
+                       __bch2_btree_node_write(c, b, SIX_LOCK_read);
 
                /* wait for any in flight btree write */
                btree_node_wait_on_io(b);
@@ -626,7 +626,9 @@ struct btree *bch2_btree_node_get(struct bch_fs *c, struct btree_iter *iter,
        struct btree *b;
        struct bset_tree *t;
 
-       BUG_ON(level >= BTREE_MAX_DEPTH);
+       /* btree_node_fill() requires parent to be locked: */
+       EBUG_ON(!btree_node_locked(iter, level + 1));
+       EBUG_ON(level >= BTREE_MAX_DEPTH);
 retry:
        rcu_read_lock();
        b = btree_cache_find(bc, k);
@@ -763,6 +765,12 @@ struct btree *bch2_btree_node_get_sibling(struct bch_fs *c,
 
        if (IS_ERR(ret) && PTR_ERR(ret) == -EINTR) {
                btree_node_unlock(iter, level);
+
+               if (!bch2_btree_node_relock(iter, level + 1)) {
+                       bch2_btree_iter_set_locks_want(iter, level + 2);
+                       return ERR_PTR(-EINTR);
+               }
+
                ret = bch2_btree_node_get(c, iter, &tmp.k, level, SIX_LOCK_intent);
        }