diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2019-08-22 12:18:05 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2019-08-22 12:18:05 -0400 |
commit | 00d440d2f087d9435f4c2020a485252842f5b421 (patch) | |
tree | d2b9455e12dd88fe3671768dbcf5e68a67f337cc | |
parent | 0ad717bdaddbcdced6998cc60264946cea8c4fde (diff) |
debug patch for github-59
-rw-r--r-- | fs/bcachefs/btree_update_leaf.c | 17 | ||||
-rw-r--r-- | fs/bcachefs/buckets.c | 49 | ||||
-rw-r--r-- | fs/bcachefs/buckets.h | 6 |
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 *, |