summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2019-09-07 16:13:20 -0400
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-22 17:08:26 -0400
commit8d84260ec1b11c20a7f01797b34fcbc12b33fd70 (patch)
tree6d49bf909d600e0f4ad8feaa52407c3c4083925c
parentb50dd7920d1cd7b37016929faa175578de12dd27 (diff)
downloadlwn-8d84260ec1b11c20a7f01797b34fcbc12b33fd70.tar.gz
lwn-8d84260ec1b11c20a7f01797b34fcbc12b33fd70.zip
bcachefs: data move path should not be trying to move reflink_p keys
This was spotted when the move_extent() path tried to allocate a bio for a reflink_p extent, but adding pages to the bio failed because we overflowed bi_max_vecs. Oops. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
-rw-r--r--fs/bcachefs/extents.h9
-rw-r--r--fs/bcachefs/move.c2
2 files changed, 8 insertions, 3 deletions
diff --git a/fs/bcachefs/extents.h b/fs/bcachefs/extents.h
index 4c4a7945a751..766584939304 100644
--- a/fs/bcachefs/extents.h
+++ b/fs/bcachefs/extents.h
@@ -455,12 +455,11 @@ unsigned bch2_extent_is_compressed(struct bkey_s_c);
bool bch2_bkey_matches_ptr(struct bch_fs *, struct bkey_s_c,
struct bch_extent_ptr, u64);
-static inline bool bkey_extent_is_data(const struct bkey *k)
+static inline bool bkey_extent_is_direct_data(const struct bkey *k)
{
switch (k->type) {
case KEY_TYPE_btree_ptr:
case KEY_TYPE_extent:
- case KEY_TYPE_reflink_p:
case KEY_TYPE_reflink_v:
return true;
default:
@@ -468,6 +467,12 @@ static inline bool bkey_extent_is_data(const struct bkey *k)
}
}
+static inline bool bkey_extent_is_data(const struct bkey *k)
+{
+ return bkey_extent_is_direct_data(k) ||
+ k->type == KEY_TYPE_reflink_p;
+}
+
/*
* Should extent be counted under inode->i_sectors?
*/
diff --git a/fs/bcachefs/move.c b/fs/bcachefs/move.c
index d01c96ff00d7..8855dd19f7f2 100644
--- a/fs/bcachefs/move.c
+++ b/fs/bcachefs/move.c
@@ -547,7 +547,7 @@ peek:
if (bkey_cmp(bkey_start_pos(k.k), end) >= 0)
break;
- if (!bkey_extent_is_data(k.k))
+ if (!bkey_extent_is_direct_data(k.k))
goto next_nondata;
if (cur_inum != k.k->p.inode) {