summaryrefslogtreecommitdiff
path: root/fs/bcachefs/reflink.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2019-10-05 03:40:47 +0300
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-23 00:08:28 +0300
commit63fbf458cb7d7df6b58f982df7496f79ee9e6863 (patch)
tree3745246903357f2a29751e4f28e68f4ff1d74fa0 /fs/bcachefs/reflink.c
parent0741d378216054145c9fd2c316924e1d403c8266 (diff)
downloadlinux-63fbf458cb7d7df6b58f982df7496f79ee9e6863.tar.xz
bcachefs: Can't be holding read locks while taking write locks
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs/bcachefs/reflink.c')
-rw-r--r--fs/bcachefs/reflink.c12
1 files changed, 5 insertions, 7 deletions
diff --git a/fs/bcachefs/reflink.c b/fs/bcachefs/reflink.c
index ad526d280a14..f1b0e7fc8487 100644
--- a/fs/bcachefs/reflink.c
+++ b/fs/bcachefs/reflink.c
@@ -144,20 +144,18 @@ err:
static struct bkey_s_c get_next_src(struct btree_iter *iter, struct bpos end)
{
struct bkey_s_c k = bch2_btree_iter_peek(iter);
+ int ret;
- while (1) {
- if (bkey_err(k))
- return k;
-
+ for_each_btree_key_continue(iter, 0, k, ret) {
if (bkey_cmp(iter->pos, end) >= 0)
return bkey_s_c_null;
if (k.k->type == KEY_TYPE_extent ||
k.k->type == KEY_TYPE_reflink_p)
- return k;
-
- k = bch2_btree_iter_next(iter);
+ break;
}
+
+ return k;
}
s64 bch2_remap_range(struct bch_fs *c,