summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2021-12-01 03:47:54 -0500
committerKent Overstreet <kent.overstreet@gmail.com>2021-12-25 17:37:11 -0500
commita0cc911d062d9d10f76e63629e95fed2bccaf691 (patch)
treeede063c8dc9c984130ced7badc761894c8f6724b
parentf5ded4af3000e2ea3420005ca507274498ad3ff9 (diff)
bcachefs: Fix btree_path leaks in bch2_trans_update()
bch2_trans_update() had some dodgy gets() and puts() - this fixes a few leaks. Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
-rw-r--r--fs/bcachefs/btree_update_leaf.c13
1 files changed, 6 insertions, 7 deletions
diff --git a/fs/bcachefs/btree_update_leaf.c b/fs/bcachefs/btree_update_leaf.c
index 131fd4c1e736..39917d104cb2 100644
--- a/fs/bcachefs/btree_update_leaf.c
+++ b/fs/bcachefs/btree_update_leaf.c
@@ -1324,8 +1324,6 @@ int bch2_trans_update(struct btree_trans *trans, struct btree_iter *iter,
.ip_allocated = _RET_IP_,
};
- __btree_path_get(n.path, true);
-
#ifdef CONFIG_BCACHEFS_DEBUG
trans_for_each_update(trans, i)
BUG_ON(i != trans->updates &&
@@ -1362,16 +1360,17 @@ int bch2_trans_update(struct btree_trans *trans, struct btree_iter *iter,
if (n.cached && !i->cached) {
i->k = n.k;
i->flags = n.flags;
-
- __btree_path_get(n.path, false);
- } else {
- bch2_path_put(trans, i->path, true);
- *i = n;
+ return 0;
}
+
+ bch2_path_put(trans, i->path, true);
+ *i = n;
} else
array_insert_item(trans->updates, trans->nr_updates,
i - trans->updates, n);
+ __btree_path_get(n.path, true);
+
return 0;
}