diff options
author | Philipp Reisner <philipp.reisner@linbit.com> | 2011-03-28 09:40:12 -0400 |
---|---|---|
committer | Philipp Reisner <philipp.reisner@linbit.com> | 2012-11-08 10:45:03 -0500 |
commit | 78bae59b1b7bc06c84e292e9ecf42c013723e057 (patch) | |
tree | 1deebbe72eab1b40c6b61f41c369c38e29fa816f /drivers/block/drbd | |
parent | e15766e9c94f7fa3396eff4ffbbf30dea8c0e22a (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.h | 9 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_nl.c | 5 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_receiver.c | 6 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_state.c | 15 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_state.h | 6 | ||||
-rw-r--r-- | drivers/block/drbd/drbd_worker.c | 6 |
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 | ||
1685 | static 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__) |
1686 | static inline void __drbd_chk_io_error_(struct drbd_conf *mdev, int forcedetach, const char *where) | 1695 | static 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 | ||
59 | enum chg_state_flags { | 59 | enum 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; |