aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/block/drbd
diff options
context:
space:
mode:
authorPhilipp Reisner <philipp.reisner@linbit.com>2011-03-28 09:40:12 -0400
committerPhilipp Reisner <philipp.reisner@linbit.com>2012-11-08 10:45:03 -0500
commit78bae59b1b7bc06c84e292e9ecf42c013723e057 (patch)
tree1deebbe72eab1b40c6b61f41c369c38e29fa816f /drivers/block/drbd
parente15766e9c94f7fa3396eff4ffbbf30dea8c0e22a (diff)
drbd: Introduced drbd_read_state()
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
Diffstat (limited to 'drivers/block/drbd')
-rw-r--r--drivers/block/drbd/drbd_int.h9
-rw-r--r--drivers/block/drbd/drbd_nl.c5
-rw-r--r--drivers/block/drbd/drbd_receiver.c6
-rw-r--r--drivers/block/drbd/drbd_state.c15
-rw-r--r--drivers/block/drbd/drbd_state.h6
-rw-r--r--drivers/block/drbd/drbd_worker.c6
6 files changed, 27 insertions, 20 deletions
diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h
index 2dbffb3b5485..24aed86e7364 100644
--- a/drivers/block/drbd/drbd_int.h
+++ b/drivers/block/drbd/drbd_int.h
@@ -1682,6 +1682,15 @@ _drbd_set_state(struct drbd_conf *mdev, union drbd_state ns,
1682 return rv; 1682 return rv;
1683} 1683}
1684 1684
1685static inline union drbd_state drbd_read_state(struct drbd_conf *mdev)
1686{
1687 union drbd_state rv;
1688
1689 rv = mdev->state;
1690
1691 return rv;
1692}
1693
1685#define __drbd_chk_io_error(m,f) __drbd_chk_io_error_(m,f, __func__) 1694#define __drbd_chk_io_error(m,f) __drbd_chk_io_error_(m,f, __func__)
1686static inline void __drbd_chk_io_error_(struct drbd_conf *mdev, int forcedetach, const char *where) 1695static inline void __drbd_chk_io_error_(struct drbd_conf *mdev, int forcedetach, const char *where)
1687{ 1696{
diff --git a/drivers/block/drbd/drbd_nl.c b/drivers/block/drbd/drbd_nl.c
index 85290a9beb6d..75caac70aaae 100644
--- a/drivers/block/drbd/drbd_nl.c
+++ b/drivers/block/drbd/drbd_nl.c
@@ -1503,8 +1503,8 @@ int drbd_adm_attach(struct sk_buff *skb, struct genl_info *info)
1503 drbd_suspend_al(mdev); /* IO is still suspended here... */ 1503 drbd_suspend_al(mdev); /* IO is still suspended here... */
1504 1504
1505 spin_lock_irq(&mdev->tconn->req_lock); 1505 spin_lock_irq(&mdev->tconn->req_lock);
1506 os = mdev->state; 1506 os = drbd_read_state(mdev);
1507 ns.i = os.i; 1507 ns = os;
1508 /* If MDF_CONSISTENT is not set go into inconsistent state, 1508 /* If MDF_CONSISTENT is not set go into inconsistent state,
1509 otherwise investigate MDF_WasUpToDate... 1509 otherwise investigate MDF_WasUpToDate...
1510 If MDF_WAS_UP_TO_DATE is not set go into D_OUTDATED disk state, 1510 If MDF_WAS_UP_TO_DATE is not set go into D_OUTDATED disk state,
@@ -1546,7 +1546,6 @@ int drbd_adm_attach(struct sk_buff *skb, struct genl_info *info)
1546 } 1546 }
1547 1547
1548 rv = _drbd_set_state(mdev, ns, CS_VERBOSE, NULL); 1548 rv = _drbd_set_state(mdev, ns, CS_VERBOSE, NULL);
1549 ns = mdev->state;
1550 spin_unlock_irq(&mdev->tconn->req_lock); 1549 spin_unlock_irq(&mdev->tconn->req_lock);
1551 1550
1552 if (rv < SS_SUCCESS) 1551 if (rv < SS_SUCCESS)
diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c
index c456a141eeec..28cb19c8e264 100644
--- a/drivers/block/drbd/drbd_receiver.c
+++ b/drivers/block/drbd/drbd_receiver.c
@@ -3473,7 +3473,7 @@ static int receive_state(struct drbd_tconn *tconn, struct packet_info *pi)
3473 3473
3474 spin_lock_irq(&mdev->tconn->req_lock); 3474 spin_lock_irq(&mdev->tconn->req_lock);
3475 retry: 3475 retry:
3476 os = ns = mdev->state; 3476 os = ns = drbd_read_state(mdev);
3477 spin_unlock_irq(&mdev->tconn->req_lock); 3477 spin_unlock_irq(&mdev->tconn->req_lock);
3478 3478
3479 /* peer says his disk is uptodate, while we think it is inconsistent, 3479 /* peer says his disk is uptodate, while we think it is inconsistent,
@@ -3559,7 +3559,7 @@ static int receive_state(struct drbd_tconn *tconn, struct packet_info *pi)
3559 } 3559 }
3560 3560
3561 spin_lock_irq(&mdev->tconn->req_lock); 3561 spin_lock_irq(&mdev->tconn->req_lock);
3562 if (mdev->state.i != os.i) 3562 if (os.i != drbd_read_state(mdev).i)
3563 goto retry; 3563 goto retry;
3564 clear_bit(CONSIDER_RESYNC, &mdev->flags); 3564 clear_bit(CONSIDER_RESYNC, &mdev->flags);
3565 ns.peer = peer_state.role; 3565 ns.peer = peer_state.role;
@@ -3581,7 +3581,7 @@ static int receive_state(struct drbd_tconn *tconn, struct packet_info *pi)
3581 return -EIO; 3581 return -EIO;
3582 } 3582 }
3583 rv = _drbd_set_state(mdev, ns, cs_flags, NULL); 3583 rv = _drbd_set_state(mdev, ns, cs_flags, NULL);
3584 ns = mdev->state; 3584 ns = drbd_read_state(mdev);
3585 spin_unlock_irq(&mdev->tconn->req_lock); 3585 spin_unlock_irq(&mdev->tconn->req_lock);
3586 3586
3587 if (rv < SS_SUCCESS) { 3587 if (rv < SS_SUCCESS) {
diff --git a/drivers/block/drbd/drbd_state.c b/drivers/block/drbd/drbd_state.c
index ca77da38a0dc..411d05f885e1 100644
--- a/drivers/block/drbd/drbd_state.c
+++ b/drivers/block/drbd/drbd_state.c
@@ -163,9 +163,8 @@ drbd_change_state(struct drbd_conf *mdev, enum chg_state_flags f,
163 enum drbd_state_rv rv; 163 enum drbd_state_rv rv;
164 164
165 spin_lock_irqsave(&mdev->tconn->req_lock, flags); 165 spin_lock_irqsave(&mdev->tconn->req_lock, flags);
166 ns = apply_mask_val(mdev->state, mask, val); 166 ns = apply_mask_val(drbd_read_state(mdev), mask, val);
167 rv = _drbd_set_state(mdev, ns, f, NULL); 167 rv = _drbd_set_state(mdev, ns, f, NULL);
168 ns = mdev->state;
169 spin_unlock_irqrestore(&mdev->tconn->req_lock, flags); 168 spin_unlock_irqrestore(&mdev->tconn->req_lock, flags);
170 169
171 return rv; 170 return rv;
@@ -198,7 +197,7 @@ _req_st_cond(struct drbd_conf *mdev, union drbd_state mask,
198 return SS_CW_FAILED_BY_PEER; 197 return SS_CW_FAILED_BY_PEER;
199 198
200 spin_lock_irqsave(&mdev->tconn->req_lock, flags); 199 spin_lock_irqsave(&mdev->tconn->req_lock, flags);
201 os = mdev->state; 200 os = drbd_read_state(mdev);
202 ns = sanitize_state(mdev, apply_mask_val(os, mask, val), NULL); 201 ns = sanitize_state(mdev, apply_mask_val(os, mask, val), NULL);
203 rv = is_valid_transition(os, ns); 202 rv = is_valid_transition(os, ns);
204 if (rv == SS_SUCCESS) 203 if (rv == SS_SUCCESS)
@@ -244,7 +243,7 @@ drbd_req_state(struct drbd_conf *mdev, union drbd_state mask,
244 mutex_lock(mdev->state_mutex); 243 mutex_lock(mdev->state_mutex);
245 244
246 spin_lock_irqsave(&mdev->tconn->req_lock, flags); 245 spin_lock_irqsave(&mdev->tconn->req_lock, flags);
247 os = mdev->state; 246 os = drbd_read_state(mdev);
248 ns = sanitize_state(mdev, apply_mask_val(os, mask, val), NULL); 247 ns = sanitize_state(mdev, apply_mask_val(os, mask, val), NULL);
249 rv = is_valid_transition(os, ns); 248 rv = is_valid_transition(os, ns);
250 if (rv < SS_SUCCESS) { 249 if (rv < SS_SUCCESS) {
@@ -280,7 +279,7 @@ drbd_req_state(struct drbd_conf *mdev, union drbd_state mask,
280 goto abort; 279 goto abort;
281 } 280 }
282 spin_lock_irqsave(&mdev->tconn->req_lock, flags); 281 spin_lock_irqsave(&mdev->tconn->req_lock, flags);
283 ns = apply_mask_val(mdev->state, mask, val); 282 ns = apply_mask_val(drbd_read_state(mdev), mask, val);
284 rv = _drbd_set_state(mdev, ns, f, &done); 283 rv = _drbd_set_state(mdev, ns, f, &done);
285 } else { 284 } else {
286 rv = _drbd_set_state(mdev, ns, f, &done); 285 rv = _drbd_set_state(mdev, ns, f, &done);
@@ -812,7 +811,7 @@ __drbd_set_state(struct drbd_conf *mdev, union drbd_state ns,
812 const char *warn_sync_abort = NULL; 811 const char *warn_sync_abort = NULL;
813 struct after_state_chg_work *ascw; 812 struct after_state_chg_work *ascw;
814 813
815 os = mdev->state; 814 os = drbd_read_state(mdev);
816 815
817 ns = sanitize_state(mdev, ns, &warn_sync_abort); 816 ns = sanitize_state(mdev, ns, &warn_sync_abort);
818 if (ns.i == os.i) 817 if (ns.i == os.i)
@@ -1430,7 +1429,7 @@ conn_is_valid_transition(struct drbd_tconn *tconn, union drbd_state mask, union
1430 int vnr; 1429 int vnr;
1431 1430
1432 idr_for_each_entry(&tconn->volumes, mdev, vnr) { 1431 idr_for_each_entry(&tconn->volumes, mdev, vnr) {
1433 os = mdev->state; 1432 os = drbd_read_state(mdev);
1434 ns = sanitize_state(mdev, apply_mask_val(os, mask, val), NULL); 1433 ns = sanitize_state(mdev, apply_mask_val(os, mask, val), NULL);
1435 1434
1436 if (flags & CS_IGN_OUTD_FAIL && ns.disk == D_OUTDATED && os.disk < D_OUTDATED) 1435 if (flags & CS_IGN_OUTD_FAIL && ns.disk == D_OUTDATED && os.disk < D_OUTDATED)
@@ -1474,7 +1473,7 @@ conn_set_state(struct drbd_tconn *tconn, union drbd_state mask, union drbd_state
1474 tconn->cstate = val.conn; 1473 tconn->cstate = val.conn;
1475 1474
1476 idr_for_each_entry(&tconn->volumes, mdev, vnr) { 1475 idr_for_each_entry(&tconn->volumes, mdev, vnr) {
1477 os = mdev->state; 1476 os = drbd_read_state(mdev);
1478 ns = apply_mask_val(os, mask, val); 1477 ns = apply_mask_val(os, mask, val);
1479 ns = sanitize_state(mdev, ns, NULL); 1478 ns = sanitize_state(mdev, ns, NULL);
1480 1479
diff --git a/drivers/block/drbd/drbd_state.h b/drivers/block/drbd/drbd_state.h
index c0331f18371a..fdcfab9c1d84 100644
--- a/drivers/block/drbd/drbd_state.h
+++ b/drivers/block/drbd/drbd_state.h
@@ -48,12 +48,12 @@ struct drbd_tconn;
48 val.T2 = (S2); val.T3 = (S3); val; }) 48 val.T2 = (S2); val.T3 = (S3); val; })
49 49
50#define _NS(D, T, S) \ 50#define _NS(D, T, S) \
51 D, ({ union drbd_state __ns; __ns.i = D->state.i; __ns.T = (S); __ns; }) 51 D, ({ union drbd_state __ns; __ns = drbd_read_state(D); __ns.T = (S); __ns; })
52#define _NS2(D, T1, S1, T2, S2) \ 52#define _NS2(D, T1, S1, T2, S2) \
53 D, ({ union drbd_state __ns; __ns.i = D->state.i; __ns.T1 = (S1); \ 53 D, ({ union drbd_state __ns; __ns = drbd_read_state(D); __ns.T1 = (S1); \
54 __ns.T2 = (S2); __ns; }) 54 __ns.T2 = (S2); __ns; })
55#define _NS3(D, T1, S1, T2, S2, T3, S3) \ 55#define _NS3(D, T1, S1, T2, S2, T3, S3) \
56 D, ({ union drbd_state __ns; __ns.i = D->state.i; __ns.T1 = (S1); \ 56 D, ({ union drbd_state __ns; __ns = drbd_read_state(D); __ns.T1 = (S1); \
57 __ns.T2 = (S2); __ns.T3 = (S3); __ns; }) 57 __ns.T2 = (S2); __ns.T3 = (S3); __ns; })
58 58
59enum chg_state_flags { 59enum chg_state_flags {
diff --git a/drivers/block/drbd/drbd_worker.c b/drivers/block/drbd/drbd_worker.c
index ab73aa2fb4ee..7350466ff30c 100644
--- a/drivers/block/drbd/drbd_worker.c
+++ b/drivers/block/drbd/drbd_worker.c
@@ -781,7 +781,7 @@ int drbd_resync_finished(struct drbd_conf *mdev)
781 ping_peer(mdev); 781 ping_peer(mdev);
782 782
783 spin_lock_irq(&mdev->tconn->req_lock); 783 spin_lock_irq(&mdev->tconn->req_lock);
784 os = mdev->state; 784 os = drbd_read_state(mdev);
785 785
786 verify_done = (os.conn == C_VERIFY_S || os.conn == C_VERIFY_T); 786 verify_done = (os.conn == C_VERIFY_S || os.conn == C_VERIFY_T);
787 787
@@ -1546,7 +1546,7 @@ void drbd_start_resync(struct drbd_conf *mdev, enum drbd_conns side)
1546 } 1546 }
1547 1547
1548 write_lock_irq(&global_state_lock); 1548 write_lock_irq(&global_state_lock);
1549 ns = mdev->state; 1549 ns = drbd_read_state(mdev);
1550 1550
1551 ns.aftr_isp = !_drbd_may_sync_now(mdev); 1551 ns.aftr_isp = !_drbd_may_sync_now(mdev);
1552 1552
@@ -1558,7 +1558,7 @@ void drbd_start_resync(struct drbd_conf *mdev, enum drbd_conns side)
1558 ns.pdsk = D_INCONSISTENT; 1558 ns.pdsk = D_INCONSISTENT;
1559 1559
1560 r = __drbd_set_state(mdev, ns, CS_VERBOSE, NULL); 1560 r = __drbd_set_state(mdev, ns, CS_VERBOSE, NULL);
1561 ns = mdev->state; 1561 ns = drbd_read_state(mdev);
1562 1562
1563 if (ns.conn < C_CONNECTED) 1563 if (ns.conn < C_CONNECTED)
1564 r = SS_UNKNOWN_ERROR; 1564 r = SS_UNKNOWN_ERROR;