diff options
author | Philipp Reisner <philipp.reisner@linbit.com> | 2011-05-03 09:00:55 -0400 |
---|---|---|
committer | Philipp Reisner <philipp.reisner@linbit.com> | 2012-11-08 10:55:43 -0500 |
commit | daeda1cca91d58bb6c8e45f6734f021bab9c28b7 (patch) | |
tree | 002ba940efd64307f0805d6418634e2559f71363 /drivers/block/drbd/drbd_main.c | |
parent | 563e4cf25ec804eb02cd30a41baa2fcc6c06679b (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.c | 25 |
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); |