summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2019-08-22 13:20:38 -0400
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-22 17:08:26 -0400
commitdf5d4dae0b667f93616d6e47da09ad916dcb7102 (patch)
treeabf45721054c25b75aab9bae48c409299ad36315
parent6671a7089fdcdd8f25f6b4729fdc066f7c42edfd (diff)
downloadlinux-df5d4dae0b667f93616d6e47da09ad916dcb7102.tar.gz
linux-df5d4dae0b667f93616d6e47da09ad916dcb7102.tar.bz2
linux-df5d4dae0b667f93616d6e47da09ad916dcb7102.zip
bcachefs: Fixes for replicas tracking
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>
-rw-r--r--fs/bcachefs/buckets.c23
-rw-r--r--fs/bcachefs/replicas.c2
2 files changed, 10 insertions, 15 deletions
diff --git a/fs/bcachefs/buckets.c b/fs/bcachefs/buckets.c
index 625c6c5f7963..189c475c973a 100644
--- a/fs/bcachefs/buckets.c
+++ b/fs/bcachefs/buckets.c
@@ -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;
}
diff --git a/fs/bcachefs/replicas.c b/fs/bcachefs/replicas.c
index 4fb142f3d39c..64024ce01665 100644
--- a/fs/bcachefs/replicas.c
+++ b/fs/bcachefs/replicas.c
@@ -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;
}