struct bsg_device *bd;
        unsigned char buf[32];
 
+       lockdep_assert_held(&bsg_mutex);
+
        if (!blk_get_queue(rq))
                return ERR_PTR(-ENXIO);
 
        bsg_set_block(bd, file);
 
        atomic_set(&bd->ref_count, 1);
-       mutex_lock(&bsg_mutex);
        hlist_add_head(&bd->dev_list, bsg_dev_idx_hash(iminor(inode)));
 
        strncpy(bd->name, dev_name(rq->bsg_dev.class_dev), sizeof(bd->name) - 1);
        bsg_dbg(bd, "bound to <%s>, max queue %d\n",
                format_dev_t(buf, inode->i_rdev), bd->max_queue);
 
-       mutex_unlock(&bsg_mutex);
        return bd;
 }
 
 {
        struct bsg_device *bd;
 
-       mutex_lock(&bsg_mutex);
+       lockdep_assert_held(&bsg_mutex);
 
        hlist_for_each_entry(bd, bsg_dev_idx_hash(minor), dev_list) {
                if (bd->queue == q) {
        }
        bd = NULL;
 found:
-       mutex_unlock(&bsg_mutex);
        return bd;
 }
 
         */
        mutex_lock(&bsg_mutex);
        bcd = idr_find(&bsg_minor_idr, iminor(inode));
-       mutex_unlock(&bsg_mutex);
 
-       if (!bcd)
-               return ERR_PTR(-ENODEV);
+       if (!bcd) {
+               bd = ERR_PTR(-ENODEV);
+               goto out_unlock;
+       }
 
        bd = __bsg_get_device(iminor(inode), bcd->queue);
-       if (bd)
-               return bd;
-
-       bd = bsg_add_device(inode, bcd->queue, file);
+       if (!bd)
+               bd = bsg_add_device(inode, bcd->queue, file);
 
+out_unlock:
+       mutex_unlock(&bsg_mutex);
        return bd;
 }