aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block/drbd/drbd_main.c
diff options
context:
space:
mode:
authorPhilipp Reisner <philipp.reisner@linbit.com>2011-05-03 09:00:55 -0400
committerPhilipp Reisner <philipp.reisner@linbit.com>2012-11-08 10:55:43 -0500
commitdaeda1cca91d58bb6c8e45f6734f021bab9c28b7 (patch)
tree002ba940efd64307f0805d6418634e2559f71363 /drivers/block/drbd/drbd_main.c
parent563e4cf25ec804eb02cd30a41baa2fcc6c06679b (diff)
drbd: RCU for disk_conf
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
Diffstat (limited to 'drivers/block/drbd/drbd_main.c')
-rw-r--r--drivers/block/drbd/drbd_main.c25
1 files changed, 16 insertions, 9 deletions
diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c
index e37244485d72..de6afa75dec6 100644
--- a/drivers/block/drbd/drbd_main.c
+++ b/drivers/block/drbd/drbd_main.c
@@ -866,6 +866,7 @@ int drbd_send_sync_param(struct drbd_conf *mdev)
866 const int apv = mdev->tconn->agreed_pro_version; 866 const int apv = mdev->tconn->agreed_pro_version;
867 enum drbd_packet cmd; 867 enum drbd_packet cmd;
868 struct net_conf *nc; 868 struct net_conf *nc;
869 struct disk_conf *dc;
869 870
870 sock = &mdev->tconn->data; 871 sock = &mdev->tconn->data;
871 p = drbd_prepare_command(mdev, sock); 872 p = drbd_prepare_command(mdev, sock);
@@ -887,11 +888,12 @@ int drbd_send_sync_param(struct drbd_conf *mdev)
887 memset(p->verify_alg, 0, 2 * SHARED_SECRET_MAX); 888 memset(p->verify_alg, 0, 2 * SHARED_SECRET_MAX);
888 889
889 if (get_ldev(mdev)) { 890 if (get_ldev(mdev)) {
890 p->rate = cpu_to_be32(mdev->ldev->dc.resync_rate); 891 dc = rcu_dereference(mdev->ldev->disk_conf);
891 p->c_plan_ahead = cpu_to_be32(mdev->ldev->dc.c_plan_ahead); 892 p->rate = cpu_to_be32(dc->resync_rate);
892 p->c_delay_target = cpu_to_be32(mdev->ldev->dc.c_delay_target); 893 p->c_plan_ahead = cpu_to_be32(dc->c_plan_ahead);
893 p->c_fill_target = cpu_to_be32(mdev->ldev->dc.c_fill_target); 894 p->c_delay_target = cpu_to_be32(dc->c_delay_target);
894 p->c_max_rate = cpu_to_be32(mdev->ldev->dc.c_max_rate); 895 p->c_fill_target = cpu_to_be32(dc->c_fill_target);
896 p->c_max_rate = cpu_to_be32(dc->c_max_rate);
895 put_ldev(mdev); 897 put_ldev(mdev);
896 } else { 898 } else {
897 p->rate = cpu_to_be32(DRBD_RATE_DEF); 899 p->rate = cpu_to_be32(DRBD_RATE_DEF);
@@ -1056,7 +1058,9 @@ int drbd_send_sizes(struct drbd_conf *mdev, int trigger_reply, enum dds_flags fl
1056 if (get_ldev_if_state(mdev, D_NEGOTIATING)) { 1058 if (get_ldev_if_state(mdev, D_NEGOTIATING)) {
1057 D_ASSERT(mdev->ldev->backing_bdev); 1059 D_ASSERT(mdev->ldev->backing_bdev);
1058 d_size = drbd_get_max_capacity(mdev->ldev); 1060 d_size = drbd_get_max_capacity(mdev->ldev);
1059 u_size = mdev->ldev->dc.disk_size; 1061 rcu_read_lock();
1062 u_size = rcu_dereference(mdev->ldev->disk_conf)->disk_size;
1063 rcu_read_unlock();
1060 q_order_type = drbd_queue_order_type(mdev); 1064 q_order_type = drbd_queue_order_type(mdev);
1061 max_bio_size = queue_max_hw_sectors(mdev->ldev->backing_bdev->bd_disk->queue) << 9; 1065 max_bio_size = queue_max_hw_sectors(mdev->ldev->backing_bdev->bd_disk->queue) << 9;
1062 max_bio_size = min_t(int, max_bio_size, DRBD_MAX_BIO_SIZE); 1066 max_bio_size = min_t(int, max_bio_size, DRBD_MAX_BIO_SIZE);
@@ -2889,7 +2893,6 @@ int drbd_md_read(struct drbd_conf *mdev, struct drbd_backing_dev *bdev)
2889 for (i = UI_CURRENT; i < UI_SIZE; i++) 2893 for (i = UI_CURRENT; i < UI_SIZE; i++)
2890 bdev->md.uuid[i] = be64_to_cpu(buffer->uuid[i]); 2894 bdev->md.uuid[i] = be64_to_cpu(buffer->uuid[i]);
2891 bdev->md.flags = be32_to_cpu(buffer->flags); 2895 bdev->md.flags = be32_to_cpu(buffer->flags);
2892 bdev->dc.al_extents = be32_to_cpu(buffer->al_nr_extents);
2893 bdev->md.device_uuid = be64_to_cpu(buffer->device_uuid); 2896 bdev->md.device_uuid = be64_to_cpu(buffer->device_uuid);
2894 2897
2895 spin_lock_irq(&mdev->tconn->req_lock); 2898 spin_lock_irq(&mdev->tconn->req_lock);
@@ -2901,8 +2904,12 @@ int drbd_md_read(struct drbd_conf *mdev, struct drbd_backing_dev *bdev)
2901 } 2904 }
2902 spin_unlock_irq(&mdev->tconn->req_lock); 2905 spin_unlock_irq(&mdev->tconn->req_lock);
2903 2906
2904 if (bdev->dc.al_extents < 7) 2907 mutex_lock(&mdev->tconn->conf_update);
2905 bdev->dc.al_extents = 127; 2908 /* This blocks wants to be get removed... */
2909 bdev->disk_conf->al_extents = be32_to_cpu(buffer->al_nr_extents);
2910 if (bdev->disk_conf->al_extents < DRBD_AL_EXTENTS_MIN)
2911 bdev->disk_conf->al_extents = DRBD_AL_EXTENTS_DEF;
2912 mutex_unlock(&mdev->tconn->conf_update);
2906 2913
2907 err: 2914 err:
2908 mutex_unlock(&mdev->md_io_mutex); 2915 mutex_unlock(&mdev->md_io_mutex);