Add lock context annotations and enable lock context analysis. Signed-off-by: Bart Van Assche --- drivers/block/rbd.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index 90c13de47cff..13077d85e8c8 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c @@ -4185,6 +4185,7 @@ static void rbd_acquire_lock(struct work_struct *work) } static bool rbd_quiesce_lock(struct rbd_device *rbd_dev) + __must_hold(&rbd_dev->lock_rwsem) { dout("%s rbd_dev %p\n", __func__, rbd_dev); lockdep_assert_held_write(&rbd_dev->lock_rwsem); @@ -4229,6 +4230,7 @@ static void __rbd_release_lock(struct rbd_device *rbd_dev) * lock_rwsem must be held for write */ static void rbd_release_lock(struct rbd_device *rbd_dev) + __must_hold(&rbd_dev->lock_rwsem) { if (!rbd_quiesce_lock(rbd_dev)) return; @@ -4585,6 +4587,7 @@ static void rbd_unregister_watch(struct rbd_device *rbd_dev) * lock_rwsem must be held for write */ static void rbd_reacquire_lock(struct rbd_device *rbd_dev) + __must_hold(&rbd_dev->lock_rwsem) { struct ceph_osd_client *osdc = &rbd_dev->rbd_client->client->osdc; char cookie[32]; @@ -6782,6 +6785,7 @@ static void rbd_dev_device_release(struct rbd_device *rbd_dev) * upon return. */ static int rbd_dev_device_setup(struct rbd_device *rbd_dev) + __releases(&rbd_dev->header_rwsem) { int ret; @@ -6883,6 +6887,7 @@ static void rbd_dev_image_release(struct rbd_device *rbd_dev) * with @depth == 0. */ static int rbd_dev_image_probe(struct rbd_device *rbd_dev, int depth) + __context_unsafe(conditional locking on @depth) { bool need_watch = !rbd_is_ro(rbd_dev); int ret; @@ -7136,6 +7141,9 @@ static ssize_t do_rbd_add(const char *buf, size_t count) if (rc < 0) goto err_out_rbd_dev; + /* Acquired by rbd_dev_image_probe(rbd_dev, 0) */ + __acquire(&rbd_dev->header_rwsem); + if (rbd_dev->opts->alloc_size > rbd_dev->layout.object_size) { rbd_warn(rbd_dev, "alloc_size adjusted to %u", rbd_dev->layout.object_size);