1 // SPDX-License-Identifier: GPL-2.0
3 * Assorted bcache debug code
5 * Copyright 2010, 2011 Kent Overstreet <kent.overstreet@gmail.com>
6 * Copyright 2012 Google, Inc.
14 #include <linux/console.h>
15 #include <linux/debugfs.h>
16 #include <linux/module.h>
17 #include <linux/random.h>
18 #include <linux/seq_file.h>
20 struct dentry
*bcache_debug
;
22 #ifdef CONFIG_BCACHE_DEBUG
24 #define for_each_written_bset(b, start, i) \
26 (void *) i < (void *) (start) + (KEY_SIZE(&b->key) << 9) &&\
27 i->seq == (start)->seq; \
28 i = (void *) i + set_blocks(i, block_bytes(b->c)) * \
31 void bch_btree_verify(struct btree
*b
)
33 struct btree
*v
= b
->c
->verify_data
;
34 struct bset
*ondisk
, *sorted
, *inmemory
;
37 if (!b
->c
->verify
|| !b
->c
->verify_ondisk
)
41 mutex_lock(&b
->c
->verify_lock
);
43 ondisk
= b
->c
->verify_ondisk
;
44 sorted
= b
->c
->verify_data
->keys
.set
->data
;
45 inmemory
= b
->keys
.set
->data
;
47 bkey_copy(&v
->key
, &b
->key
);
50 v
->keys
.ops
= b
->keys
.ops
;
52 bio
= bch_bbio_alloc(b
->c
);
53 bio_set_dev(bio
, PTR_CACHE(b
->c
, &b
->key
, 0)->bdev
);
54 bio
->bi_iter
.bi_sector
= PTR_OFFSET(&b
->key
, 0);
55 bio
->bi_iter
.bi_size
= KEY_SIZE(&v
->key
) << 9;
56 bio
->bi_opf
= REQ_OP_READ
| REQ_META
;
57 bch_bio_map(bio
, sorted
);
60 bch_bbio_free(bio
, b
->c
);
62 memcpy(ondisk
, sorted
, KEY_SIZE(&v
->key
) << 9);
64 bch_btree_node_read_done(v
);
65 sorted
= v
->keys
.set
->data
;
67 if (inmemory
->keys
!= sorted
->keys
||
68 memcmp(inmemory
->start
,
70 (void *) bset_bkey_last(inmemory
) - (void *) inmemory
->start
)) {
76 printk(KERN_ERR
"*** in memory:\n");
77 bch_dump_bset(&b
->keys
, inmemory
, 0);
79 printk(KERN_ERR
"*** read back in:\n");
80 bch_dump_bset(&v
->keys
, sorted
, 0);
82 for_each_written_bset(b
, ondisk
, i
) {
83 unsigned block
= ((void *) i
- (void *) ondisk
) /
86 printk(KERN_ERR
"*** on disk block %u:\n", block
);
87 bch_dump_bset(&b
->keys
, i
, block
);
90 printk(KERN_ERR
"*** block %zu not written\n",
91 ((void *) i
- (void *) ondisk
) / block_bytes(b
->c
));
93 for (j
= 0; j
< inmemory
->keys
; j
++)
94 if (inmemory
->d
[j
] != sorted
->d
[j
])
97 printk(KERN_ERR
"b->written %u\n", b
->written
);
100 panic("verify failed at %u\n", j
);
103 mutex_unlock(&b
->c
->verify_lock
);
107 void bch_data_verify(struct cached_dev
*dc
, struct bio
*bio
)
110 struct bio_vec bv
, cbv
;
111 struct bvec_iter iter
, citer
= { 0 };
113 check
= bio_clone_kmalloc(bio
, GFP_NOIO
);
116 check
->bi_opf
= REQ_OP_READ
;
118 if (bch_bio_alloc_pages(check
, GFP_NOIO
))
121 submit_bio_wait(check
);
123 citer
.bi_size
= UINT_MAX
;
124 bio_for_each_segment(bv
, bio
, iter
) {
125 void *p1
= kmap_atomic(bv
.bv_page
);
128 cbv
= bio_iter_iovec(check
, citer
);
129 p2
= page_address(cbv
.bv_page
);
131 cache_set_err_on(memcmp(p1
+ bv
.bv_offset
,
135 "verify failed at dev %s sector %llu",
136 dc
->backing_dev_name
,
137 (uint64_t) bio
->bi_iter
.bi_sector
);
140 bio_advance_iter(check
, &citer
, bv
.bv_len
);
143 bio_free_pages(check
);
150 #ifdef CONFIG_DEBUG_FS
152 /* XXX: cache set refcounting */
154 struct dump_iterator
{
161 static bool dump_pred(struct keybuf
*buf
, struct bkey
*k
)
166 static ssize_t
bch_dump_read(struct file
*file
, char __user
*buf
,
167 size_t size
, loff_t
*ppos
)
169 struct dump_iterator
*i
= file
->private_data
;
174 struct keybuf_key
*w
;
175 unsigned bytes
= min(i
->bytes
, size
);
177 int err
= copy_to_user(buf
, i
->buf
, bytes
);
185 memmove(i
->buf
, i
->buf
+ bytes
, i
->bytes
);
190 w
= bch_keybuf_next_rescan(i
->c
, &i
->keys
, &MAX_KEY
, dump_pred
);
194 bch_extent_to_text(kbuf
, sizeof(kbuf
), &w
->key
);
195 i
->bytes
= snprintf(i
->buf
, PAGE_SIZE
, "%s\n", kbuf
);
196 bch_keybuf_del(&i
->keys
, w
);
202 static int bch_dump_open(struct inode
*inode
, struct file
*file
)
204 struct cache_set
*c
= inode
->i_private
;
205 struct dump_iterator
*i
;
207 i
= kzalloc(sizeof(struct dump_iterator
), GFP_KERNEL
);
211 file
->private_data
= i
;
213 bch_keybuf_init(&i
->keys
);
214 i
->keys
.last_scanned
= KEY(0, 0, 0);
219 static int bch_dump_release(struct inode
*inode
, struct file
*file
)
221 kfree(file
->private_data
);
225 static const struct file_operations cache_set_debug_ops
= {
226 .owner
= THIS_MODULE
,
227 .open
= bch_dump_open
,
228 .read
= bch_dump_read
,
229 .release
= bch_dump_release
232 void bch_debug_init_cache_set(struct cache_set
*c
)
234 if (!IS_ERR_OR_NULL(bcache_debug
)) {
236 snprintf(name
, 50, "bcache-%pU", c
->sb
.set_uuid
);
238 c
->debug
= debugfs_create_file(name
, 0400, bcache_debug
, c
,
239 &cache_set_debug_ops
);
245 void bch_debug_exit(void)
247 if (!IS_ERR_OR_NULL(bcache_debug
))
248 debugfs_remove_recursive(bcache_debug
);
251 int __init
bch_debug_init(struct kobject
*kobj
)
253 if (!IS_ENABLED(CONFIG_DEBUG_FS
))
256 bcache_debug
= debugfs_create_dir("bcache", NULL
);
257 return IS_ERR_OR_NULL(bcache_debug
);