From 2be79b428b33a87ec285ea7663844ab5a2bd4807 Mon Sep 17 00:00:00 2001 From: Kent Overstreet <kent.overstreet@gmail.com> Date: Fri, 11 Jun 2021 00:16:27 -0400 Subject: [PATCH] Update bcachefs sources to b00cf89c56 bcachefs: Allow shorter JSET_ENTRY_dev_usage entries --- .bcachefs_revision | 2 +- libbcachefs/btree_gc.c | 18 +++++++++------- libbcachefs/btree_iter.c | 1 + libbcachefs/btree_types.h | 6 +++++- libbcachefs/btree_update_leaf.c | 37 +++++++++++++++++++-------------- libbcachefs/extent_update.c | 35 ------------------------------- libbcachefs/extent_update.h | 4 ---- libbcachefs/fs.c | 6 +++--- libbcachefs/journal_io.c | 2 +- libbcachefs/recovery.c | 2 +- 10 files changed, 44 insertions(+), 69 deletions(-) diff --git a/.bcachefs_revision b/.bcachefs_revision index 193e4241..14415fb2 100644 --- a/.bcachefs_revision +++ b/.bcachefs_revision @@ -1 +1 @@ -69be0dae3162e1651a5d5fcce08562e6e2af971a +b00cf89c56077d5e91c134d066ba2b45bc3136d7 diff --git a/libbcachefs/btree_gc.c b/libbcachefs/btree_gc.c index 911196f0..8af6d321 100644 --- a/libbcachefs/btree_gc.c +++ b/libbcachefs/btree_gc.c @@ -321,6 +321,17 @@ again: } ret = btree_repair_node_start(c, b, prev, cur); + + if (ret == DROP_THIS_NODE) { + six_unlock_read(&cur->c.lock); + bch2_btree_node_evict(c, cur_k.k); + ret = bch2_journal_key_delete(c, b->c.btree_id, + b->c.level, cur_k.k->k.p); + if (ret) + goto err; + continue; + } + if (prev) six_unlock_read(&prev->c.lock); @@ -331,13 +342,6 @@ again: if (ret) goto err; goto again; - } else if (ret == DROP_THIS_NODE) { - bch2_btree_node_evict(c, cur_k.k); - ret = bch2_journal_key_delete(c, b->c.btree_id, - b->c.level, cur_k.k->k.p); - if (ret) - goto err; - continue; } else if (ret) break; diff --git a/libbcachefs/btree_iter.c b/libbcachefs/btree_iter.c index 38609422..64ceea45 100644 --- a/libbcachefs/btree_iter.c +++ b/libbcachefs/btree_iter.c @@ -2312,6 +2312,7 @@ void bch2_trans_reset(struct btree_trans *trans, unsigned flags) trans->iters_touched &= trans->iters_live; + trans->extra_journal_res = 0; trans->nr_updates = 0; trans->mem_top = 0; diff --git a/libbcachefs/btree_types.h b/libbcachefs/btree_types.h index b37096f7..982a3b1f 100644 --- a/libbcachefs/btree_types.h +++ b/libbcachefs/btree_types.h @@ -383,6 +383,11 @@ struct btree_trans { unsigned used_mempool:1; unsigned error:1; unsigned in_traverse_all:1; + /* + * For when bch2_trans_update notices we'll be splitting a compressed + * extent: + */ + unsigned extra_journal_res; u64 iters_linked; u64 iters_live; @@ -680,7 +685,6 @@ enum btree_insert_ret { BTREE_INSERT_OK, /* leaf node needs to be split */ BTREE_INSERT_BTREE_NODE_FULL, - BTREE_INSERT_ENOSPC, BTREE_INSERT_NEED_MARK_REPLICAS, BTREE_INSERT_NEED_JOURNAL_RES, BTREE_INSERT_NEED_JOURNAL_RECLAIM, diff --git a/libbcachefs/btree_update_leaf.c b/libbcachefs/btree_update_leaf.c index 482d583e..7939fbbb 100644 --- a/libbcachefs/btree_update_leaf.c +++ b/libbcachefs/btree_update_leaf.c @@ -696,10 +696,6 @@ int bch2_trans_commit_error(struct btree_trans *trans, ret = -EINTR; } break; - case BTREE_INSERT_ENOSPC: - BUG_ON(flags & BTREE_INSERT_NOFAIL); - ret = -ENOSPC; - break; case BTREE_INSERT_NEED_MARK_REPLICAS: bch2_trans_unlock(trans); @@ -805,7 +801,7 @@ static int extent_handle_overwrites(struct btree_trans *trans, struct bpos start = bkey_start_pos(&i->k->k); struct bkey_i *update; struct bkey_s_c k; - int ret = 0; + int ret = 0, compressed_sectors; iter = bch2_trans_get_iter(trans, i->btree_id, start, BTREE_ITER_INTENT| @@ -839,6 +835,16 @@ static int extent_handle_overwrites(struct btree_trans *trans, goto next; while (bkey_cmp(i->k->k.p, bkey_start_pos(k.k)) > 0) { + /* + * If we're going to be splitting a compressed extent, note it + * so that __bch2_trans_commit() can increase our disk + * reservation: + */ + if (bkey_cmp(bkey_start_pos(k.k), start) < 0 && + bkey_cmp(k.k->p, i->k->k.p) > 0 && + (compressed_sectors = bch2_bkey_sectors_compressed(k))) + trans->extra_journal_res += compressed_sectors; + if (bkey_cmp(bkey_start_pos(k.k), start) < 0) { update = bch2_trans_kmalloc(trans, bkey_bytes(k.k)); if ((ret = PTR_ERR_OR_ZERO(update))) @@ -976,6 +982,15 @@ int __bch2_trans_commit(struct btree_trans *trans) trans->journal_preres_u64s += u64s; trans->journal_u64s += u64s; } + + if (trans->extra_journal_res) { + ret = bch2_disk_reservation_add(trans->c, trans->disk_res, + trans->extra_journal_res, + (trans->flags & BTREE_INSERT_NOFAIL) + ? BCH_DISK_RESERVATION_NOFAIL : 0); + if (ret) + goto err; + } retry: memset(&trans->journal_res, 0, sizeof(trans->journal_res)); @@ -1029,22 +1044,12 @@ int bch2_trans_update(struct btree_trans *trans, struct btree_iter *iter, BUG_ON(trans->nr_updates >= BTREE_ITER_MAX); #ifdef CONFIG_BCACHEFS_DEBUG - BUG_ON(bkey_cmp(iter->pos, - is_extent ? bkey_start_pos(&k->k) : k->k.p)); - - trans_for_each_update(trans, i) { - BUG_ON(bkey_cmp(i->iter->pos, i->k->k.p)); - + trans_for_each_update(trans, i) BUG_ON(i != trans->updates && btree_insert_entry_cmp(i - 1, i) >= 0); - } #endif if (is_extent) { - ret = bch2_extent_can_insert(trans, n.iter, n.k); - if (ret) - return ret; - ret = extent_handle_overwrites(trans, &n); if (ret) return ret; diff --git a/libbcachefs/extent_update.c b/libbcachefs/extent_update.c index bb4b2b43..ef4aaf1c 100644 --- a/libbcachefs/extent_update.c +++ b/libbcachefs/extent_update.c @@ -173,38 +173,3 @@ int bch2_extent_is_atomic(struct bkey_i *k, struct btree_iter *iter) return !bkey_cmp(end, k->k.p); } - -enum btree_insert_ret -bch2_extent_can_insert(struct btree_trans *trans, - struct btree_iter *iter, - struct bkey_i *insert) -{ - struct bkey_s_c k; - int ret, sectors; - - k = bch2_btree_iter_peek_slot(iter); - ret = bkey_err(k); - if (ret) - return ret; - - /* Check if we're splitting a compressed extent: */ - - if (bkey_cmp(bkey_start_pos(&insert->k), bkey_start_pos(k.k)) > 0 && - bkey_cmp(insert->k.p, k.k->p) < 0 && - (sectors = bch2_bkey_sectors_compressed(k))) { - int flags = trans->flags & BTREE_INSERT_NOFAIL - ? BCH_DISK_RESERVATION_NOFAIL : 0; - - switch (bch2_disk_reservation_add(trans->c, trans->disk_res, - sectors, flags)) { - case 0: - break; - case -ENOSPC: - return BTREE_INSERT_ENOSPC; - default: - BUG(); - } - } - - return BTREE_INSERT_OK; -} diff --git a/libbcachefs/extent_update.h b/libbcachefs/extent_update.h index 38dc0846..2fa46029 100644 --- a/libbcachefs/extent_update.h +++ b/libbcachefs/extent_update.h @@ -9,8 +9,4 @@ int bch2_extent_atomic_end(struct btree_iter *, struct bkey_i *, int bch2_extent_trim_atomic(struct bkey_i *, struct btree_iter *); int bch2_extent_is_atomic(struct bkey_i *, struct btree_iter *); -enum btree_insert_ret -bch2_extent_can_insert(struct btree_trans *, struct btree_iter *, - struct bkey_i *); - #endif /* _BCACHEFS_EXTENT_UPDATE_H */ diff --git a/libbcachefs/fs.c b/libbcachefs/fs.c index a95358dd..07e1edcf 100644 --- a/libbcachefs/fs.c +++ b/libbcachefs/fs.c @@ -1322,9 +1322,6 @@ static char **split_devs(const char *_dev_name, unsigned *nr) char *dev_name = NULL, **devs = NULL, *s; size_t i, nr_devs = 0; - if (strlen(_dev_name) == 0) - return NULL; - dev_name = kstrdup(_dev_name, GFP_KERNEL); if (!dev_name) return NULL; @@ -1500,6 +1497,9 @@ static struct dentry *bch2_mount(struct file_system_type *fs_type, if (ret) return ERR_PTR(ret); + if (!dev_name || strlen(dev_name) == 0) + return ERR_PTR(-EINVAL); + devs = split_devs(dev_name, &nr_devs); if (!devs) return ERR_PTR(-ENOMEM); diff --git a/libbcachefs/journal_io.c b/libbcachefs/journal_io.c index 2da6839f..66a0e267 100644 --- a/libbcachefs/journal_io.c +++ b/libbcachefs/journal_io.c @@ -450,7 +450,7 @@ static int journal_entry_validate_dev_usage(struct bch_fs *c, struct jset_entry_dev_usage *u = container_of(entry, struct jset_entry_dev_usage, entry); unsigned bytes = jset_u64s(le16_to_cpu(entry->u64s)) * sizeof(u64); - unsigned expected = sizeof(*u) + sizeof(u->d[0]) * 7; /* Current value of BCH_DATA_NR */ + unsigned expected = sizeof(*u); unsigned dev; int ret = 0; diff --git a/libbcachefs/recovery.c b/libbcachefs/recovery.c index 9bd63488..f3241417 100644 --- a/libbcachefs/recovery.c +++ b/libbcachefs/recovery.c @@ -725,7 +725,7 @@ static int journal_replay_entry_early(struct bch_fs *c, ca->usage_base->buckets_ec = le64_to_cpu(u->buckets_ec); ca->usage_base->buckets_unavailable = le64_to_cpu(u->buckets_unavailable); - for (i = 0; i < nr_types; i++) { + for (i = 0; i < min_t(unsigned, nr_types, BCH_DATA_NR); i++) { ca->usage_base->d[i].buckets = le64_to_cpu(u->d[i].buckets); ca->usage_base->d[i].sectors = le64_to_cpu(u->d[i].sectors); ca->usage_base->d[i].fragmented = le64_to_cpu(u->d[i].fragmented);