Hi Coly and Mingzhe, Have you ever seen this dmesg notice before? It only printed two lines into dmesg: [Apr11 19:28] bcache: bch_extent_bad() stale dirty pointer, stale 1, key: 0:15956311168 len 24 -> [0:32419560 gen 88] dirty [ +0.014297] bcache: bch_extent_bad() stale dirty pointer, stale 1, key: 0:15956311168 len 24 -> [0:32419560 gen 88] dirty This doesn't look like its a major concern, after all just this is a pr_info, and the "stale" value of "1" is well below BUCKET_GC_GEN_MAX (96) so I'm not at risk of hitting btree_bug_on(). Is this something that should be addressed? Near extents.c:537: static bool bch_extent_bad(struct btree_keys *bk, const struct bkey *k) { struct btree *b = container_of(bk, struct btree, keys); unsigned int i, stale; char buf[80]; if (!KEY_PTRS(k) || bch_extent_invalid(bk, k)) return true; for (i = 0; i < KEY_PTRS(k); i++) if (!ptr_available(b->c, k, i)) return true; for (i = 0; i < KEY_PTRS(k); i++) { stale = ptr_stale(b->c, k, i); if (stale && KEY_DIRTY(k)) { bch_extent_to_text(buf, sizeof(buf), k); pr_info("stale dirty pointer, stale %u, key: %s\n", <<<<<<< stale, buf); } btree_bug_on(stale > BUCKET_GC_GEN_MAX, b, "key too stale: %i, need_gc %u", stale, b->c->need_gc); if (stale) return true; if (expensive_debug_checks(b->c) && bch_extent_bad_expensive(b, k, i)) return true; } return false; } -- Eric Wheeler