diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2019-09-07 16:13:20 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-10-22 17:08:26 -0400 |
commit | 8d84260ec1b11c20a7f01797b34fcbc12b33fd70 (patch) | |
tree | 6d49bf909d600e0f4ad8feaa52407c3c4083925c | |
parent | b50dd7920d1cd7b37016929faa175578de12dd27 (diff) | |
download | lwn-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.h | 9 | ||||
-rw-r--r-- | fs/bcachefs/move.c | 2 |
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) { |