diff options
author | Philipp Reisner <philipp.reisner@linbit.com> | 2011-02-11 14:11:10 -0500 |
---|---|---|
committer | Philipp Reisner <philipp.reisner@linbit.com> | 2011-10-14 10:45:01 -0400 |
commit | 8410da8f0e3ff5c97bce1b10627316be509ce476 (patch) | |
tree | 877eb301ff032bc8b95bcf6556d01470a459f98f | |
parent | dad20554812e73a2bfbe45d1b161d5d3c249e597 (diff) |
drbd: Introduced tconn->cstate_mutex
In compatibility mode with old DRBDs, use that as the state_mutex
as well.
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
-rw-r--r-- | drivers/block/drbd/drbd_int.h | 8 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_main.c | 4 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_nl.c | 8 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_receiver.c | 11 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_state.c | 4 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_worker.c | 8 |
6 files changed, 26 insertions, 17 deletions
diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h index 2dbcd13ba2af..152d07bcfb9f 100644 --- a/drivers/block/drbd/drbd_int.h +++ b/drivers/block/drbd/drbd_int.h | |||
@@ -917,8 +917,9 @@ enum { | |||
917 | struct drbd_tconn { /* is a resource from the config file */ | 917 | struct drbd_tconn { /* is a resource from the config file */ |
918 | char *name; /* Resource name */ | 918 | char *name; /* Resource name */ |
919 | struct list_head all_tconn; /* List of all drbd_tconn, prot by global_state_lock */ | 919 | struct list_head all_tconn; /* List of all drbd_tconn, prot by global_state_lock */ |
920 | struct idr volumes; /* <tconn, vnr> to mdev mapping */ | 920 | struct idr volumes; /* <tconn, vnr> to mdev mapping */ |
921 | enum drbd_conns cstate; /* Only C_STANDALONE to C_WF_REPORT_PARAMS */ | 921 | enum drbd_conns cstate; /* Only C_STANDALONE to C_WF_REPORT_PARAMS */ |
922 | struct mutex cstate_mutex; /* Protects graceful disconnects */ | ||
922 | 923 | ||
923 | unsigned long flags; | 924 | unsigned long flags; |
924 | struct net_conf *net_conf; /* protected by get_net_conf() and put_net_conf() */ | 925 | struct net_conf *net_conf; /* protected by get_net_conf() and put_net_conf() */ |
@@ -1080,7 +1081,8 @@ struct drbd_conf { | |||
1080 | unsigned long comm_bm_set; /* communicated number of set bits. */ | 1081 | unsigned long comm_bm_set; /* communicated number of set bits. */ |
1081 | struct bm_io_work bm_io_work; | 1082 | struct bm_io_work bm_io_work; |
1082 | u64 ed_uuid; /* UUID of the exposed data */ | 1083 | u64 ed_uuid; /* UUID of the exposed data */ |
1083 | struct mutex state_mutex; | 1084 | struct mutex own_state_mutex; |
1085 | struct mutex *state_mutex; /* either own_state_mutex or mdev->tconn->cstate_mutex */ | ||
1084 | char congestion_reason; /* Why we where congested... */ | 1086 | char congestion_reason; /* Why we where congested... */ |
1085 | atomic_t rs_sect_in; /* for incoming resync data rate, SyncTarget */ | 1087 | atomic_t rs_sect_in; /* for incoming resync data rate, SyncTarget */ |
1086 | atomic_t rs_sect_ev; /* for submitted resync data rate, both */ | 1088 | atomic_t rs_sect_ev; /* for submitted resync data rate, both */ |
diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c index b64b7388ee9d..1781d0ad35e1 100644 --- a/drivers/block/drbd/drbd_main.c +++ b/drivers/block/drbd/drbd_main.c | |||
@@ -1801,7 +1801,8 @@ void drbd_init_set_defaults(struct drbd_conf *mdev) | |||
1801 | atomic_set(&mdev->ap_in_flight, 0); | 1801 | atomic_set(&mdev->ap_in_flight, 0); |
1802 | 1802 | ||
1803 | mutex_init(&mdev->md_io_mutex); | 1803 | mutex_init(&mdev->md_io_mutex); |
1804 | mutex_init(&mdev->state_mutex); | 1804 | mutex_init(&mdev->own_state_mutex); |
1805 | mdev->state_mutex = &mdev->own_state_mutex; | ||
1805 | 1806 | ||
1806 | spin_lock_init(&mdev->al_lock); | 1807 | spin_lock_init(&mdev->al_lock); |
1807 | spin_lock_init(&mdev->peer_seq_lock); | 1808 | spin_lock_init(&mdev->peer_seq_lock); |
@@ -2189,6 +2190,7 @@ struct drbd_tconn *drbd_new_tconn(char *name) | |||
2189 | goto fail; | 2190 | goto fail; |
2190 | 2191 | ||
2191 | tconn->cstate = C_STANDALONE; | 2192 | tconn->cstate = C_STANDALONE; |
2193 | mutex_init(&tconn->cstate_mutex); | ||
2192 | spin_lock_init(&tconn->req_lock); | 2194 | spin_lock_init(&tconn->req_lock); |
2193 | atomic_set(&tconn->net_cnt, 0); | 2195 | atomic_set(&tconn->net_cnt, 0); |
2194 | init_waitqueue_head(&tconn->net_cnt_wait); | 2196 | init_waitqueue_head(&tconn->net_cnt_wait); |
diff --git a/drivers/block/drbd/drbd_nl.c b/drivers/block/drbd/drbd_nl.c index eeb284aef3c8..3d8e63190dcd 100644 --- a/drivers/block/drbd/drbd_nl.c +++ b/drivers/block/drbd/drbd_nl.c | |||
@@ -320,7 +320,7 @@ drbd_set_role(struct drbd_conf *mdev, enum drbd_role new_role, int force) | |||
320 | if (new_role == R_PRIMARY) | 320 | if (new_role == R_PRIMARY) |
321 | request_ping(mdev->tconn); /* Detect a dead peer ASAP */ | 321 | request_ping(mdev->tconn); /* Detect a dead peer ASAP */ |
322 | 322 | ||
323 | mutex_lock(&mdev->state_mutex); | 323 | mutex_lock(mdev->state_mutex); |
324 | 324 | ||
325 | mask.i = 0; mask.role = R_MASK; | 325 | mask.i = 0; mask.role = R_MASK; |
326 | val.i = 0; val.role = new_role; | 326 | val.i = 0; val.role = new_role; |
@@ -439,7 +439,7 @@ drbd_set_role(struct drbd_conf *mdev, enum drbd_role new_role, int force) | |||
439 | 439 | ||
440 | kobject_uevent(&disk_to_dev(mdev->vdisk)->kobj, KOBJ_CHANGE); | 440 | kobject_uevent(&disk_to_dev(mdev->vdisk)->kobj, KOBJ_CHANGE); |
441 | fail: | 441 | fail: |
442 | mutex_unlock(&mdev->state_mutex); | 442 | mutex_unlock(mdev->state_mutex); |
443 | return rv; | 443 | return rv; |
444 | } | 444 | } |
445 | 445 | ||
@@ -2162,7 +2162,7 @@ static int drbd_nl_new_c_uuid(struct drbd_conf *mdev, struct drbd_nl_cfg_req *nl | |||
2162 | return 0; | 2162 | return 0; |
2163 | } | 2163 | } |
2164 | 2164 | ||
2165 | mutex_lock(&mdev->state_mutex); /* Protects us against serialized state changes. */ | 2165 | mutex_lock(mdev->state_mutex); /* Protects us against serialized state changes. */ |
2166 | 2166 | ||
2167 | if (!get_ldev(mdev)) { | 2167 | if (!get_ldev(mdev)) { |
2168 | retcode = ERR_NO_DISK; | 2168 | retcode = ERR_NO_DISK; |
@@ -2204,7 +2204,7 @@ static int drbd_nl_new_c_uuid(struct drbd_conf *mdev, struct drbd_nl_cfg_req *nl | |||
2204 | out_dec: | 2204 | out_dec: |
2205 | put_ldev(mdev); | 2205 | put_ldev(mdev); |
2206 | out: | 2206 | out: |
2207 | mutex_unlock(&mdev->state_mutex); | 2207 | mutex_unlock(mdev->state_mutex); |
2208 | 2208 | ||
2209 | reply->ret_code = retcode; | 2209 | reply->ret_code = retcode; |
2210 | return 0; | 2210 | return 0; |
diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c index 423e4dd2d53e..94c050ad55b6 100644 --- a/drivers/block/drbd/drbd_receiver.c +++ b/drivers/block/drbd/drbd_receiver.c | |||
@@ -753,6 +753,10 @@ static int drbd_connected(int vnr, void *p, void *data) | |||
753 | atomic_set(&mdev->packet_seq, 0); | 753 | atomic_set(&mdev->packet_seq, 0); |
754 | mdev->peer_seq = 0; | 754 | mdev->peer_seq = 0; |
755 | 755 | ||
756 | mdev->state_mutex = mdev->tconn->agreed_pro_version < 100 ? | ||
757 | &mdev->tconn->cstate_mutex : | ||
758 | &mdev->own_state_mutex; | ||
759 | |||
756 | ok &= drbd_send_sync_param(mdev, &mdev->sync_conf); | 760 | ok &= drbd_send_sync_param(mdev, &mdev->sync_conf); |
757 | ok &= drbd_send_sizes(mdev, 0, 0); | 761 | ok &= drbd_send_sizes(mdev, 0, 0); |
758 | ok &= drbd_send_uuids(mdev); | 762 | ok &= drbd_send_uuids(mdev); |
@@ -760,6 +764,7 @@ static int drbd_connected(int vnr, void *p, void *data) | |||
760 | clear_bit(USE_DEGR_WFC_T, &mdev->flags); | 764 | clear_bit(USE_DEGR_WFC_T, &mdev->flags); |
761 | clear_bit(RESIZE_PENDING, &mdev->flags); | 765 | clear_bit(RESIZE_PENDING, &mdev->flags); |
762 | 766 | ||
767 | |||
763 | return !ok; | 768 | return !ok; |
764 | } | 769 | } |
765 | 770 | ||
@@ -3167,8 +3172,8 @@ static int receive_uuids(struct drbd_conf *mdev, enum drbd_packet cmd, | |||
3167 | ongoing cluster wide state change is finished. That is important if | 3172 | ongoing cluster wide state change is finished. That is important if |
3168 | we are primary and are detaching from our disk. We need to see the | 3173 | we are primary and are detaching from our disk. We need to see the |
3169 | new disk state... */ | 3174 | new disk state... */ |
3170 | mutex_lock(&mdev->state_mutex); | 3175 | mutex_lock(mdev->state_mutex); |
3171 | mutex_unlock(&mdev->state_mutex); | 3176 | mutex_unlock(mdev->state_mutex); |
3172 | if (mdev->state.conn >= C_CONNECTED && mdev->state.disk < D_INCONSISTENT) | 3177 | if (mdev->state.conn >= C_CONNECTED && mdev->state.disk < D_INCONSISTENT) |
3173 | updated_uuids |= drbd_set_ed_uuid(mdev, p_uuid[UI_CURRENT]); | 3178 | updated_uuids |= drbd_set_ed_uuid(mdev, p_uuid[UI_CURRENT]); |
3174 | 3179 | ||
@@ -3219,7 +3224,7 @@ static int receive_req_state(struct drbd_conf *mdev, enum drbd_packet cmd, | |||
3219 | val.i = be32_to_cpu(p->val); | 3224 | val.i = be32_to_cpu(p->val); |
3220 | 3225 | ||
3221 | if (test_bit(DISCARD_CONCURRENT, &mdev->tconn->flags) && | 3226 | if (test_bit(DISCARD_CONCURRENT, &mdev->tconn->flags) && |
3222 | mutex_is_locked(&mdev->state_mutex)) { | 3227 | mutex_is_locked(mdev->state_mutex)) { |
3223 | drbd_send_sr_reply(mdev, SS_CONCURRENT_ST_CHG); | 3228 | drbd_send_sr_reply(mdev, SS_CONCURRENT_ST_CHG); |
3224 | return true; | 3229 | return true; |
3225 | } | 3230 | } |
diff --git a/drivers/block/drbd/drbd_state.c b/drivers/block/drbd/drbd_state.c index 91433168e1d4..2cd4fcef554a 100644 --- a/drivers/block/drbd/drbd_state.c +++ b/drivers/block/drbd/drbd_state.c | |||
@@ -163,7 +163,7 @@ drbd_req_state(struct drbd_conf *mdev, union drbd_state mask, | |||
163 | init_completion(&done); | 163 | init_completion(&done); |
164 | 164 | ||
165 | if (f & CS_SERIALIZE) | 165 | if (f & CS_SERIALIZE) |
166 | mutex_lock(&mdev->state_mutex); | 166 | mutex_lock(mdev->state_mutex); |
167 | 167 | ||
168 | spin_lock_irqsave(&mdev->tconn->req_lock, flags); | 168 | spin_lock_irqsave(&mdev->tconn->req_lock, flags); |
169 | os = mdev->state; | 169 | os = mdev->state; |
@@ -215,7 +215,7 @@ drbd_req_state(struct drbd_conf *mdev, union drbd_state mask, | |||
215 | 215 | ||
216 | abort: | 216 | abort: |
217 | if (f & CS_SERIALIZE) | 217 | if (f & CS_SERIALIZE) |
218 | mutex_unlock(&mdev->state_mutex); | 218 | mutex_unlock(mdev->state_mutex); |
219 | 219 | ||
220 | return rv; | 220 | return rv; |
221 | } | 221 | } |
diff --git a/drivers/block/drbd/drbd_worker.c b/drivers/block/drbd/drbd_worker.c index e8448712b958..9a9a00eabe0b 100644 --- a/drivers/block/drbd/drbd_worker.c +++ b/drivers/block/drbd/drbd_worker.c | |||
@@ -1538,19 +1538,19 @@ void drbd_start_resync(struct drbd_conf *mdev, enum drbd_conns side) | |||
1538 | if (current == mdev->tconn->worker.task) { | 1538 | if (current == mdev->tconn->worker.task) { |
1539 | /* The worker should not sleep waiting for state_mutex, | 1539 | /* The worker should not sleep waiting for state_mutex, |
1540 | that can take long */ | 1540 | that can take long */ |
1541 | if (!mutex_trylock(&mdev->state_mutex)) { | 1541 | if (!mutex_trylock(mdev->state_mutex)) { |
1542 | set_bit(B_RS_H_DONE, &mdev->flags); | 1542 | set_bit(B_RS_H_DONE, &mdev->flags); |
1543 | mdev->start_resync_timer.expires = jiffies + HZ/5; | 1543 | mdev->start_resync_timer.expires = jiffies + HZ/5; |
1544 | add_timer(&mdev->start_resync_timer); | 1544 | add_timer(&mdev->start_resync_timer); |
1545 | return; | 1545 | return; |
1546 | } | 1546 | } |
1547 | } else { | 1547 | } else { |
1548 | mutex_lock(&mdev->state_mutex); | 1548 | mutex_lock(mdev->state_mutex); |
1549 | } | 1549 | } |
1550 | clear_bit(B_RS_H_DONE, &mdev->flags); | 1550 | clear_bit(B_RS_H_DONE, &mdev->flags); |
1551 | 1551 | ||
1552 | if (!get_ldev_if_state(mdev, D_NEGOTIATING)) { | 1552 | if (!get_ldev_if_state(mdev, D_NEGOTIATING)) { |
1553 | mutex_unlock(&mdev->state_mutex); | 1553 | mutex_unlock(mdev->state_mutex); |
1554 | return; | 1554 | return; |
1555 | } | 1555 | } |
1556 | 1556 | ||
@@ -1639,7 +1639,7 @@ void drbd_start_resync(struct drbd_conf *mdev, enum drbd_conns side) | |||
1639 | drbd_md_sync(mdev); | 1639 | drbd_md_sync(mdev); |
1640 | } | 1640 | } |
1641 | put_ldev(mdev); | 1641 | put_ldev(mdev); |
1642 | mutex_unlock(&mdev->state_mutex); | 1642 | mutex_unlock(mdev->state_mutex); |
1643 | } | 1643 | } |
1644 | 1644 | ||
1645 | static int _worker_dying(int vnr, void *p, void *data) | 1645 | static int _worker_dying(int vnr, void *p, void *data) |