summaryrefslogtreecommitdiff
path: root/fs/bcachefs/io.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2020-10-24 19:51:34 -0400
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-22 17:08:45 -0400
commit801a3de6427924d87ecc7e218a99ad3245ee8290 (patch)
tree9fb234d536b6e5d8dbc990ea89ae80a8ca7aa35f /fs/bcachefs/io.c
parent13dcd4abcd8d4e177f4f75ea3f5c8838a8a8c3c3 (diff)
downloadlwn-801a3de6427924d87ecc7e218a99ad3245ee8290.tar.gz
lwn-801a3de6427924d87ecc7e218a99ad3245ee8290.zip
bcachefs: Indirect inline data extents
When inline data extents were added, reflink was forgotten about - we need indirect inline data extents for reflink + inline data to work correctly. This patch adds them, and a new feature bit that's flipped when they're used. Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com> Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs/bcachefs/io.c')
-rw-r--r--fs/bcachefs/io.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/fs/bcachefs/io.c b/fs/bcachefs/io.c
index 03f5b9034aa7..346d77d68ade 100644
--- a/fs/bcachefs/io.c
+++ b/fs/bcachefs/io.c
@@ -2000,7 +2000,8 @@ int __bch2_read_indirect_extent(struct btree_trans *trans,
if (ret)
goto err;
- if (k.k->type != KEY_TYPE_reflink_v) {
+ if (k.k->type != KEY_TYPE_reflink_v &&
+ k.k->type != KEY_TYPE_indirect_inline_data) {
__bcache_io_error(trans->c,
"pointer to nonexistent indirect extent");
ret = -EIO;
@@ -2027,13 +2028,12 @@ int __bch2_read_extent(struct bch_fs *c, struct bch_read_bio *orig,
struct bpos pos = bkey_start_pos(k.k);
int pick_ret;
- if (k.k->type == KEY_TYPE_inline_data) {
- struct bkey_s_c_inline_data d = bkey_s_c_to_inline_data(k);
+ if (bkey_extent_is_inline_data(k.k)) {
unsigned bytes = min_t(unsigned, iter.bi_size,
- bkey_val_bytes(d.k));
+ bkey_inline_data_bytes(k.k));
swap(iter.bi_size, bytes);
- memcpy_to_bio(&orig->bio, iter, d.v->data);
+ memcpy_to_bio(&orig->bio, iter, bkey_inline_data_p(k));
swap(iter.bi_size, bytes);
bio_advance_iter(&orig->bio, &iter, bytes);
zero_fill_bio_iter(&orig->bio, iter);