--- x/block/bdev.c +++ y/block/bdev.c @@ -1137,12 +1137,12 @@ void bdev_release(struct file *bdev_file * from userland - e.g. eject(1). */ disk_flush_events(disk, DISK_EVENT_MEDIA_CHANGE); + mutex_unlock(&disk->open_mutex); if (bdev_is_partition(bdev)) blkdev_put_part(bdev); else blkdev_put_whole(bdev); - mutex_unlock(&disk->open_mutex); module_put(disk->fops->owner); put_no_open: --- l/drivers/block/nbd.c +++ y/drivers/block/nbd.c @@ -1700,21 +1700,23 @@ static int nbd_open(struct gendisk *disk config = nbd_get_config_unlocked(nbd); if (!config) { + mutex_unlock(&nbd_index_mutex); mutex_lock(&nbd->config_lock); if (refcount_inc_not_zero(&nbd->config_refs)) { mutex_unlock(&nbd->config_lock); - goto out; + return 0; } ret = nbd_alloc_and_init_config(nbd); if (ret) { mutex_unlock(&nbd->config_lock); - goto out; + return ret; } refcount_inc(&nbd->refs); mutex_unlock(&nbd->config_lock); if (max_part) set_bit(GD_NEED_PART_SCAN, &disk->state); + return 0; } else if (nbd_disconnected(config)) { if (max_part) set_bit(GD_NEED_PART_SCAN, &disk->state);