bcachefs: don't lose errors from iterators that have been freed
authorKent Overstreet <kent.overstreet@gmail.com>
Fri, 5 Apr 2019 01:28:16 +0000 (21:28 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:20 +0000 (17:08 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_iter.c
fs/bcachefs/btree_types.h

index fbbb7428c592e8cde719824f83a325aa4904b679..02eb28bfe9b97142bb42af38960fbe1817106901 100644 (file)
@@ -983,6 +983,7 @@ retry_all:
        }
 
        if (unlikely(ret == -EIO)) {
+               trans->error = true;
                iter->flags |= BTREE_ITER_ERROR;
                iter->l[iter->level].b = BTREE_ITER_NOT_END;
                goto out;
@@ -1943,7 +1944,7 @@ void bch2_trans_init(struct btree_trans *trans, struct bch_fs *c)
 
 int bch2_trans_exit(struct btree_trans *trans)
 {
-       int ret = bch2_trans_unlock(trans);
+       bch2_trans_unlock(trans);
 
        kfree(trans->mem);
        if (trans->used_mempool)
@@ -1952,5 +1953,6 @@ int bch2_trans_exit(struct btree_trans *trans)
                kfree(trans->iters);
        trans->mem      = (void *) 0x1;
        trans->iters    = (void *) 0x1;
-       return ret;
+
+       return trans->error ? -EIO : 0;
 }
index bd6852d951ea437066a08ead4c443d8d9fd2d07f..8c6f5fe6998e834356d02b77fec3a300259faec7 100644 (file)
@@ -280,6 +280,7 @@ struct btree_trans {
        u8                      nr_updates;
        u8                      size;
        unsigned                used_mempool:1;
+       unsigned                error:1;
 
        unsigned                mem_top;
        unsigned                mem_bytes;