Commit 934137b0 authored by Kent Overstreet's avatar Kent Overstreet
Browse files

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: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent 2aee59eb
Loading
Loading
Loading
Loading
+16 −7
Original line number Diff line number Diff line
@@ -134,28 +134,37 @@ static inline enum bch_data_type bch2_bkey_ptr_data_type(struct bkey_s_c k,
	}
}

static inline void bch2_extent_ptr_to_bp(struct bch_fs *c, struct bch_dev *ca,
static inline void __bch2_extent_ptr_to_bp(struct bch_fs *c, struct bch_dev *ca,
			   enum btree_id btree_id, unsigned level,
			   struct bkey_s_c k, struct extent_ptr_decoded p,
			   const union bch_extent_entry *entry,
			   struct bpos *bucket_pos, struct bch_backpointer *bp)
			   struct bpos *bucket_pos, struct bch_backpointer *bp,
			   u64 sectors)
{
	enum bch_data_type data_type = bch2_bkey_ptr_data_type(k, p, entry);
	s64 sectors = level ? btree_sectors(c) : k.k->size;
	u32 bucket_offset;

	*bucket_pos = PTR_BUCKET_POS_OFFSET(ca, &p.ptr, &bucket_offset);
	*bp = (struct bch_backpointer) {
		.btree_id	= btree_id,
		.level		= level,
		.data_type	= data_type,
		.data_type	= bch2_bkey_ptr_data_type(k, p, entry),
		.bucket_offset	= ((u64) bucket_offset << MAX_EXTENT_COMPRESS_RATIO_SHIFT) +
			p.crc.offset,
		.bucket_len	= ptr_disk_sectors(sectors, p),
		.bucket_len	= sectors,
		.pos		= k.k->p,
	};
}

static inline void bch2_extent_ptr_to_bp(struct bch_fs *c, struct bch_dev *ca,
			   enum btree_id btree_id, unsigned level,
			   struct bkey_s_c k, struct extent_ptr_decoded p,
			   const union bch_extent_entry *entry,
			   struct bpos *bucket_pos, struct bch_backpointer *bp)
{
	u64 sectors = ptr_disk_sectors(level ? btree_sectors(c) : k.k->size, p);

	__bch2_extent_ptr_to_bp(c, ca, btree_id, level, k, p, entry, bucket_pos, bp, sectors);
}

int bch2_get_next_backpointer(struct btree_trans *, struct bch_dev *ca, struct bpos, int,
			      struct bpos *, struct bch_backpointer *, unsigned);
struct bkey_s_c bch2_backpointer_get_key(struct btree_trans *, struct btree_iter *,
+5 −3
Original line number Diff line number Diff line
@@ -565,11 +565,14 @@ static int bch2_trigger_pointer(struct btree_trans *trans,
			s64 *sectors,
			enum btree_iter_update_trigger_flags flags)
{
	struct bch_fs *c = trans->c;
	bool insert = !(flags & BTREE_TRIGGER_overwrite);
	struct printbuf buf = PRINTBUF;
	int ret = 0;

	struct bch_fs *c = trans->c;
	u64 abs_sectors = ptr_disk_sectors(level ? btree_sectors(c) : k.k->size, p);
	*sectors = insert ? abs_sectors : -abs_sectors;

	struct bch_dev *ca = bch2_dev_tryget(c, p.ptr.dev);
	if (unlikely(!ca)) {
		if (insert && p.ptr.dev != BCH_SB_MEMBER_INVALID)
@@ -579,8 +582,7 @@ static int bch2_trigger_pointer(struct btree_trans *trans,

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

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