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-bcache" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to