static int nullb_apply_submit_queues(struct nullb_device *dev,
                                     unsigned int submit_queues)
 {
-       return nullb_update_nr_hw_queues(dev, submit_queues, dev->poll_queues);
+       int ret;
+
+       mutex_lock(&lock);
+       ret = nullb_update_nr_hw_queues(dev, submit_queues, dev->poll_queues);
+       mutex_unlock(&lock);
+
+       return ret;
 }
 
 static int nullb_apply_poll_queues(struct nullb_device *dev,
                                   unsigned int poll_queues)
 {
-       return nullb_update_nr_hw_queues(dev, dev->submit_queues, poll_queues);
+       int ret;
+
+       mutex_lock(&lock);
+       ret = nullb_update_nr_hw_queues(dev, dev->submit_queues, poll_queues);
+       mutex_unlock(&lock);
+
+       return ret;
 }
 
 NULLB_DEVICE_ATTR(size, ulong, NULL);
        if (ret < 0)
                return ret;
 
+       ret = count;
+       mutex_lock(&lock);
        if (!dev->power && newp) {
                if (test_and_set_bit(NULLB_DEV_FL_UP, &dev->flags))
-                       return count;
+                       goto out;
+
                ret = null_add_dev(dev);
                if (ret) {
                        clear_bit(NULLB_DEV_FL_UP, &dev->flags);
-                       return ret;
+                       goto out;
                }
 
                set_bit(NULLB_DEV_FL_CONFIGURED, &dev->flags);
                dev->power = newp;
        } else if (dev->power && !newp) {
                if (test_and_clear_bit(NULLB_DEV_FL_UP, &dev->flags)) {
-                       mutex_lock(&lock);
                        dev->power = newp;
                        null_del_dev(dev->nullb);
-                       mutex_unlock(&lock);
                }
                clear_bit(NULLB_DEV_FL_CONFIGURED, &dev->flags);
        }
 
-       return count;
+out:
+       mutex_unlock(&lock);
+       return ret;
 }
 
 CONFIGFS_ATTR(nullb_device_, power);
        nullb->q->queuedata = nullb;
        blk_queue_flag_set(QUEUE_FLAG_NONROT, nullb->q);
 
-       mutex_lock(&lock);
        rv = ida_alloc(&nullb_indexes, GFP_KERNEL);
-       if (rv < 0) {
-               mutex_unlock(&lock);
+       if (rv < 0)
                goto out_cleanup_disk;
-       }
+
        nullb->index = rv;
        dev->index = rv;
-       mutex_unlock(&lock);
 
        if (config_item_name(&dev->group.cg_item)) {
                /* Use configfs dir name as the device name */
        if (rv)
                goto out_ida_free;
 
-       mutex_lock(&lock);
        list_add_tail(&nullb->list, &nullb_list);
-       mutex_unlock(&lock);
 
        pr_info("disk %s created\n", nullb->disk_name);
 
        if (!dev)
                return -ENOMEM;
 
+       mutex_lock(&lock);
        ret = null_add_dev(dev);
+       mutex_unlock(&lock);
        if (ret) {
                null_free_dev(dev);
                return ret;