Skip to content

Commit 934137b

Browse files
author
Kent Overstreet
committed
bcachefs: bch2_trigger_ptr() calculates sectors even when no device
This is necessary for erasure coded pointers to devices that have been removed. Signed-off-by: Kent Overstreet <[email protected]>
1 parent 2aee59e commit 934137b

File tree

2 files changed

+21
-10
lines changed

2 files changed

+21
-10
lines changed

fs/bcachefs/backpointers.h

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -134,28 +134,37 @@ static inline enum bch_data_type bch2_bkey_ptr_data_type(struct bkey_s_c k,
134134
}
135135
}
136136

137-
static inline void bch2_extent_ptr_to_bp(struct bch_fs *c, struct bch_dev *ca,
137+
static inline void __bch2_extent_ptr_to_bp(struct bch_fs *c, struct bch_dev *ca,
138138
enum btree_id btree_id, unsigned level,
139139
struct bkey_s_c k, struct extent_ptr_decoded p,
140140
const union bch_extent_entry *entry,
141-
struct bpos *bucket_pos, struct bch_backpointer *bp)
141+
struct bpos *bucket_pos, struct bch_backpointer *bp,
142+
u64 sectors)
142143
{
143-
enum bch_data_type data_type = bch2_bkey_ptr_data_type(k, p, entry);
144-
s64 sectors = level ? btree_sectors(c) : k.k->size;
145144
u32 bucket_offset;
146-
147145
*bucket_pos = PTR_BUCKET_POS_OFFSET(ca, &p.ptr, &bucket_offset);
148146
*bp = (struct bch_backpointer) {
149147
.btree_id = btree_id,
150148
.level = level,
151-
.data_type = data_type,
149+
.data_type = bch2_bkey_ptr_data_type(k, p, entry),
152150
.bucket_offset = ((u64) bucket_offset << MAX_EXTENT_COMPRESS_RATIO_SHIFT) +
153151
p.crc.offset,
154-
.bucket_len = ptr_disk_sectors(sectors, p),
152+
.bucket_len = sectors,
155153
.pos = k.k->p,
156154
};
157155
}
158156

157+
static inline void bch2_extent_ptr_to_bp(struct bch_fs *c, struct bch_dev *ca,
158+
enum btree_id btree_id, unsigned level,
159+
struct bkey_s_c k, struct extent_ptr_decoded p,
160+
const union bch_extent_entry *entry,
161+
struct bpos *bucket_pos, struct bch_backpointer *bp)
162+
{
163+
u64 sectors = ptr_disk_sectors(level ? btree_sectors(c) : k.k->size, p);
164+
165+
__bch2_extent_ptr_to_bp(c, ca, btree_id, level, k, p, entry, bucket_pos, bp, sectors);
166+
}
167+
159168
int bch2_get_next_backpointer(struct btree_trans *, struct bch_dev *ca, struct bpos, int,
160169
struct bpos *, struct bch_backpointer *, unsigned);
161170
struct bkey_s_c bch2_backpointer_get_key(struct btree_trans *, struct btree_iter *,

fs/bcachefs/buckets.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -565,11 +565,14 @@ static int bch2_trigger_pointer(struct btree_trans *trans,
565565
s64 *sectors,
566566
enum btree_iter_update_trigger_flags flags)
567567
{
568+
struct bch_fs *c = trans->c;
568569
bool insert = !(flags & BTREE_TRIGGER_overwrite);
569570
struct printbuf buf = PRINTBUF;
570571
int ret = 0;
571572

572-
struct bch_fs *c = trans->c;
573+
u64 abs_sectors = ptr_disk_sectors(level ? btree_sectors(c) : k.k->size, p);
574+
*sectors = insert ? abs_sectors : -abs_sectors;
575+
573576
struct bch_dev *ca = bch2_dev_tryget(c, p.ptr.dev);
574577
if (unlikely(!ca)) {
575578
if (insert && p.ptr.dev != BCH_SB_MEMBER_INVALID)
@@ -579,8 +582,7 @@ static int bch2_trigger_pointer(struct btree_trans *trans,
579582

580583
struct bpos bucket;
581584
struct bch_backpointer bp;
582-
bch2_extent_ptr_to_bp(trans->c, ca, btree_id, level, k, p, entry, &bucket, &bp);
583-
*sectors = insert ? bp.bucket_len : -((s64) bp.bucket_len);
585+
__bch2_extent_ptr_to_bp(trans->c, ca, btree_id, level, k, p, entry, &bucket, &bp, abs_sectors);
584586

585587
if (flags & BTREE_TRIGGER_transactional) {
586588
struct bkey_i_alloc_v4 *a = bch2_trans_start_alloc_update(trans, bucket, 0);

0 commit comments

Comments
 (0)