aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilipp Reisner <philipp.reisner@linbit.com>2011-02-11 14:11:10 -0500
committerPhilipp Reisner <philipp.reisner@linbit.com>2011-10-14 10:45:01 -0400
commit8410da8f0e3ff5c97bce1b10627316be509ce476 (patch)
tree877eb301ff032bc8b95bcf6556d01470a459f98f
parentdad20554812e73a2bfbe45d1b161d5d3c249e597 (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.h8
-rw-r--r--drivers/block/drbd/drbd_main.c4
-rw-r--r--drivers/block/drbd/drbd_nl.c8
-rw-r--r--drivers/block/drbd/drbd_receiver.c11
-rw-r--r--drivers/block/drbd/drbd_state.c4
-rw-r--r--drivers/block/drbd/drbd_worker.c8
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 {
917struct drbd_tconn { /* is a resource from the config file */ 917struct 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
2204out_dec: 2204out_dec:
2205 put_ldev(mdev); 2205 put_ldev(mdev);
2206out: 2206out:
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
216abort: 216abort:
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
1645static int _worker_dying(int vnr, void *p, void *data) 1645static int _worker_dying(int vnr, void *p, void *data)