bcachefs: Fixes for replicas tracking
authorKent Overstreet <kent.overstreet@gmail.com>
Thu, 22 Aug 2019 17:20:38 +0000 (13:20 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:26 +0000 (17:08 -0400)
The continue statement in bch2_trans_mark_extent() was wrong - by
bailing out early, we'd be constructing the wrong replicas list to
update. Also, the assertion in update_replicas() was wrong - due to
rounding with compressed extents, it is possible for sectors to be 0
sometimes.

Also, change extent_to_replicas() in replicas.c to match the replicas
list we construct in buckets.c.

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

index 625c6c5f79639eedd75e9684f04ecca90e89420a..189c475c973a3e7ebfab1793008582cd9ac38888 100644 (file)
@@ -520,7 +520,6 @@ static inline void update_replicas(struct bch_fs *c,
        int idx = bch2_replicas_entry_idx(c, r);
 
        BUG_ON(idx < 0);
-       BUG_ON(!sectors);
 
        switch (r->data_type) {
        case BCH_DATA_BTREE:
@@ -569,8 +568,12 @@ static inline void update_replicas_list(struct btree_trans *trans,
 {
        struct replicas_delta_list *d;
        struct replicas_delta *n;
-       unsigned b = replicas_entry_bytes(r) + 8;
+       unsigned b;
+
+       if (!sectors)
+               return;
 
+       b = replicas_entry_bytes(r) + 8;
        d = replicas_deltas_realloc(trans, b);
 
        n = (void *) d->d + d->used;
@@ -1029,7 +1032,7 @@ static int bch2_mark_extent(struct bch_fs *c, struct bkey_s_c k,
                                        fs_usage, journal_seq, flags);
 
                if (p.ptr.cached) {
-                       if (disk_sectors && !stale)
+                       if (!stale)
                                update_cached_sectors(c, fs_usage, p.ptr.dev,
                                                      disk_sectors);
                } else if (!p.ec_nr) {
@@ -1048,8 +1051,7 @@ static int bch2_mark_extent(struct bch_fs *c, struct bkey_s_c k,
                }
        }
 
-       if (dirty_sectors)
-               update_replicas(c, fs_usage, &r.e, dirty_sectors);
+       update_replicas(c, fs_usage, &r.e, dirty_sectors);
 
        return 0;
 }
@@ -1561,12 +1563,6 @@ static int bch2_trans_mark_extent(struct btree_trans *trans,
                        ? sectors
                        : ptr_disk_sectors_delta(p, offset, sectors, flags);
 
-               /*
-                * can happen due to rounding with compressed extents:
-                */
-               if (!disk_sectors)
-                       continue;
-
                ret = bch2_trans_mark_pointer(trans, p, disk_sectors,
                                              data_type);
                if (ret < 0)
@@ -1575,7 +1571,7 @@ static int bch2_trans_mark_extent(struct btree_trans *trans,
                stale = ret > 0;
 
                if (p.ptr.cached) {
-                       if (disk_sectors && !stale)
+                       if (!stale)
                                update_cached_sectors_list(trans, p.ptr.dev,
                                                           disk_sectors);
                } else if (!p.ec_nr) {
@@ -1593,8 +1589,7 @@ static int bch2_trans_mark_extent(struct btree_trans *trans,
                }
        }
 
-       if (dirty_sectors)
-               update_replicas_list(trans, &r.e, dirty_sectors);
+       update_replicas_list(trans, &r.e, dirty_sectors);
 
        return 0;
 }
index 4fb142f3d39c9af1f90037e17c7bf876669dacd5..64024ce016655146d7aaf171ac34d84216512364 100644 (file)
@@ -80,7 +80,7 @@ static void extent_to_replicas(struct bkey_s_c k,
                        continue;
 
                if (p.ec_nr) {
-                       r->nr_devs = 0;
+                       r->nr_required = 0;
                        break;
                }