drbd: remove ->this_bdev
authorChristoph Hellwig <hch@lst.de>
Fri, 25 Sep 2020 16:06:17 +0000 (18:06 +0200)
committerJens Axboe <axboe@kernel.dk>
Mon, 5 Oct 2020 16:38:33 +0000 (10:38 -0600)
DRBD keeps a block device open just to get and set the capacity from
it.  Switch to primarily using the disk capacity as intended by the
block layer, and sync it to the bdev using revalidate_disk_size.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/block/drbd/drbd_actlog.c
drivers/block/drbd/drbd_int.h
drivers/block/drbd/drbd_main.c
drivers/block/drbd/drbd_nl.c
drivers/block/drbd/drbd_receiver.c
drivers/block/drbd/drbd_req.c
drivers/block/drbd/drbd_worker.c

index b41897dceb2b9003a37e3d86e27aed4229d7fd00..7227fc7ab8ed1efb585a442f1ea102d935ad0dd6 100644 (file)
@@ -865,7 +865,7 @@ int __drbd_change_sync(struct drbd_device *device, sector_t sector, int size,
        if (!get_ldev(device))
                return 0; /* no disk, no metadata, no bitmap to manipulate bits in */
 
-       nr_sectors = drbd_get_capacity(device->this_bdev);
+       nr_sectors = get_capacity(device->vdisk);
        esector = sector + (size >> 9) - 1;
 
        if (!expect(sector < nr_sectors))
index 740e93bad21feb65e8d2a077e62e30fe5aba2f90..8f879e5c2f67061f8ce035c6e76c7761c58f14c1 100644 (file)
@@ -841,7 +841,6 @@ struct drbd_device {
 
        sector_t p_size;     /* partner's disk size */
        struct request_queue *rq_queue;
-       struct block_device *this_bdev;
        struct gendisk      *vdisk;
 
        unsigned long last_reattach_jif;
index bd8b129196d49a846c2b6bfb0caa0df531bc4e7b..85c865ab485faa6b1a9e85e3749d6d8a27366dfc 100644 (file)
@@ -984,7 +984,10 @@ int drbd_send_sizes(struct drbd_peer_device *peer_device, int trigger_reply, enu
 
        p->d_size = cpu_to_be64(d_size);
        p->u_size = cpu_to_be64(u_size);
-       p->c_size = cpu_to_be64(trigger_reply ? 0 : drbd_get_capacity(device->this_bdev));
+       if (trigger_reply)
+               p->c_size = 0;
+       else
+               p->c_size = cpu_to_be64(get_capacity(device->vdisk));
        p->max_bio_size = cpu_to_be32(max_bio_size);
        p->queue_order_type = cpu_to_be16(q_order_type);
        p->dds_flags = cpu_to_be16(flags);
@@ -2029,17 +2032,13 @@ void drbd_init_set_defaults(struct drbd_device *device)
        device->local_max_bio_size = DRBD_MAX_BIO_SIZE_SAFE;
 }
 
-static void _drbd_set_my_capacity(struct drbd_device *device, sector_t size)
-{
-       /* set_capacity(device->this_bdev->bd_disk, size); */
-       set_capacity(device->vdisk, size);
-       device->this_bdev->bd_inode->i_size = (loff_t)size << 9;
-}
-
 void drbd_set_my_capacity(struct drbd_device *device, sector_t size)
 {
        char ppb[10];
-       _drbd_set_my_capacity(device, size);
+
+       set_capacity(device->vdisk, size);
+       revalidate_disk_size(device->vdisk, false);
+
        drbd_info(device, "size = %s (%llu KB)\n",
                ppsize(ppb, size>>1), (unsigned long long)size>>1);
 }
@@ -2069,7 +2068,8 @@ void drbd_device_cleanup(struct drbd_device *device)
        }
        D_ASSERT(device, first_peer_device(device)->connection->net_conf == NULL);
 
-       _drbd_set_my_capacity(device, 0);
+       set_capacity(device->vdisk, 0);
+       revalidate_disk_size(device->vdisk, false);
        if (device->bitmap) {
                /* maybe never allocated. */
                drbd_bm_resize(device, 0, 1);
@@ -2236,9 +2236,6 @@ void drbd_destroy_device(struct kref *kref)
        /* cleanup stuff that may have been allocated during
         * device (re-)configuration or state changes */
 
-       if (device->this_bdev)
-               bdput(device->this_bdev);
-
        drbd_backing_dev_free(device, device->ldev);
        device->ldev = NULL;
 
@@ -2765,8 +2762,6 @@ enum drbd_ret_code drbd_create_device(struct drbd_config_context *adm_ctx, unsig
        sprintf(disk->disk_name, "drbd%d", minor);
        disk->private_data = device;
 
-       device->this_bdev = bdget(MKDEV(DRBD_MAJOR, minor));
-
        blk_queue_write_cache(q, true, true);
        /* Setting the max_hw_sectors to an odd value of 8kibyte here
           This triggers a max_bio_size message upon first attach or connect */
@@ -3042,7 +3037,7 @@ void drbd_md_write(struct drbd_device *device, void *b)
 
        memset(buffer, 0, sizeof(*buffer));
 
-       buffer->la_size_sect = cpu_to_be64(drbd_get_capacity(device->this_bdev));
+       buffer->la_size_sect = cpu_to_be64(get_capacity(device->vdisk));
        for (i = UI_CURRENT; i < UI_SIZE; i++)
                buffer->uuid[i] = cpu_to_be64(device->ldev->md.uuid[i]);
        buffer->flags = cpu_to_be32(device->ldev->md.flags);
@@ -3100,7 +3095,7 @@ void drbd_md_sync(struct drbd_device *device)
 
        /* Update device->ldev->md.la_size_sect,
         * since we updated it on metadata. */
-       device->ldev->md.la_size_sect = drbd_get_capacity(device->this_bdev);
+       device->ldev->md.la_size_sect = get_capacity(device->vdisk);
 
        drbd_md_put_buffer(device);
 out:
index 54a4930c04fe070c1d03411c9b2a0e99fcf58a74..bf7de4c7b96c19397ca43577f9858b1a8fe356ca 100644 (file)
@@ -996,7 +996,7 @@ drbd_determine_dev_size(struct drbd_device *device, enum dds_flags flags, struct
                        goto err_out;
        }
 
-       if (drbd_get_capacity(device->this_bdev) != size ||
+       if (get_capacity(device->vdisk) != size ||
            drbd_bm_capacity(device) != size) {
                int err;
                err = drbd_bm_resize(device, size, !(flags & DDSF_NO_RESYNC));
@@ -1933,8 +1933,7 @@ int drbd_adm_attach(struct sk_buff *skb, struct genl_info *info)
 
        /* Make sure the new disk is big enough
         * (we may currently be R_PRIMARY with no local disk...) */
-       if (drbd_get_max_capacity(nbc) <
-           drbd_get_capacity(device->this_bdev)) {
+       if (drbd_get_max_capacity(nbc) < get_capacity(device->vdisk)) {
                retcode = ERR_DISK_TOO_SMALL;
                goto fail;
        }
@@ -3377,7 +3376,7 @@ static void device_to_statistics(struct device_statistics *s,
                s->dev_disk_flags = md->flags;
                put_ldev(device);
        }
-       s->dev_size = drbd_get_capacity(device->this_bdev);
+       s->dev_size = get_capacity(device->vdisk);
        s->dev_read = device->read_cnt;
        s->dev_write = device->writ_cnt;
        s->dev_al_writes = device->al_writ_cnt;
@@ -3817,8 +3816,7 @@ static int nla_put_status_info(struct sk_buff *skb, struct drbd_device *device,
        if (nla_put_u32(skb, T_sib_reason, sib ? sib->sib_reason : SIB_GET_STATUS_REPLY) ||
            nla_put_u32(skb, T_current_state, device->state.i) ||
            nla_put_u64_0pad(skb, T_ed_uuid, device->ed_uuid) ||
-           nla_put_u64_0pad(skb, T_capacity,
-                            drbd_get_capacity(device->this_bdev)) ||
+           nla_put_u64_0pad(skb, T_capacity, get_capacity(device->vdisk)) ||
            nla_put_u64_0pad(skb, T_send_cnt, device->send_cnt) ||
            nla_put_u64_0pad(skb, T_recv_cnt, device->recv_cnt) ||
            nla_put_u64_0pad(skb, T_read_cnt, device->read_cnt) ||
index 2d16fb0905999d0f8e6e0493cf334cafaaa2aaa5..dc333dbe5232817da94096fea0f360b4520902f1 100644 (file)
@@ -1860,7 +1860,7 @@ read_in_block(struct drbd_peer_device *peer_device, u64 id, sector_t sector,
              struct packet_info *pi) __must_hold(local)
 {
        struct drbd_device *device = peer_device->device;
-       const sector_t capacity = drbd_get_capacity(device->this_bdev);
+       const sector_t capacity = get_capacity(device->vdisk);
        struct drbd_peer_request *peer_req;
        struct page *page;
        int digest_size, err;
@@ -2849,7 +2849,7 @@ static int receive_DataRequest(struct drbd_connection *connection, struct packet
        if (!peer_device)
                return -EIO;
        device = peer_device->device;
-       capacity = drbd_get_capacity(device->this_bdev);
+       capacity = get_capacity(device->vdisk);
 
        sector = be64_to_cpu(p->sector);
        size   = be32_to_cpu(p->blksize);
@@ -4117,7 +4117,7 @@ static int receive_sizes(struct drbd_connection *connection, struct packet_info
        if (!peer_device)
                return config_unknown_volume(connection, pi);
        device = peer_device->device;
-       cur_size = drbd_get_capacity(device->this_bdev);
+       cur_size = get_capacity(device->vdisk);
 
        p_size = be64_to_cpu(p->d_size);
        p_usize = be64_to_cpu(p->u_size);
@@ -4252,8 +4252,8 @@ static int receive_sizes(struct drbd_connection *connection, struct packet_info
        }
 
        if (device->state.conn > C_WF_REPORT_PARAMS) {
-               if (be64_to_cpu(p->c_size) !=
-                   drbd_get_capacity(device->this_bdev) || ldsc) {
+               if (be64_to_cpu(p->c_size) != get_capacity(device->vdisk) ||
+                   ldsc) {
                        /* we have different sizes, probably peer
                         * needs to know my new size... */
                        drbd_send_sizes(peer_device, 0, ddsf);
index 5c975af9c15fb89d7b78ec16dfee8f6bad962611..330f851cb8f0b0acccb15160f7a8f9cc64f723b8 100644 (file)
@@ -888,7 +888,7 @@ static bool drbd_may_do_local_read(struct drbd_device *device, sector_t sector,
        if (device->state.disk != D_INCONSISTENT)
                return false;
        esector = sector + (size >> 9) - 1;
-       nr_sectors = drbd_get_capacity(device->this_bdev);
+       nr_sectors = get_capacity(device->vdisk);
        D_ASSERT(device, sector  < nr_sectors);
        D_ASSERT(device, esector < nr_sectors);
 
index 9107b109ba7bcb51a7bbf8a4524e75a8f44806f4..ba56f3f05312f071548c9a3ed15c01fe03ff9b67 100644 (file)
@@ -591,7 +591,7 @@ static int make_resync_request(struct drbd_device *const device, int cancel)
        struct drbd_connection *const connection = peer_device ? peer_device->connection : NULL;
        unsigned long bit;
        sector_t sector;
-       const sector_t capacity = drbd_get_capacity(device->this_bdev);
+       const sector_t capacity = get_capacity(device->vdisk);
        int max_bio_size;
        int number, rollback_i, size;
        int align, requeue = 0;
@@ -769,7 +769,7 @@ static int make_ov_request(struct drbd_device *device, int cancel)
 {
        int number, i, size;
        sector_t sector;
-       const sector_t capacity = drbd_get_capacity(device->this_bdev);
+       const sector_t capacity = get_capacity(device->vdisk);
        bool stop_sector_reached = false;
 
        if (unlikely(cancel))