Merge tag 'gcc-plugins-v5.11-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / drivers / block / nbd.c
index edf8b63..aaae922 100644 (file)
@@ -296,10 +296,11 @@ static void nbd_size_clear(struct nbd_device *nbd)
        }
 }
 
-static void nbd_size_update(struct nbd_device *nbd)
+static void nbd_size_update(struct nbd_device *nbd, bool start)
 {
        struct nbd_config *config = nbd->config;
        struct block_device *bdev = bdget_disk(nbd->disk, 0);
+       sector_t nr_sectors = config->bytesize >> 9;
 
        if (config->flags & NBD_FLAG_SEND_TRIM) {
                nbd->disk->queue->limits.discard_granularity = config->blksize;
@@ -308,13 +309,14 @@ static void nbd_size_update(struct nbd_device *nbd)
        }
        blk_queue_logical_block_size(nbd->disk->queue, config->blksize);
        blk_queue_physical_block_size(nbd->disk->queue, config->blksize);
-       set_capacity(nbd->disk, config->bytesize >> 9);
+       set_capacity(nbd->disk, nr_sectors);
        if (bdev) {
                if (bdev->bd_disk) {
-                       bd_set_size(bdev, config->bytesize);
-                       set_blocksize(bdev, config->blksize);
+                       bd_set_nr_sectors(bdev, nr_sectors);
+                       if (start)
+                               set_blocksize(bdev, config->blksize);
                } else
-                       bdev->bd_invalidated = 1;
+                       set_bit(GD_NEED_PART_SCAN, &nbd->disk->state);
                bdput(bdev);
        }
        kobject_uevent(&nbd_to_dev(nbd)->kobj, KOBJ_CHANGE);
@@ -327,7 +329,7 @@ static void nbd_size_set(struct nbd_device *nbd, loff_t blocksize,
        config->blksize = blocksize;
        config->bytesize = blocksize * nr_blocks;
        if (nbd->task_recv != NULL)
-               nbd_size_update(nbd);
+               nbd_size_update(nbd, false);
 }
 
 static void nbd_complete_rq(struct request *req)
@@ -801,9 +803,9 @@ static void recv_work(struct work_struct *work)
                if (likely(!blk_should_fake_timeout(rq->q)))
                        blk_mq_complete_request(rq);
        }
+       nbd_config_put(nbd);
        atomic_dec(&config->recv_threads);
        wake_up(&config->recv_wq);
-       nbd_config_put(nbd);
        kfree(args);
 }
 
@@ -1138,7 +1140,7 @@ static void nbd_bdev_reset(struct block_device *bdev)
 {
        if (bdev->bd_openers > 1)
                return;
-       bd_set_size(bdev, 0);
+       bd_set_nr_sectors(bdev, 0);
 }
 
 static void nbd_parse_flags(struct nbd_device *nbd)
@@ -1307,7 +1309,7 @@ static int nbd_start_device(struct nbd_device *nbd)
                args->index = i;
                queue_work(nbd->recv_workq, &args->work);
        }
-       nbd_size_update(nbd);
+       nbd_size_update(nbd, true);
        return error;
 }
 
@@ -1321,7 +1323,7 @@ static int nbd_start_device_ioctl(struct nbd_device *nbd, struct block_device *b
                return ret;
 
        if (max_part)
-               bdev->bd_invalidated = 1;
+               set_bit(GD_NEED_PART_SCAN, &nbd->disk->state);
        mutex_unlock(&nbd->config_lock);
        ret = wait_event_interruptible(config->recv_wq,
                                         atomic_read(&config->recv_threads) == 0);
@@ -1499,9 +1501,9 @@ static int nbd_open(struct block_device *bdev, fmode_t mode)
                refcount_set(&nbd->config_refs, 1);
                refcount_inc(&nbd->refs);
                mutex_unlock(&nbd->config_lock);
-               bdev->bd_invalidated = 1;
+               set_bit(GD_NEED_PART_SCAN, &bdev->bd_disk->state);
        } else if (nbd_disconnected(nbd->config)) {
-               bdev->bd_invalidated = 1;
+               set_bit(GD_NEED_PART_SCAN, &bdev->bd_disk->state);
        }
 out:
        mutex_unlock(&nbd_index_mutex);
@@ -1516,6 +1518,7 @@ static void nbd_release(struct gendisk *disk, fmode_t mode)
        if (test_bit(NBD_RT_DISCONNECT_ON_CLOSE, &nbd->config->runtime_flags) &&
                        bdev->bd_openers == 0)
                nbd_disconnect_and_put(nbd);
+       bdput(bdev);
 
        nbd_config_put(nbd);
        nbd_put(nbd);
@@ -2183,7 +2186,7 @@ out:
        return ret;
 }
 
-static const struct genl_ops nbd_connect_genl_ops[] = {
+static const struct genl_small_ops nbd_connect_genl_ops[] = {
        {
                .cmd    = NBD_CMD_CONNECT,
                .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP,
@@ -2215,8 +2218,8 @@ static struct genl_family nbd_genl_family __ro_after_init = {
        .name           = NBD_GENL_FAMILY_NAME,
        .version        = NBD_GENL_VERSION,
        .module         = THIS_MODULE,
-       .ops            = nbd_connect_genl_ops,
-       .n_ops          = ARRAY_SIZE(nbd_connect_genl_ops),
+       .small_ops      = nbd_connect_genl_ops,
+       .n_small_ops    = ARRAY_SIZE(nbd_connect_genl_ops),
        .maxattr        = NBD_ATTR_MAX,
        .policy = nbd_attr_policy,
        .mcgrps         = nbd_mcast_grps,