summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2019-08-22 12:18:05 -0400
committerKent Overstreet <kent.overstreet@gmail.com>2019-08-22 12:18:05 -0400
commit00d440d2f087d9435f4c2020a485252842f5b421 (patch)
treed2b9455e12dd88fe3671768dbcf5e68a67f337cc
parent0ad717bdaddbcdced6998cc60264946cea8c4fde (diff)
debug patch for github-59
-rw-r--r--fs/bcachefs/btree_update_leaf.c17
-rw-r--r--fs/bcachefs/buckets.c49
-rw-r--r--fs/bcachefs/buckets.h6
3 files changed, 53 insertions, 19 deletions
diff --git a/fs/bcachefs/btree_update_leaf.c b/fs/bcachefs/btree_update_leaf.c
index a22758ada929..67617fd98f1c 100644
--- a/fs/bcachefs/btree_update_leaf.c
+++ b/fs/bcachefs/btree_update_leaf.c
@@ -642,9 +642,20 @@ static inline int do_btree_insert_at(struct btree_trans *trans,
!update_triggers_transactional(trans, i))
bch2_mark_update(trans, i, fs_usage, mark_flags);
- if (fs_usage && trans->fs_usage_deltas)
- bch2_replicas_delta_list_apply(c, fs_usage,
- trans->fs_usage_deltas);
+ if (fs_usage && trans->fs_usage_deltas) {
+ if (bch2_replicas_delta_list_apply(c, fs_usage,
+ trans->fs_usage_deltas)) {
+ bch_err(c, "while doing update:");
+ trans_for_each_update_iter(trans, i) {
+ char buf[250];
+
+ bch2_bkey_val_to_text(&PBUF(buf), c,
+ bkey_i_to_s_c(i->k));
+ bch_err(c, " %s", buf);
+ }
+ BUG();
+ }
+ }
if (fs_usage)
bch2_trans_fs_usage_apply(trans, fs_usage);
diff --git a/fs/bcachefs/buckets.c b/fs/bcachefs/buckets.c
index 2bcf929a6d0d..145944239a49 100644
--- a/fs/bcachefs/buckets.c
+++ b/fs/bcachefs/buckets.c
@@ -513,14 +513,28 @@ void bch2_dev_usage_from_buckets(struct bch_fs *c)
_old; \
})
-static inline void update_replicas(struct bch_fs *c,
- struct bch_fs_usage *fs_usage,
- struct bch_replicas_entry *r,
- s64 sectors)
+static int update_replicas(struct bch_fs *c,
+ struct bch_fs_usage *fs_usage,
+ struct bch_replicas_entry *r,
+ s64 sectors)
{
int idx = bch2_replicas_entry_idx(c, r);
- BUG_ON(idx < 0);
+ if (idx < 0) {
+ char buf[100];
+
+ bch2_replicas_entry_to_text(&PBUF(buf), r);
+ bch_err(c, "replicas entry not marked: %s", buf);
+
+ bch_err(c, "replicas entries:");
+ for_each_cpu_replicas_entry(&c->replicas, r) {
+ bch2_replicas_entry_to_text(&PBUF(buf), r);
+ bch_err(c, " %s", buf);
+ }
+
+ return -1;
+ }
+
BUG_ON(!sectors);
switch (r->data_type) {
@@ -535,17 +549,19 @@ static inline void update_replicas(struct bch_fs *c,
break;
}
fs_usage->replicas[idx] += sectors;
+
+ return 0;
}
-static inline void update_cached_sectors(struct bch_fs *c,
- struct bch_fs_usage *fs_usage,
- unsigned dev, s64 sectors)
+static inline int update_cached_sectors(struct bch_fs *c,
+ struct bch_fs_usage *fs_usage,
+ unsigned dev, s64 sectors)
{
struct bch_replicas_padded r;
bch2_replicas_entry_cached(&r.e, dev);
- update_replicas(c, fs_usage, &r.e, sectors);
+ return update_replicas(c, fs_usage, &r.e, sectors);
}
static struct replicas_delta_list *
@@ -590,12 +606,13 @@ static inline void update_cached_sectors_list(struct btree_trans *trans,
update_replicas_list(trans, &r.e, sectors);
}
-void bch2_replicas_delta_list_apply(struct bch_fs *c,
+int bch2_replicas_delta_list_apply(struct bch_fs *c,
struct bch_fs_usage *fs_usage,
struct replicas_delta_list *r)
{
struct replicas_delta *d = r->d;
struct replicas_delta *top = (void *) r->d + r->used;
+ int ret = 0;
acc_u64s((u64 *) fs_usage,
(u64 *) &r->fs_usage, sizeof(*fs_usage) / sizeof(u64));
@@ -603,10 +620,14 @@ void bch2_replicas_delta_list_apply(struct bch_fs *c,
while (d != top) {
BUG_ON((void *) d > (void *) top);
- update_replicas(c, fs_usage, &d->r, d->delta);
+ ret = update_replicas(c, fs_usage, &d->r, d->delta);
+ if (ret)
+ break;
d = (void *) d + replicas_entry_bytes(&d->r) + 8;
}
+
+ return ret;
}
#define do_mark_fn(fn, c, pos, flags, ...) \
@@ -1001,7 +1022,8 @@ static int bch2_mark_stripe_ptr(struct bch_fs *c,
spin_unlock(&c->ec_stripes_heap_lock);
- update_replicas(c, fs_usage, &m->r.e, sectors);
+ if (update_replicas(c, fs_usage, &m->r.e, sectors))
+ BUG();
return 0;
}
@@ -1054,7 +1076,8 @@ 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);
+ if (update_replicas(c, fs_usage, &r.e, dirty_sectors))
+ BUG();
return 0;
}
diff --git a/fs/bcachefs/buckets.h b/fs/bcachefs/buckets.h
index 799bfb3c96d8..21f278f932a1 100644
--- a/fs/bcachefs/buckets.h
+++ b/fs/bcachefs/buckets.h
@@ -270,9 +270,9 @@ int bch2_mark_overwrite(struct btree_trans *, struct btree_iter *,
int bch2_mark_update(struct btree_trans *, struct btree_insert_entry *,
struct bch_fs_usage *, unsigned);
-void bch2_replicas_delta_list_apply(struct bch_fs *,
- struct bch_fs_usage *,
- struct replicas_delta_list *);
+int bch2_replicas_delta_list_apply(struct bch_fs *,
+ struct bch_fs_usage *,
+ struct replicas_delta_list *);
int bch2_trans_mark_key(struct btree_trans *, struct bkey_s_c,
unsigned, s64, unsigned);
int bch2_trans_mark_update(struct btree_trans *,