diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2019-04-04 21:28:16 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2019-04-04 21:28:16 -0400 |
commit | 9408d84fa9cc75251b1e2dcca8490baebb9e95e9 (patch) | |
tree | 9d77be2d7092cb66ad2bf9a01c0ecbe86279d7b2 | |
parent | 96f89f2874a8d584c22e3e804236f75adca1a3f9 (diff) |
bcachefs: don't lose errors from iterators that have been freed
-rw-r--r-- | fs/bcachefs/btree_iter.c | 6 | ||||
-rw-r--r-- | fs/bcachefs/btree_types.h | 1 |
2 files changed, 5 insertions, 2 deletions
diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c index ef0d058dc9a9..78f27ff800d0 100644 --- a/fs/bcachefs/btree_iter.c +++ b/fs/bcachefs/btree_iter.c @@ -982,6 +982,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; @@ -1941,7 +1942,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) @@ -1950,5 +1951,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 3d869dd80c26..a995efc73fdc 100644 --- a/fs/bcachefs/btree_types.h +++ b/fs/bcachefs/btree_types.h @@ -279,6 +279,7 @@ struct btree_trans { u8 nr_updates; u8 size; unsigned used_mempool:1; + unsigned error:1; unsigned mem_top; unsigned mem_bytes; |