]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bcachefs: Fix loop restart in bch2_btree_transactions_read()
authorKent Overstreet <kent.overstreet@linux.dev>
Sat, 29 Jun 2024 01:08:01 +0000 (21:08 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sat, 29 Jun 2024 01:08:48 +0000 (21:08 -0400)
Accidental infinite loop; also fix btree_deadlock_to_text()

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/debug.c

index f0d4727c4dc290970aef02b9dcb921641a018153..ebabab171fe5eac2fe665094f1070e65de5e891c 100644 (file)
@@ -610,7 +610,7 @@ restart:
        list_sort(&c->btree_trans_list, list_ptr_order_cmp);
 
        list_for_each_entry(trans, &c->btree_trans_list, list) {
-               if ((ulong) trans < i->iter)
+               if ((ulong) trans <= i->iter)
                        continue;
 
                i->iter = (ulong) trans;
@@ -832,16 +832,16 @@ static const struct file_operations btree_transaction_stats_op = {
 static void btree_deadlock_to_text(struct printbuf *out, struct bch_fs *c)
 {
        struct btree_trans *trans;
-       pid_t iter = 0;
+       ulong iter = 0;
 restart:
        seqmutex_lock(&c->btree_trans_lock);
-       list_for_each_entry(trans, &c->btree_trans_list, list) {
-               struct task_struct *task = READ_ONCE(trans->locking_wait.task);
+       list_sort(&c->btree_trans_list, list_ptr_order_cmp);
 
-               if (!task || task->pid <= iter)
+       list_for_each_entry(trans, &c->btree_trans_list, list) {
+               if ((ulong) trans <= iter)
                        continue;
 
-               iter = task->pid;
+               iter = (ulong) trans;
 
                if (!closure_get_not_zero(&trans->ref))
                        continue;