Of course checkpatch rightly complains: ERROR: lockdep_no_validate class is reserved for device->mutex. ...so this is only hack for debugging. Without this compiling as a module is not possible because the calls to __up_write() cause: ERROR: "call_rwsem_wake" [drivers/block/bcache/bcache.ko] undefined! ...because __up_write is an internal rwsem detail. lockdep_no_validate at least makes it explicit that lockdep support is a work-in-progress. Not-signed-off-by... need a better workaround --- drivers/block/bcache/btree.c | 18 ++++-------------- kernel/lockdep.c | 1 + 2 files changed, 5 insertions(+), 14 deletions(-) diff --git a/drivers/block/bcache/btree.c b/drivers/block/bcache/btree.c index 7e9975f..e2fc357 100644 --- a/drivers/block/bcache/btree.c +++ b/drivers/block/bcache/btree.c @@ -538,6 +538,7 @@ static struct btree *mca_bucket_alloc(struct cache_set *c, return NULL; init_rwsem(&b->lock); + lockdep_set_novalidate_class(&b->lock); INIT_LIST_HEAD(&b->list); INIT_DELAYED_WORK(&b->work, btree_write_work); b->c = c; @@ -1116,9 +1117,7 @@ static struct btree *btree_gc_alloc(struct btree *b, struct bkey *k, b->prio_blocked++; btree_free(n, op); - __up_write(&n->lock); - - rwsem_release(&b->lock.dep_map, 1, _THIS_IP_); + up_write(&n->lock); } return b; @@ -1218,7 +1217,7 @@ static void btree_gc_coalesce(struct btree *b, struct btree_op *op, } btree_free(r->b, op); - __up_write(&r->b->lock); + up_write(&r->b->lock); pr_debug("coalesced %u nodes", nodes); @@ -1244,7 +1243,7 @@ static int btree_gc_recurse(struct btree *b, struct btree_op *op, btree_write(r, true, NULL); } - __up_write(&r->lock); + up_write(&r->lock); } int ret = 0, stale; @@ -1260,15 +1259,6 @@ static int btree_gc_recurse(struct btree *b, struct btree_op *op, break; } - /* - * Fake out lockdep, because I'm a terrible person: it's just - * not possible to express our lock ordering to lockdep, because - * lockdep works at most in terms of a small fixed number of - * subclasses, and we're just iterating through all of them in a - * fixed order. - */ - rwsem_release(&r->b->lock.dep_map, 1, _THIS_IP_); - r->keys = 0; stale = btree_gc_mark(r->b, &r->keys, gc); diff --git a/kernel/lockdep.c b/kernel/lockdep.c index 8889f7d..d203b16 100644 --- a/kernel/lockdep.c +++ b/kernel/lockdep.c @@ -2997,6 +2997,7 @@ void lockdep_init_map(struct lockdep_map *lock, const char *name, EXPORT_SYMBOL_GPL(lockdep_init_map); struct lock_class_key __lockdep_no_validate__; +EXPORT_SYMBOL_GPL(__lockdep_no_validate__); /* * This gets called for every mutex_lock*()/spin_lock*() operation. -- To unsubscribe from this list: send the line "unsubscribe linux-raid" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html