aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md/bcache
diff options
context:
space:
mode:
authorKent Overstreet <koverstreet@google.com>2013-05-14 23:33:16 -0400
committerKent Overstreet <koverstreet@google.com>2013-06-26 20:09:15 -0400
commit85b1492ee113486d871de7676a61f506a43ca475 (patch)
treeaac166ad206a99d2e3c573f7f1792bc765a2cdd4 /drivers/md/bcache
parentc37511b863f36c1cc6e18440717fd4cc0e881b8a (diff)
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>
Diffstat (limited to 'drivers/md/bcache')
-rw-r--r--drivers/md/bcache/bset.c16
-rw-r--r--drivers/md/bcache/btree.c21
-rw-r--r--drivers/md/bcache/btree.h7
-rw-r--r--drivers/md/bcache/debug.c40
-rw-r--r--drivers/md/bcache/debug.h11
-rw-r--r--drivers/md/bcache/super.c5
-rw-r--r--drivers/md/bcache/trace.c2
7 files changed, 57 insertions, 45 deletions
diff --git a/drivers/md/bcache/bset.c b/drivers/md/bcache/bset.c
index cb4578a327b9..e9399ed7f688 100644
--- a/drivers/md/bcache/bset.c
+++ b/drivers/md/bcache/bset.c
@@ -78,6 +78,7 @@ struct bkey *bch_keylist_pop(struct keylist *l)
78bool __bch_ptr_invalid(struct cache_set *c, int level, const struct bkey *k) 78bool __bch_ptr_invalid(struct cache_set *c, int level, const struct bkey *k)
79{ 79{
80 unsigned i; 80 unsigned i;
81 char buf[80];
81 82
82 if (level && (!KEY_PTRS(k) || !KEY_SIZE(k) || KEY_DIRTY(k))) 83 if (level && (!KEY_PTRS(k) || !KEY_SIZE(k) || KEY_DIRTY(k)))
83 goto bad; 84 goto bad;
@@ -102,7 +103,8 @@ bool __bch_ptr_invalid(struct cache_set *c, int level, const struct bkey *k)
102 103
103 return false; 104 return false;
104bad: 105bad:
105 cache_bug(c, "spotted bad key %s: %s", pkey(k), bch_ptr_status(c, k)); 106 bch_bkey_to_text(buf, sizeof(buf), k);
107 cache_bug(c, "spotted bad key %s: %s", buf, bch_ptr_status(c, k));
106 return true; 108 return true;
107} 109}
108 110
@@ -162,10 +164,16 @@ bool bch_ptr_bad(struct btree *b, const struct bkey *k)
162#ifdef CONFIG_BCACHE_EDEBUG 164#ifdef CONFIG_BCACHE_EDEBUG
163bug: 165bug:
164 mutex_unlock(&b->c->bucket_lock); 166 mutex_unlock(&b->c->bucket_lock);
165 btree_bug(b, 167
168 {
169 char buf[80];
170
171 bch_bkey_to_text(buf, sizeof(buf), k);
172 btree_bug(b,
166"inconsistent pointer %s: bucket %zu pin %i prio %i gen %i last_gc %i mark %llu gc_gen %i", 173"inconsistent pointer %s: bucket %zu pin %i prio %i gen %i last_gc %i mark %llu gc_gen %i",
167 pkey(k), PTR_BUCKET_NR(b->c, k, i), atomic_read(&g->pin), 174 buf, PTR_BUCKET_NR(b->c, k, i), atomic_read(&g->pin),
168 g->prio, g->gen, g->last_gc, GC_MARK(g), g->gc_gen); 175 g->prio, g->gen, g->last_gc, GC_MARK(g), g->gc_gen);
176 }
169 return true; 177 return true;
170#endif 178#endif
171} 179}
diff --git a/drivers/md/bcache/btree.c b/drivers/md/bcache/btree.c
index 218d486259a3..53a0f4ef4e32 100644
--- a/drivers/md/bcache/btree.c
+++ b/drivers/md/bcache/btree.c
@@ -1770,7 +1770,7 @@ static bool btree_insert_key(struct btree *b, struct btree_op *op,
1770{ 1770{
1771 struct bset *i = b->sets[b->nsets].data; 1771 struct bset *i = b->sets[b->nsets].data;
1772 struct bkey *m, *prev; 1772 struct bkey *m, *prev;
1773 const char *status = "insert"; 1773 unsigned status = BTREE_INSERT_STATUS_INSERT;
1774 1774
1775 BUG_ON(bkey_cmp(k, &b->key) > 0); 1775 BUG_ON(bkey_cmp(k, &b->key) > 0);
1776 BUG_ON(b->level && !KEY_PTRS(k)); 1776 BUG_ON(b->level && !KEY_PTRS(k));
@@ -1803,17 +1803,17 @@ static bool btree_insert_key(struct btree *b, struct btree_op *op,
1803 goto insert; 1803 goto insert;
1804 1804
1805 /* prev is in the tree, if we merge we're done */ 1805 /* prev is in the tree, if we merge we're done */
1806 status = "back merging"; 1806 status = BTREE_INSERT_STATUS_BACK_MERGE;
1807 if (prev && 1807 if (prev &&
1808 bch_bkey_try_merge(b, prev, k)) 1808 bch_bkey_try_merge(b, prev, k))
1809 goto merged; 1809 goto merged;
1810 1810
1811 status = "overwrote front"; 1811 status = BTREE_INSERT_STATUS_OVERWROTE;
1812 if (m != end(i) && 1812 if (m != end(i) &&
1813 KEY_PTRS(m) == KEY_PTRS(k) && !KEY_SIZE(m)) 1813 KEY_PTRS(m) == KEY_PTRS(k) && !KEY_SIZE(m))
1814 goto copy; 1814 goto copy;
1815 1815
1816 status = "front merge"; 1816 status = BTREE_INSERT_STATUS_FRONT_MERGE;
1817 if (m != end(i) && 1817 if (m != end(i) &&
1818 bch_bkey_try_merge(b, k, m)) 1818 bch_bkey_try_merge(b, k, m))
1819 goto copy; 1819 goto copy;
@@ -1823,16 +1823,12 @@ static bool btree_insert_key(struct btree *b, struct btree_op *op,
1823insert: shift_keys(b, m, k); 1823insert: shift_keys(b, m, k);
1824copy: bkey_copy(m, k); 1824copy: bkey_copy(m, k);
1825merged: 1825merged:
1826 bch_check_keys(b, "%s for %s at %s: %s", status, 1826 bch_check_keys(b, "%u for %s", status, op_type(op));
1827 op_type(op), pbtree(b), pkey(k));
1828 bch_check_key_order_msg(b, i, "%s for %s at %s: %s", status,
1829 op_type(op), pbtree(b), pkey(k));
1830 1827
1831 if (b->level && !KEY_OFFSET(k)) 1828 if (b->level && !KEY_OFFSET(k))
1832 btree_current_write(b)->prio_blocked++; 1829 btree_current_write(b)->prio_blocked++;
1833 1830
1834 pr_debug("%s for %s at %s: %s", status, 1831 trace_bcache_btree_insert_key(b, k, op->type, status);
1835 op_type(op), pbtree(b), pkey(k));
1836 1832
1837 return true; 1833 return true;
1838} 1834}
@@ -2234,9 +2230,6 @@ int bch_btree_search_recurse(struct btree *b, struct btree_op *op)
2234 struct btree_iter iter; 2230 struct btree_iter iter;
2235 bch_btree_iter_init(b, &iter, &KEY(op->inode, bio->bi_sector, 0)); 2231 bch_btree_iter_init(b, &iter, &KEY(op->inode, bio->bi_sector, 0));
2236 2232
2237 pr_debug("at %s searching for %u:%llu", pbtree(b), op->inode,
2238 (uint64_t) bio->bi_sector);
2239
2240 do { 2233 do {
2241 k = bch_btree_iter_next_filter(&iter, b, bch_ptr_bad); 2234 k = bch_btree_iter_next_filter(&iter, b, bch_ptr_bad);
2242 if (!k) { 2235 if (!k) {
@@ -2302,8 +2295,6 @@ static int bch_btree_refill_keybuf(struct btree *b, struct btree_op *op,
2302 if (buf->key_predicate(buf, k)) { 2295 if (buf->key_predicate(buf, k)) {
2303 struct keybuf_key *w; 2296 struct keybuf_key *w;
2304 2297
2305 pr_debug("%s", pkey(k));
2306
2307 spin_lock(&buf->lock); 2298 spin_lock(&buf->lock);
2308 2299
2309 w = array_alloc(&buf->freelist); 2300 w = array_alloc(&buf->freelist);
diff --git a/drivers/md/bcache/btree.h b/drivers/md/bcache/btree.h
index 809bd77847a2..2b016b93cad4 100644
--- a/drivers/md/bcache/btree.h
+++ b/drivers/md/bcache/btree.h
@@ -271,6 +271,13 @@ struct btree_op {
271 BKEY_PADDED(replace); 271 BKEY_PADDED(replace);
272}; 272};
273 273
274enum {
275 BTREE_INSERT_STATUS_INSERT,
276 BTREE_INSERT_STATUS_BACK_MERGE,
277 BTREE_INSERT_STATUS_OVERWROTE,
278 BTREE_INSERT_STATUS_FRONT_MERGE,
279};
280
274void bch_btree_op_init_stack(struct btree_op *); 281void bch_btree_op_init_stack(struct btree_op *);
275 282
276static inline void rw_lock(bool w, struct btree *b, int level) 283static inline void rw_lock(bool w, struct btree *b, int level)
diff --git a/drivers/md/bcache/debug.c b/drivers/md/bcache/debug.c
index ae6096c6845d..82e3a07771ec 100644
--- a/drivers/md/bcache/debug.c
+++ b/drivers/md/bcache/debug.c
@@ -47,11 +47,10 @@ const char *bch_ptr_status(struct cache_set *c, const struct bkey *k)
47 return ""; 47 return "";
48} 48}
49 49
50struct keyprint_hack bch_pkey(const struct bkey *k) 50int bch_bkey_to_text(char *buf, size_t size, const struct bkey *k)
51{ 51{
52 unsigned i = 0; 52 unsigned i = 0;
53 struct keyprint_hack r; 53 char *out = buf, *end = buf + size;
54 char *out = r.s, *end = r.s + KEYHACK_SIZE;
55 54
56#define p(...) (out += scnprintf(out, end - out, __VA_ARGS__)) 55#define p(...) (out += scnprintf(out, end - out, __VA_ARGS__))
57 56
@@ -75,16 +74,14 @@ struct keyprint_hack bch_pkey(const struct bkey *k)
75 if (KEY_CSUM(k)) 74 if (KEY_CSUM(k))
76 p(" cs%llu %llx", KEY_CSUM(k), k->ptr[1]); 75 p(" cs%llu %llx", KEY_CSUM(k), k->ptr[1]);
77#undef p 76#undef p
78 return r; 77 return out - buf;
79} 78}
80 79
81struct keyprint_hack bch_pbtree(const struct btree *b) 80int bch_btree_to_text(char *buf, size_t size, const struct btree *b)
82{ 81{
83 struct keyprint_hack r; 82 return scnprintf(buf, size, "%zu level %i/%i",
84 83 PTR_BUCKET_NR(b->c, &b->key, 0),
85 snprintf(r.s, 40, "%zu level %i/%i", PTR_BUCKET_NR(b->c, &b->key, 0), 84 b->level, b->c->root ? b->c->root->level : -1);
86 b->level, b->c->root ? b->c->root->level : -1);
87 return r;
88} 85}
89 86
90#if defined(CONFIG_BCACHE_DEBUG) || defined(CONFIG_BCACHE_EDEBUG) 87#if defined(CONFIG_BCACHE_DEBUG) || defined(CONFIG_BCACHE_EDEBUG)
@@ -100,10 +97,12 @@ static void dump_bset(struct btree *b, struct bset *i)
100{ 97{
101 struct bkey *k; 98 struct bkey *k;
102 unsigned j; 99 unsigned j;
100 char buf[80];
103 101
104 for (k = i->start; k < end(i); k = bkey_next(k)) { 102 for (k = i->start; k < end(i); k = bkey_next(k)) {
103 bch_bkey_to_text(buf, sizeof(buf), k);
105 printk(KERN_ERR "block %zu key %zi/%u: %s", index(i, b), 104 printk(KERN_ERR "block %zu key %zi/%u: %s", index(i, b),
106 (uint64_t *) k - i->d, i->keys, pkey(k)); 105 (uint64_t *) k - i->d, i->keys, buf);
107 106
108 for (j = 0; j < KEY_PTRS(k); j++) { 107 for (j = 0; j < KEY_PTRS(k); j++) {
109 size_t n = PTR_BUCKET_NR(b->c, k, j); 108 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,
252 va_list args) 251 va_list args)
253{ 252{
254 unsigned i; 253 unsigned i;
254 char buf[80];
255 255
256 console_lock(); 256 console_lock();
257 257
@@ -262,7 +262,8 @@ static void vdump_bucket_and_panic(struct btree *b, const char *fmt,
262 262
263 console_unlock(); 263 console_unlock();
264 264
265 panic("at %s\n", pbtree(b)); 265 bch_btree_to_text(buf, sizeof(buf), b);
266 panic("at %s\n", buf);
266} 267}
267 268
268void bch_check_key_order_msg(struct btree *b, struct bset *i, 269void 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,
337{ 338{
338 struct dump_iterator *i = file->private_data; 339 struct dump_iterator *i = file->private_data;
339 ssize_t ret = 0; 340 ssize_t ret = 0;
341 char kbuf[80];
340 342
341 while (size) { 343 while (size) {
342 struct keybuf_key *w; 344 struct keybuf_key *w;
@@ -359,7 +361,8 @@ static ssize_t bch_dump_read(struct file *file, char __user *buf,
359 if (!w) 361 if (!w)
360 break; 362 break;
361 363
362 i->bytes = snprintf(i->buf, PAGE_SIZE, "%s\n", pkey(&w->key)); 364 bch_bkey_to_text(kbuf, sizeof(kbuf), &w->key);
365 i->bytes = snprintf(i->buf, PAGE_SIZE, "%s\n", kbuf);
363 bch_keybuf_del(&i->keys, w); 366 bch_keybuf_del(&i->keys, w);
364 } 367 }
365 368
@@ -526,10 +529,17 @@ static ssize_t btree_fuzz(struct kobject *k, struct kobj_attribute *a,
526 k < end(i); 529 k < end(i);
527 k = bkey_next(k), l = bkey_next(l)) 530 k = bkey_next(k), l = bkey_next(l))
528 if (bkey_cmp(k, l) || 531 if (bkey_cmp(k, l) ||
529 KEY_SIZE(k) != KEY_SIZE(l)) 532 KEY_SIZE(k) != KEY_SIZE(l)) {
533 char buf1[80];
534 char buf2[80];
535
536 bch_bkey_to_text(buf1, sizeof(buf1), k);
537 bch_bkey_to_text(buf2, sizeof(buf2), l);
538
530 pr_err("key %zi differs: %s != %s", 539 pr_err("key %zi differs: %s != %s",
531 (uint64_t *) k - i->d, 540 (uint64_t *) k - i->d,
532 pkey(k), pkey(l)); 541 buf1, buf2);
542 }
533 543
534 for (j = 0; j < 3; j++) { 544 for (j = 0; j < 3; j++) {
535 pr_err("**** Set %i ****", j); 545 pr_err("**** Set %i ****", j);
diff --git a/drivers/md/bcache/debug.h b/drivers/md/bcache/debug.h
index f9378a218148..1c39b5a2489b 100644
--- a/drivers/md/bcache/debug.h
+++ b/drivers/md/bcache/debug.h
@@ -3,15 +3,8 @@
3 3
4/* Btree/bkey debug printing */ 4/* Btree/bkey debug printing */
5 5
6#define KEYHACK_SIZE 80 6int bch_bkey_to_text(char *buf, size_t size, const struct bkey *k);
7struct keyprint_hack { 7int bch_btree_to_text(char *buf, size_t size, const struct btree *b);
8 char s[KEYHACK_SIZE];
9};
10
11struct keyprint_hack bch_pkey(const struct bkey *k);
12struct keyprint_hack bch_pbtree(const struct btree *b);
13#define pkey(k) (&bch_pkey(k).s[0])
14#define pbtree(b) (&bch_pbtree(b).s[0])
15 8
16#ifdef CONFIG_BCACHE_EDEBUG 9#ifdef CONFIG_BCACHE_EDEBUG
17 10
diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c
index 47bc13745068..f24c2e0cbb1c 100644
--- a/drivers/md/bcache/super.c
+++ b/drivers/md/bcache/super.c
@@ -343,6 +343,7 @@ static void uuid_io(struct cache_set *c, unsigned long rw,
343 struct closure *cl = &c->uuid_write.cl; 343 struct closure *cl = &c->uuid_write.cl;
344 struct uuid_entry *u; 344 struct uuid_entry *u;
345 unsigned i; 345 unsigned i;
346 char buf[80];
346 347
347 BUG_ON(!parent); 348 BUG_ON(!parent);
348 closure_lock(&c->uuid_write, parent); 349 closure_lock(&c->uuid_write, parent);
@@ -363,8 +364,8 @@ static void uuid_io(struct cache_set *c, unsigned long rw,
363 break; 364 break;
364 } 365 }
365 366
366 pr_debug("%s UUIDs at %s", rw & REQ_WRITE ? "wrote" : "read", 367 bch_bkey_to_text(buf, sizeof(buf), k);
367 pkey(&c->uuid_bucket)); 368 pr_debug("%s UUIDs at %s", rw & REQ_WRITE ? "wrote" : "read", buf);
368 369
369 for (u = c->uuids; u < c->uuids + c->nr_uuids; u++) 370 for (u = c->uuids; u < c->uuids + c->nr_uuids; u++)
370 if (!bch_is_zero(u->uuid, 16)) 371 if (!bch_is_zero(u->uuid, 16))
diff --git a/drivers/md/bcache/trace.c b/drivers/md/bcache/trace.c
index 7f4f38aa16ae..f7b6c197f90f 100644
--- a/drivers/md/bcache/trace.c
+++ b/drivers/md/bcache/trace.c
@@ -40,6 +40,8 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(bcache_gc_end);
40EXPORT_TRACEPOINT_SYMBOL_GPL(bcache_gc_copy); 40EXPORT_TRACEPOINT_SYMBOL_GPL(bcache_gc_copy);
41EXPORT_TRACEPOINT_SYMBOL_GPL(bcache_gc_copy_collision); 41EXPORT_TRACEPOINT_SYMBOL_GPL(bcache_gc_copy_collision);
42 42
43EXPORT_TRACEPOINT_SYMBOL_GPL(bcache_btree_insert_key);
44
43EXPORT_TRACEPOINT_SYMBOL_GPL(bcache_btree_node_split); 45EXPORT_TRACEPOINT_SYMBOL_GPL(bcache_btree_node_split);
44EXPORT_TRACEPOINT_SYMBOL_GPL(bcache_btree_node_compact); 46EXPORT_TRACEPOINT_SYMBOL_GPL(bcache_btree_node_compact);
45EXPORT_TRACEPOINT_SYMBOL_GPL(bcache_btree_set_root); 47EXPORT_TRACEPOINT_SYMBOL_GPL(bcache_btree_set_root);