summaryrefslogtreecommitdiff
path: root/fs
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2019-04-05 04:28:16 +0300
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-23 00:08:20 +0300
commitece254b258980cfd5a0fa11adce8e178c8d34181 (patch)
treeac0f28e4997e3fc0e6f81d17301b175f79d6616f /fs
parent2a039f1ee4077050c57c51f0463335d262740430 (diff)
downloadlinux-ece254b258980cfd5a0fa11adce8e178c8d34181.tar.xz
bcachefs: don't lose errors from iterators that have been freed
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs')
-rw-r--r--fs/bcachefs/btree_iter.c6
-rw-r--r--fs/bcachefs/btree_types.h1
2 files changed, 5 insertions, 2 deletions
diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c
index fbbb7428c592..02eb28bfe9b9 100644
--- a/fs/bcachefs/btree_iter.c
+++ b/fs/bcachefs/btree_iter.c
@@ -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;
}
diff --git a/fs/bcachefs/btree_types.h b/fs/bcachefs/btree_types.h
index bd6852d951ea..8c6f5fe6998e 100644
--- a/fs/bcachefs/btree_types.h
+++ b/fs/bcachefs/btree_types.h
@@ -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;