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);