]> git.dujemihanovic.xyz Git - linux.git/commitdiff
bcachefs: bch2_trigger_ptr() calculates sectors even when no device
authorKent Overstreet <kent.overstreet@linux.dev>
Sun, 8 Sep 2024 01:51:46 +0000 (21:51 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sat, 21 Sep 2024 15:39:49 +0000 (11:39 -0400)
This is necessary for erasure coded pointers to devices that have been
removed.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/backpointers.h
fs/bcachefs/buckets.c

index 7daecadb764e3eb9afa2a3e6862ac063a156c21b..3b29fdf519dd9634e2f735bc14c6c473c308db67 100644 (file)
@@ -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 *,
index 0732ac8f682d1c6d32707c58ae315a99e78e5319..546cd01a72e36150d00fdfc28eb3853919e522bb 100644 (file)
@@ -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);