bcache: Rip out pkey()/pbtree()
Old gcc doesnt like the struct hack, and it is kind of ugly. So finish off the work to convert pr_debug() statements to tracepoints, and delete pkey()/pbtree(). Signed-off-by: Kent Overstreet <koverstreet@google.com>
This commit is contained in:
Родитель
c37511b863
Коммит
85b1492ee1
|
@ -78,6 +78,7 @@ struct bkey *bch_keylist_pop(struct keylist *l)
|
||||||
bool __bch_ptr_invalid(struct cache_set *c, int level, const struct bkey *k)
|
bool __bch_ptr_invalid(struct cache_set *c, int level, const struct bkey *k)
|
||||||
{
|
{
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
char buf[80];
|
||||||
|
|
||||||
if (level && (!KEY_PTRS(k) || !KEY_SIZE(k) || KEY_DIRTY(k)))
|
if (level && (!KEY_PTRS(k) || !KEY_SIZE(k) || KEY_DIRTY(k)))
|
||||||
goto bad;
|
goto bad;
|
||||||
|
@ -102,7 +103,8 @@ bool __bch_ptr_invalid(struct cache_set *c, int level, const struct bkey *k)
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
bad:
|
bad:
|
||||||
cache_bug(c, "spotted bad key %s: %s", pkey(k), bch_ptr_status(c, k));
|
bch_bkey_to_text(buf, sizeof(buf), k);
|
||||||
|
cache_bug(c, "spotted bad key %s: %s", buf, bch_ptr_status(c, k));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -162,10 +164,16 @@ bool bch_ptr_bad(struct btree *b, const struct bkey *k)
|
||||||
#ifdef CONFIG_BCACHE_EDEBUG
|
#ifdef CONFIG_BCACHE_EDEBUG
|
||||||
bug:
|
bug:
|
||||||
mutex_unlock(&b->c->bucket_lock);
|
mutex_unlock(&b->c->bucket_lock);
|
||||||
btree_bug(b,
|
|
||||||
|
{
|
||||||
|
char buf[80];
|
||||||
|
|
||||||
|
bch_bkey_to_text(buf, sizeof(buf), k);
|
||||||
|
btree_bug(b,
|
||||||
"inconsistent pointer %s: bucket %zu pin %i prio %i gen %i last_gc %i mark %llu gc_gen %i",
|
"inconsistent pointer %s: bucket %zu pin %i prio %i gen %i last_gc %i mark %llu gc_gen %i",
|
||||||
pkey(k), PTR_BUCKET_NR(b->c, k, i), atomic_read(&g->pin),
|
buf, PTR_BUCKET_NR(b->c, k, i), atomic_read(&g->pin),
|
||||||
g->prio, g->gen, g->last_gc, GC_MARK(g), g->gc_gen);
|
g->prio, g->gen, g->last_gc, GC_MARK(g), g->gc_gen);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
|
@ -1770,7 +1770,7 @@ static bool btree_insert_key(struct btree *b, struct btree_op *op,
|
||||||
{
|
{
|
||||||
struct bset *i = b->sets[b->nsets].data;
|
struct bset *i = b->sets[b->nsets].data;
|
||||||
struct bkey *m, *prev;
|
struct bkey *m, *prev;
|
||||||
const char *status = "insert";
|
unsigned status = BTREE_INSERT_STATUS_INSERT;
|
||||||
|
|
||||||
BUG_ON(bkey_cmp(k, &b->key) > 0);
|
BUG_ON(bkey_cmp(k, &b->key) > 0);
|
||||||
BUG_ON(b->level && !KEY_PTRS(k));
|
BUG_ON(b->level && !KEY_PTRS(k));
|
||||||
|
@ -1803,17 +1803,17 @@ static bool btree_insert_key(struct btree *b, struct btree_op *op,
|
||||||
goto insert;
|
goto insert;
|
||||||
|
|
||||||
/* prev is in the tree, if we merge we're done */
|
/* prev is in the tree, if we merge we're done */
|
||||||
status = "back merging";
|
status = BTREE_INSERT_STATUS_BACK_MERGE;
|
||||||
if (prev &&
|
if (prev &&
|
||||||
bch_bkey_try_merge(b, prev, k))
|
bch_bkey_try_merge(b, prev, k))
|
||||||
goto merged;
|
goto merged;
|
||||||
|
|
||||||
status = "overwrote front";
|
status = BTREE_INSERT_STATUS_OVERWROTE;
|
||||||
if (m != end(i) &&
|
if (m != end(i) &&
|
||||||
KEY_PTRS(m) == KEY_PTRS(k) && !KEY_SIZE(m))
|
KEY_PTRS(m) == KEY_PTRS(k) && !KEY_SIZE(m))
|
||||||
goto copy;
|
goto copy;
|
||||||
|
|
||||||
status = "front merge";
|
status = BTREE_INSERT_STATUS_FRONT_MERGE;
|
||||||
if (m != end(i) &&
|
if (m != end(i) &&
|
||||||
bch_bkey_try_merge(b, k, m))
|
bch_bkey_try_merge(b, k, m))
|
||||||
goto copy;
|
goto copy;
|
||||||
|
@ -1823,16 +1823,12 @@ static bool btree_insert_key(struct btree *b, struct btree_op *op,
|
||||||
insert: shift_keys(b, m, k);
|
insert: shift_keys(b, m, k);
|
||||||
copy: bkey_copy(m, k);
|
copy: bkey_copy(m, k);
|
||||||
merged:
|
merged:
|
||||||
bch_check_keys(b, "%s for %s at %s: %s", status,
|
bch_check_keys(b, "%u for %s", status, op_type(op));
|
||||||
op_type(op), pbtree(b), pkey(k));
|
|
||||||
bch_check_key_order_msg(b, i, "%s for %s at %s: %s", status,
|
|
||||||
op_type(op), pbtree(b), pkey(k));
|
|
||||||
|
|
||||||
if (b->level && !KEY_OFFSET(k))
|
if (b->level && !KEY_OFFSET(k))
|
||||||
btree_current_write(b)->prio_blocked++;
|
btree_current_write(b)->prio_blocked++;
|
||||||
|
|
||||||
pr_debug("%s for %s at %s: %s", status,
|
trace_bcache_btree_insert_key(b, k, op->type, status);
|
||||||
op_type(op), pbtree(b), pkey(k));
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -2234,9 +2230,6 @@ int bch_btree_search_recurse(struct btree *b, struct btree_op *op)
|
||||||
struct btree_iter iter;
|
struct btree_iter iter;
|
||||||
bch_btree_iter_init(b, &iter, &KEY(op->inode, bio->bi_sector, 0));
|
bch_btree_iter_init(b, &iter, &KEY(op->inode, bio->bi_sector, 0));
|
||||||
|
|
||||||
pr_debug("at %s searching for %u:%llu", pbtree(b), op->inode,
|
|
||||||
(uint64_t) bio->bi_sector);
|
|
||||||
|
|
||||||
do {
|
do {
|
||||||
k = bch_btree_iter_next_filter(&iter, b, bch_ptr_bad);
|
k = bch_btree_iter_next_filter(&iter, b, bch_ptr_bad);
|
||||||
if (!k) {
|
if (!k) {
|
||||||
|
@ -2302,8 +2295,6 @@ static int bch_btree_refill_keybuf(struct btree *b, struct btree_op *op,
|
||||||
if (buf->key_predicate(buf, k)) {
|
if (buf->key_predicate(buf, k)) {
|
||||||
struct keybuf_key *w;
|
struct keybuf_key *w;
|
||||||
|
|
||||||
pr_debug("%s", pkey(k));
|
|
||||||
|
|
||||||
spin_lock(&buf->lock);
|
spin_lock(&buf->lock);
|
||||||
|
|
||||||
w = array_alloc(&buf->freelist);
|
w = array_alloc(&buf->freelist);
|
||||||
|
|
|
@ -271,6 +271,13 @@ struct btree_op {
|
||||||
BKEY_PADDED(replace);
|
BKEY_PADDED(replace);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
BTREE_INSERT_STATUS_INSERT,
|
||||||
|
BTREE_INSERT_STATUS_BACK_MERGE,
|
||||||
|
BTREE_INSERT_STATUS_OVERWROTE,
|
||||||
|
BTREE_INSERT_STATUS_FRONT_MERGE,
|
||||||
|
};
|
||||||
|
|
||||||
void bch_btree_op_init_stack(struct btree_op *);
|
void bch_btree_op_init_stack(struct btree_op *);
|
||||||
|
|
||||||
static inline void rw_lock(bool w, struct btree *b, int level)
|
static inline void rw_lock(bool w, struct btree *b, int level)
|
||||||
|
|
|
@ -47,11 +47,10 @@ const char *bch_ptr_status(struct cache_set *c, const struct bkey *k)
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
struct keyprint_hack bch_pkey(const struct bkey *k)
|
int bch_bkey_to_text(char *buf, size_t size, const struct bkey *k)
|
||||||
{
|
{
|
||||||
unsigned i = 0;
|
unsigned i = 0;
|
||||||
struct keyprint_hack r;
|
char *out = buf, *end = buf + size;
|
||||||
char *out = r.s, *end = r.s + KEYHACK_SIZE;
|
|
||||||
|
|
||||||
#define p(...) (out += scnprintf(out, end - out, __VA_ARGS__))
|
#define p(...) (out += scnprintf(out, end - out, __VA_ARGS__))
|
||||||
|
|
||||||
|
@ -75,16 +74,14 @@ struct keyprint_hack bch_pkey(const struct bkey *k)
|
||||||
if (KEY_CSUM(k))
|
if (KEY_CSUM(k))
|
||||||
p(" cs%llu %llx", KEY_CSUM(k), k->ptr[1]);
|
p(" cs%llu %llx", KEY_CSUM(k), k->ptr[1]);
|
||||||
#undef p
|
#undef p
|
||||||
return r;
|
return out - buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct keyprint_hack bch_pbtree(const struct btree *b)
|
int bch_btree_to_text(char *buf, size_t size, const struct btree *b)
|
||||||
{
|
{
|
||||||
struct keyprint_hack r;
|
return scnprintf(buf, size, "%zu level %i/%i",
|
||||||
|
PTR_BUCKET_NR(b->c, &b->key, 0),
|
||||||
snprintf(r.s, 40, "%zu level %i/%i", PTR_BUCKET_NR(b->c, &b->key, 0),
|
b->level, b->c->root ? b->c->root->level : -1);
|
||||||
b->level, b->c->root ? b->c->root->level : -1);
|
|
||||||
return r;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(CONFIG_BCACHE_DEBUG) || defined(CONFIG_BCACHE_EDEBUG)
|
#if defined(CONFIG_BCACHE_DEBUG) || defined(CONFIG_BCACHE_EDEBUG)
|
||||||
|
@ -100,10 +97,12 @@ static void dump_bset(struct btree *b, struct bset *i)
|
||||||
{
|
{
|
||||||
struct bkey *k;
|
struct bkey *k;
|
||||||
unsigned j;
|
unsigned j;
|
||||||
|
char buf[80];
|
||||||
|
|
||||||
for (k = i->start; k < end(i); k = bkey_next(k)) {
|
for (k = i->start; k < end(i); k = bkey_next(k)) {
|
||||||
|
bch_bkey_to_text(buf, sizeof(buf), k);
|
||||||
printk(KERN_ERR "block %zu key %zi/%u: %s", index(i, b),
|
printk(KERN_ERR "block %zu key %zi/%u: %s", index(i, b),
|
||||||
(uint64_t *) k - i->d, i->keys, pkey(k));
|
(uint64_t *) k - i->d, i->keys, buf);
|
||||||
|
|
||||||
for (j = 0; j < KEY_PTRS(k); j++) {
|
for (j = 0; j < KEY_PTRS(k); j++) {
|
||||||
size_t n = PTR_BUCKET_NR(b->c, k, j);
|
size_t n = PTR_BUCKET_NR(b->c, k, j);
|
||||||
|
@ -252,6 +251,7 @@ static void vdump_bucket_and_panic(struct btree *b, const char *fmt,
|
||||||
va_list args)
|
va_list args)
|
||||||
{
|
{
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
char buf[80];
|
||||||
|
|
||||||
console_lock();
|
console_lock();
|
||||||
|
|
||||||
|
@ -262,7 +262,8 @@ static void vdump_bucket_and_panic(struct btree *b, const char *fmt,
|
||||||
|
|
||||||
console_unlock();
|
console_unlock();
|
||||||
|
|
||||||
panic("at %s\n", pbtree(b));
|
bch_btree_to_text(buf, sizeof(buf), b);
|
||||||
|
panic("at %s\n", buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
void bch_check_key_order_msg(struct btree *b, struct bset *i,
|
void bch_check_key_order_msg(struct btree *b, struct bset *i,
|
||||||
|
@ -337,6 +338,7 @@ static ssize_t bch_dump_read(struct file *file, char __user *buf,
|
||||||
{
|
{
|
||||||
struct dump_iterator *i = file->private_data;
|
struct dump_iterator *i = file->private_data;
|
||||||
ssize_t ret = 0;
|
ssize_t ret = 0;
|
||||||
|
char kbuf[80];
|
||||||
|
|
||||||
while (size) {
|
while (size) {
|
||||||
struct keybuf_key *w;
|
struct keybuf_key *w;
|
||||||
|
@ -359,7 +361,8 @@ static ssize_t bch_dump_read(struct file *file, char __user *buf,
|
||||||
if (!w)
|
if (!w)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
i->bytes = snprintf(i->buf, PAGE_SIZE, "%s\n", pkey(&w->key));
|
bch_bkey_to_text(kbuf, sizeof(kbuf), &w->key);
|
||||||
|
i->bytes = snprintf(i->buf, PAGE_SIZE, "%s\n", kbuf);
|
||||||
bch_keybuf_del(&i->keys, w);
|
bch_keybuf_del(&i->keys, w);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -526,10 +529,17 @@ static ssize_t btree_fuzz(struct kobject *k, struct kobj_attribute *a,
|
||||||
k < end(i);
|
k < end(i);
|
||||||
k = bkey_next(k), l = bkey_next(l))
|
k = bkey_next(k), l = bkey_next(l))
|
||||||
if (bkey_cmp(k, l) ||
|
if (bkey_cmp(k, l) ||
|
||||||
KEY_SIZE(k) != KEY_SIZE(l))
|
KEY_SIZE(k) != KEY_SIZE(l)) {
|
||||||
|
char buf1[80];
|
||||||
|
char buf2[80];
|
||||||
|
|
||||||
|
bch_bkey_to_text(buf1, sizeof(buf1), k);
|
||||||
|
bch_bkey_to_text(buf2, sizeof(buf2), l);
|
||||||
|
|
||||||
pr_err("key %zi differs: %s != %s",
|
pr_err("key %zi differs: %s != %s",
|
||||||
(uint64_t *) k - i->d,
|
(uint64_t *) k - i->d,
|
||||||
pkey(k), pkey(l));
|
buf1, buf2);
|
||||||
|
}
|
||||||
|
|
||||||
for (j = 0; j < 3; j++) {
|
for (j = 0; j < 3; j++) {
|
||||||
pr_err("**** Set %i ****", j);
|
pr_err("**** Set %i ****", j);
|
||||||
|
|
|
@ -3,15 +3,8 @@
|
||||||
|
|
||||||
/* Btree/bkey debug printing */
|
/* Btree/bkey debug printing */
|
||||||
|
|
||||||
#define KEYHACK_SIZE 80
|
int bch_bkey_to_text(char *buf, size_t size, const struct bkey *k);
|
||||||
struct keyprint_hack {
|
int bch_btree_to_text(char *buf, size_t size, const struct btree *b);
|
||||||
char s[KEYHACK_SIZE];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct keyprint_hack bch_pkey(const struct bkey *k);
|
|
||||||
struct keyprint_hack bch_pbtree(const struct btree *b);
|
|
||||||
#define pkey(k) (&bch_pkey(k).s[0])
|
|
||||||
#define pbtree(b) (&bch_pbtree(b).s[0])
|
|
||||||
|
|
||||||
#ifdef CONFIG_BCACHE_EDEBUG
|
#ifdef CONFIG_BCACHE_EDEBUG
|
||||||
|
|
||||||
|
|
|
@ -343,6 +343,7 @@ static void uuid_io(struct cache_set *c, unsigned long rw,
|
||||||
struct closure *cl = &c->uuid_write.cl;
|
struct closure *cl = &c->uuid_write.cl;
|
||||||
struct uuid_entry *u;
|
struct uuid_entry *u;
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
char buf[80];
|
||||||
|
|
||||||
BUG_ON(!parent);
|
BUG_ON(!parent);
|
||||||
closure_lock(&c->uuid_write, parent);
|
closure_lock(&c->uuid_write, parent);
|
||||||
|
@ -363,8 +364,8 @@ static void uuid_io(struct cache_set *c, unsigned long rw,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
pr_debug("%s UUIDs at %s", rw & REQ_WRITE ? "wrote" : "read",
|
bch_bkey_to_text(buf, sizeof(buf), k);
|
||||||
pkey(&c->uuid_bucket));
|
pr_debug("%s UUIDs at %s", rw & REQ_WRITE ? "wrote" : "read", buf);
|
||||||
|
|
||||||
for (u = c->uuids; u < c->uuids + c->nr_uuids; u++)
|
for (u = c->uuids; u < c->uuids + c->nr_uuids; u++)
|
||||||
if (!bch_is_zero(u->uuid, 16))
|
if (!bch_is_zero(u->uuid, 16))
|
||||||
|
|
|
@ -40,6 +40,8 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(bcache_gc_end);
|
||||||
EXPORT_TRACEPOINT_SYMBOL_GPL(bcache_gc_copy);
|
EXPORT_TRACEPOINT_SYMBOL_GPL(bcache_gc_copy);
|
||||||
EXPORT_TRACEPOINT_SYMBOL_GPL(bcache_gc_copy_collision);
|
EXPORT_TRACEPOINT_SYMBOL_GPL(bcache_gc_copy_collision);
|
||||||
|
|
||||||
|
EXPORT_TRACEPOINT_SYMBOL_GPL(bcache_btree_insert_key);
|
||||||
|
|
||||||
EXPORT_TRACEPOINT_SYMBOL_GPL(bcache_btree_node_split);
|
EXPORT_TRACEPOINT_SYMBOL_GPL(bcache_btree_node_split);
|
||||||
EXPORT_TRACEPOINT_SYMBOL_GPL(bcache_btree_node_compact);
|
EXPORT_TRACEPOINT_SYMBOL_GPL(bcache_btree_node_compact);
|
||||||
EXPORT_TRACEPOINT_SYMBOL_GPL(bcache_btree_set_root);
|
EXPORT_TRACEPOINT_SYMBOL_GPL(bcache_btree_set_root);
|
||||||
|
|
|
@ -305,6 +305,39 @@ DEFINE_EVENT(bkey, bcache_gc_copy_collision,
|
||||||
TP_ARGS(k)
|
TP_ARGS(k)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
TRACE_EVENT(bcache_btree_insert_key,
|
||||||
|
TP_PROTO(struct btree *b, struct bkey *k, unsigned op, unsigned status),
|
||||||
|
TP_ARGS(b, k, op, status),
|
||||||
|
|
||||||
|
TP_STRUCT__entry(
|
||||||
|
__field(u64, btree_node )
|
||||||
|
__field(u32, btree_level )
|
||||||
|
__field(u32, inode )
|
||||||
|
__field(u64, offset )
|
||||||
|
__field(u32, size )
|
||||||
|
__field(u8, dirty )
|
||||||
|
__field(u8, op )
|
||||||
|
__field(u8, status )
|
||||||
|
),
|
||||||
|
|
||||||
|
TP_fast_assign(
|
||||||
|
__entry->btree_node = PTR_BUCKET_NR(b->c, &b->key, 0);
|
||||||
|
__entry->btree_level = b->level;
|
||||||
|
__entry->inode = KEY_INODE(k);
|
||||||
|
__entry->offset = KEY_OFFSET(k);
|
||||||
|
__entry->size = KEY_SIZE(k);
|
||||||
|
__entry->dirty = KEY_DIRTY(k);
|
||||||
|
__entry->op = op;
|
||||||
|
__entry->status = status;
|
||||||
|
),
|
||||||
|
|
||||||
|
TP_printk("%u for %u at %llu(%u): %u:%llu len %u dirty %u",
|
||||||
|
__entry->status, __entry->op,
|
||||||
|
__entry->btree_node, __entry->btree_level,
|
||||||
|
__entry->inode, __entry->offset,
|
||||||
|
__entry->size, __entry->dirty)
|
||||||
|
);
|
||||||
|
|
||||||
DECLARE_EVENT_CLASS(btree_split,
|
DECLARE_EVENT_CLASS(btree_split,
|
||||||
TP_PROTO(struct btree *b, unsigned keys),
|
TP_PROTO(struct btree *b, unsigned keys),
|
||||||
TP_ARGS(b, keys),
|
TP_ARGS(b, keys),
|
||||||
|
|
Загрузка…
Ссылка в новой задаче