From 32aabbc4e547592f957de7d4b093986e55981085 Mon Sep 17 00:00:00 2001
From: Kent Overstreet <kent.overstreet@gmail.com>
Date: Sat, 2 Apr 2022 16:36:29 -0400
Subject: [PATCH] Update bcachefs sources to ab3b6e7dd6 bcachefs: Fix pr_buf()
 calls

---
 .bcachefs_revision              |  2 +-
 include/trace/events/bcachefs.h | 34 +++++++++++++++++++++++++++++++++
 libbcachefs/alloc_background.c  | 23 +++++++++++++++++++---
 libbcachefs/compress.c          |  2 --
 libbcachefs/opts.c              |  2 +-
 libbcachefs/util.h              |  2 +-
 6 files changed, 57 insertions(+), 8 deletions(-)

diff --git a/.bcachefs_revision b/.bcachefs_revision
index a64663bc..c72637c5 100644
--- a/.bcachefs_revision
+++ b/.bcachefs_revision
@@ -1 +1 @@
-5e392aed7aa06fd3476d1e5da1248f4d47867fc4
+ab3b6e7dd69c5cd5dfd96fd265ade6897720f671
diff --git a/include/trace/events/bcachefs.h b/include/trace/events/bcachefs.h
index bccad83d..f63a7c87 100644
--- a/include/trace/events/bcachefs.h
+++ b/include/trace/events/bcachefs.h
@@ -182,6 +182,40 @@ TRACE_EVENT(journal_reclaim_finish,
 		  __entry->nr_flushed)
 );
 
+/* allocator: */
+
+TRACE_EVENT(do_discards,
+	TP_PROTO(struct bch_fs *c, u64 seen, u64 open,
+		 u64 need_journal_commit, u64 discarded, int ret),
+	TP_ARGS(c, seen, open, need_journal_commit, discarded, ret),
+
+	TP_STRUCT__entry(
+		__field(dev_t,		dev			)
+		__field(u64,		seen			)
+		__field(u64,		open			)
+		__field(u64,		need_journal_commit	)
+		__field(u64,		discarded		)
+		__field(int,		ret			)
+	),
+
+	TP_fast_assign(
+		__entry->dev			= c->dev;
+		__entry->seen			= seen;
+		__entry->open			= open;
+		__entry->need_journal_commit	= need_journal_commit;
+		__entry->discarded		= discarded;
+		__entry->ret			= ret;
+	),
+
+	TP_printk("%d%d seen %llu open %llu need_journal_commit %llu discarded %llu ret %i",
+		  MAJOR(__entry->dev), MINOR(__entry->dev),
+		  __entry->seen,
+		  __entry->open,
+		  __entry->need_journal_commit,
+		  __entry->discarded,
+		  __entry->ret)
+);
+
 /* bset.c: */
 
 DEFINE_EVENT(bpos, bkey_pack_pos_fail,
diff --git a/libbcachefs/alloc_background.c b/libbcachefs/alloc_background.c
index 1188239a..e8a34ecc 100644
--- a/libbcachefs/alloc_background.c
+++ b/libbcachefs/alloc_background.c
@@ -886,7 +886,7 @@ static int bch2_clear_need_discard(struct btree_trans *trans, struct bpos pos,
 				     GFP_KERNEL, 0);
 		*discard_done = true;
 
-		ret = bch2_trans_relock(trans);
+		ret = bch2_trans_relock(trans) ? 0 : -EINTR;
 		if (ret)
 			goto out;
 	}
@@ -907,6 +907,7 @@ static void bch2_do_discards_work(struct work_struct *work)
 	struct btree_trans trans;
 	struct btree_iter iter;
 	struct bkey_s_c k;
+	u64 seen = 0, open = 0, need_journal_commit = 0, discarded = 0;
 	int ret;
 
 	bch2_trans_init(&trans, c, 0, 0);
@@ -929,11 +930,19 @@ static void bch2_do_discards_work(struct work_struct *work)
 			}
 		}
 
+		seen++;
+
+		if (bch2_bucket_is_open_safe(c, k.k->p.inode, k.k->p.offset)) {
+			open++;
+			continue;
+		}
+
 		if (bch2_bucket_needs_journal_commit(&c->buckets_waiting_for_journal,
 				c->journal.flushed_seq_ondisk,
-				k.k->p.inode, k.k->p.offset) ||
-		    bch2_bucket_is_open_safe(c, k.k->p.inode, k.k->p.offset))
+				k.k->p.inode, k.k->p.offset)) {
+			need_journal_commit++;
 			continue;
+		}
 
 		ret = __bch2_trans_do(&trans, NULL, NULL,
 				      BTREE_INSERT_USE_RESERVE|
@@ -941,6 +950,8 @@ static void bch2_do_discards_work(struct work_struct *work)
 				bch2_clear_need_discard(&trans, k.k->p, ca, &discard_done));
 		if (ret)
 			break;
+
+		discarded++;
 	}
 	bch2_trans_iter_exit(&trans, &iter);
 
@@ -948,7 +959,13 @@ static void bch2_do_discards_work(struct work_struct *work)
 		percpu_ref_put(&ca->io_ref);
 
 	bch2_trans_exit(&trans);
+
+	if (need_journal_commit * 2 > seen)
+		bch2_journal_flush_async(&c->journal, NULL);
+
 	percpu_ref_put(&c->writes);
+
+	trace_do_discards(c, seen, open, need_journal_commit, discarded, ret);
 }
 
 void bch2_do_discards(struct bch_fs *c)
diff --git a/libbcachefs/compress.c b/libbcachefs/compress.c
index 7d9ebcc9..f692f35a 100644
--- a/libbcachefs/compress.c
+++ b/libbcachefs/compress.c
@@ -199,8 +199,6 @@ static int __bio_uncompress(struct bch_fs *c, struct bio *src,
 		workspace = mempool_alloc(&c->decompress_workspace, GFP_NOIO);
 		ctx = zstd_init_dctx(workspace, zstd_dctx_workspace_bound());
 
-		src_len = le32_to_cpup(src_data.b);
-
 		ret = zstd_decompress_dctx(ctx,
 				dst_data,	dst_len,
 				src_data.b + 4, real_src_len);
diff --git a/libbcachefs/opts.c b/libbcachefs/opts.c
index 77fbb7d2..385451ef 100644
--- a/libbcachefs/opts.c
+++ b/libbcachefs/opts.c
@@ -324,7 +324,7 @@ void bch2_opt_to_text(struct printbuf *out,
 		if (flags & OPT_SHOW_FULL_LIST)
 			bch2_string_opt_to_text(out, opt->choices, v);
 		else
-			pr_buf(out, opt->choices[v]);
+			pr_buf(out, "%s", opt->choices[v]);
 		break;
 	case BCH_OPT_FN:
 		opt->to_text(out, c, sb, v);
diff --git a/libbcachefs/util.h b/libbcachefs/util.h
index 88869370..086d941f 100644
--- a/libbcachefs/util.h
+++ b/libbcachefs/util.h
@@ -386,7 +386,7 @@ static inline void pr_uuid(struct printbuf *out, u8 *uuid)
 	char uuid_str[40];
 
 	uuid_unparse_lower(uuid, uuid_str);
-	pr_buf(out, uuid_str);
+	pr_buf(out, "%s", uuid_str);
 }
 
 int bch2_strtoint_h(const char *, int *);