From 2cd0563461b68b895bd683e89ad70f3975e98e85 Mon Sep 17 00:00:00 2001
From: Brett Holman <bpholman5@gmail.com>
Date: Sun, 16 May 2021 21:53:55 -0600
Subject: [PATCH] bcachefs: made changes to support clang, fixed a couple bugs

fs/bcachefs/bset.c              edited prefetch macro to add clang support
fs/bcachefs/btree_iter.c        bugfix: initialize iter->real_pos in bch2_btree_iter_init for later use
fs/bcachefs/io.c                bugfix: eliminated undefined behavior (negative bitshift)
fs/bcachefs/buckets.c           bugfix: invert sign to handle 64bit abs()

Signed-off-by: Brett Holman <bpholman5@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
---
 fs/bcachefs/bset.c       | 2 +-
 fs/bcachefs/btree_iter.c | 1 +
 fs/bcachefs/buckets.c    | 4 +++-
 fs/bcachefs/io.c         | 2 +-
 4 files changed, 6 insertions(+), 3 deletions(-)

diff --git a/fs/bcachefs/bset.c b/fs/bcachefs/bset.c
index 8c038da3c1082..e569d9a9b906f 100644
--- a/fs/bcachefs/bset.c
+++ b/fs/bcachefs/bset.c
@@ -1181,7 +1181,7 @@ static struct bkey_packed *bset_search_write_set(const struct btree *b,
 
 static inline void prefetch_four_cachelines(void *p)
 {
-#ifdef CONFIG_X86_64
+#if (CONFIG_X86_64 && !defined(__clang__))
 	asm(".intel_syntax noprefix;"
 	    "prefetcht0 [%0 - 127 + 64 * 0];"
 	    "prefetcht0 [%0 - 127 + 64 * 1];"
diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c
index 8c343d5cec0c2..745f1ac4f538d 100644
--- a/fs/bcachefs/btree_iter.c
+++ b/fs/bcachefs/btree_iter.c
@@ -1898,6 +1898,7 @@ static inline void bch2_btree_iter_init(struct btree_trans *trans,
 	iter->trans			= trans;
 	iter->uptodate			= BTREE_ITER_NEED_TRAVERSE;
 	iter->btree_id			= btree_id;
+	iter->real_pos			= POS_MIN;
 	iter->level			= 0;
 	iter->min_depth			= 0;
 	iter->locks_want		= 0;
diff --git a/fs/bcachefs/buckets.c b/fs/bcachefs/buckets.c
index dad1c7d27bab5..a167e30e14121 100644
--- a/fs/bcachefs/buckets.c
+++ b/fs/bcachefs/buckets.c
@@ -1801,7 +1801,9 @@ static int bch2_trans_mark_reflink_p(struct btree_trans *trans,
 	unsigned front_frag, back_frag;
 	s64 ret = 0;
 
-	sectors = abs(sectors);
+	if (sectors < 0)
+		sectors = -sectors;
+
 	BUG_ON(offset + sectors > p.k->size);
 
 	front_frag = offset;
diff --git a/fs/bcachefs/io.c b/fs/bcachefs/io.c
index 2b2e118114bd1..9fc858a0a4962 100644
--- a/fs/bcachefs/io.c
+++ b/fs/bcachefs/io.c
@@ -121,7 +121,7 @@ void bch2_latency_acct(struct bch_dev *ca, u64 submit_time, int rw)
 		 * the time:
 		 */
 		if (abs((int) (old - io_latency)) < (old >> 1) &&
-		    now & ~(~0 << 5))
+		    now & ~(~0U << 5))
 			break;
 
 		new = ewma_add(old, io_latency, 5);
-- 
2.30.2