diff --git a/.bcachefs_revision b/.bcachefs_revision
index 74c86461..7cbba1f9 100644
--- a/.bcachefs_revision
+++ b/.bcachefs_revision
@@ -1 +1 @@
-1e6618c45d9feb5af8ca1cc103c4def722ba4c54
+202b20c48f6fa96de566d71b6e1a27e0de00d341
diff --git a/libbcachefs/alloc_background.c b/libbcachefs/alloc_background.c
index 4f208fab..c372385d 100644
--- a/libbcachefs/alloc_background.c
+++ b/libbcachefs/alloc_background.c
@@ -520,7 +520,7 @@ static int bch2_bucket_do_index(struct btree_trans *trans,
 		goto err;
 
 	if (ca->mi.freespace_initialized &&
-	    bch2_fs_inconsistent_on(old.k->type != old_type, c,
+	    bch2_trans_inconsistent_on(old.k->type != old_type, trans,
 			"incorrect key when %s %s btree (got %s should be %s)\n"
 			"  for %s",
 			set ? "setting" : "clearing",
@@ -545,7 +545,6 @@ int bch2_trans_mark_alloc(struct btree_trans *trans,
 {
 	struct bch_fs *c = trans->c;
 	struct bch_alloc_v4 old_a, *new_a;
-	u64 old_lru, new_lru;
 	int ret = 0;
 
 	/*
@@ -583,16 +582,21 @@ int bch2_trans_mark_alloc(struct btree_trans *trans,
 			return ret;
 	}
 
-	old_lru = alloc_lru_idx(old_a);
-	new_lru = alloc_lru_idx(*new_a);
+	if (new_a->data_type == BCH_DATA_cached &&
+	    !new_a->io_time[READ])
+		new_a->io_time[READ] = max_t(u64, 1, atomic64_read(&c->io_clock[READ].now));
+
+	if ((old_a.data_type == BCH_DATA_cached) !=
+	    (new_a->data_type == BCH_DATA_cached)) {
+		u64 old_lru = alloc_lru_idx(old_a);
+		u64 new_lru = alloc_lru_idx(*new_a);
 
-	if (old_lru != new_lru) {
 		ret = bch2_lru_change(trans, new->k.p.inode, new->k.p.offset,
 				      old_lru, &new_lru);
 		if (ret)
 			return ret;
 
-		if (new_lru && new_a->io_time[READ] != new_lru)
+		if (new_a->data_type == BCH_DATA_cached)
 			new_a->io_time[READ] = new_lru;
 	}
 
@@ -869,10 +873,10 @@ static int bch2_check_alloc_to_lru_ref(struct btree_trans *trans,
 		if (!a.io_time[READ])
 			a.io_time[READ] = atomic64_read(&c->io_clock[READ].now);
 
-		ret = bch2_lru_change(trans,
-				      alloc_k.k->p.inode,
-				      alloc_k.k->p.offset,
-				      0, &a.io_time[READ]);
+		ret = bch2_lru_set(trans,
+				   alloc_k.k->p.inode,
+				   alloc_k.k->p.offset,
+				   &a.io_time[READ]);
 		if (ret)
 			goto err;
 
@@ -950,7 +954,7 @@ static int bch2_clear_need_discard(struct btree_trans *trans, struct bpos pos,
 		goto write;
 	}
 
-	if (bch2_fs_inconsistent_on(a->v.journal_seq > c->journal.flushed_seq_ondisk, c,
+	if (bch2_trans_inconsistent_on(a->v.journal_seq > c->journal.flushed_seq_ondisk, trans,
 			"clearing need_discard but journal_seq %llu > flushed_seq %llu\n"
 			"%s",
 			a->v.journal_seq,
@@ -960,7 +964,7 @@ static int bch2_clear_need_discard(struct btree_trans *trans, struct bpos pos,
 		goto out;
 	}
 
-	if (bch2_fs_inconsistent_on(a->v.data_type != BCH_DATA_need_discard, c,
+	if (bch2_trans_inconsistent_on(a->v.data_type != BCH_DATA_need_discard, trans,
 			"bucket incorrectly set in need_discard btree\n"
 			"%s",
 			(bch2_bkey_val_to_text(&buf, c, k), buf.buf))) {
@@ -1089,8 +1093,8 @@ static int invalidate_one_bucket(struct btree_trans *trans, struct bch_dev *ca)
 	if (!k.k || k.k->p.inode != ca->dev_idx)
 		goto out;
 
-	if (bch2_fs_inconsistent_on(k.k->type != KEY_TYPE_lru, c,
-				    "non lru key in lru btree"))
+	if (bch2_trans_inconsistent_on(k.k->type != KEY_TYPE_lru, trans,
+				       "non lru key in lru btree"))
 		goto out;
 
 	idx	= k.k->p.offset;
@@ -1102,7 +1106,7 @@ static int invalidate_one_bucket(struct btree_trans *trans, struct bch_dev *ca)
 	if (ret)
 		goto out;
 
-	if (bch2_fs_inconsistent_on(idx != alloc_lru_idx(a->v), c,
+	if (bch2_trans_inconsistent_on(idx != alloc_lru_idx(a->v), trans,
 			"invalidating bucket with wrong lru idx (got %llu should be %llu",
 			idx, alloc_lru_idx(a->v)))
 		goto out;
diff --git a/libbcachefs/lru.c b/libbcachefs/lru.c
index ef4b4a9f..08437d4a 100644
--- a/libbcachefs/lru.c
+++ b/libbcachefs/lru.c
@@ -30,7 +30,7 @@ void bch2_lru_to_text(struct printbuf *out, struct bch_fs *c,
 	pr_buf(out, "idx %llu", le64_to_cpu(lru->idx));
 }
 
-static int lru_delete(struct btree_trans *trans, u64 id, u64 idx, u64 time)
+int bch2_lru_delete(struct btree_trans *trans, u64 id, u64 idx, u64 time)
 {
 	struct bch_fs *c = trans->c;
 	struct btree_iter iter;
@@ -73,7 +73,7 @@ err:
 	return ret;
 }
 
-static int lru_set(struct btree_trans *trans, u64 lru_id, u64 idx, u64 *time)
+int bch2_lru_set(struct btree_trans *trans, u64 lru_id, u64 idx, u64 *time)
 {
 	struct btree_iter iter;
 	struct bkey_s_c k;
@@ -120,8 +120,8 @@ int bch2_lru_change(struct btree_trans *trans, u64 id, u64 idx,
 	if (old_time == *new_time)
 		return 0;
 
-	return  lru_delete(trans, id, idx, old_time) ?:
-		lru_set(trans, id, idx, new_time);
+	return  bch2_lru_delete(trans, id, idx, old_time) ?:
+		bch2_lru_set(trans, id, idx, new_time);
 }
 
 static int bch2_check_lru_key(struct btree_trans *trans,
diff --git a/libbcachefs/lru.h b/libbcachefs/lru.h
index e8f50817..0a01836c 100644
--- a/libbcachefs/lru.h
+++ b/libbcachefs/lru.h
@@ -10,6 +10,8 @@ void bch2_lru_to_text(struct printbuf *, struct bch_fs *, struct bkey_s_c);
 	.val_to_text	= bch2_lru_to_text,	\
 }
 
+int bch2_lru_delete(struct btree_trans *, u64, u64, u64);
+int bch2_lru_set(struct btree_trans *, u64, u64, u64 *);
 int bch2_lru_change(struct btree_trans *, u64, u64, u64, u64 *);
 
 int bch2_check_lrus(struct bch_fs *, bool);