UNPLUG_REMOTE, /* sending a "UnplugRemote" could help */
MD_DIRTY, /* current uuids and flags not yet on disk */
USE_DEGR_WFC_T, /* degr-wfc-timeout instead of wfc-timeout. */
- CLUSTER_ST_CHANGE, /* Cluster wide state change going on... */
CL_ST_CHG_SUCCESS,
CL_ST_CHG_FAIL,
CRASHED_PRIMARY, /* This node was a crashed primary.
return 0;
}
-
-
-
-
-
-static inline void drbd_state_lock(struct drbd_conf *mdev)
-{
- wait_event(mdev->misc_wait,
- !test_and_set_bit(CLUSTER_ST_CHANGE, &mdev->flags));
-}
-
-static inline void drbd_state_unlock(struct drbd_conf *mdev)
-{
- clear_bit(CLUSTER_ST_CHANGE, &mdev->flags);
- wake_up(&mdev->misc_wait);
-}
-
static inline enum drbd_state_rv
_drbd_set_state(struct drbd_conf *mdev, union drbd_state ns,
enum chg_state_flags flags, struct completion *done)
ongoing cluster wide state change is finished. That is important if
we are primary and are detaching from our disk. We need to see the
new disk state... */
- wait_event(mdev->misc_wait, !test_bit(CLUSTER_ST_CHANGE, &mdev->flags));
+ mutex_lock(&mdev->state_mutex);
+ mutex_unlock(&mdev->state_mutex);
if (mdev->state.conn >= C_CONNECTED && mdev->state.disk < D_INCONSISTENT)
updated_uuids |= drbd_set_ed_uuid(mdev, p_uuid[UI_CURRENT]);
val.i = be32_to_cpu(p->val);
if (test_bit(DISCARD_CONCURRENT, &mdev->tconn->flags) &&
- test_bit(CLUSTER_ST_CHANGE, &mdev->flags)) {
+ mutex_is_locked(&mdev->state_mutex)) {
drbd_send_sr_reply(mdev, SS_CONCURRENT_ST_CHG);
return true;
}
goto abort;
}
- drbd_state_lock(mdev);
if (!drbd_send_state_req(mdev, mask, val)) {
- drbd_state_unlock(mdev);
rv = SS_CW_FAILED_BY_PEER;
if (f & CS_VERBOSE)
print_st_err(mdev, os, ns, rv);
(rv = _req_st_cond(mdev, mask, val)));
if (rv < SS_SUCCESS) {
- drbd_state_unlock(mdev);
if (f & CS_VERBOSE)
print_st_err(mdev, os, ns, rv);
goto abort;
spin_lock_irqsave(&mdev->tconn->req_lock, flags);
ns = apply_mask_val(mdev->state, mask, val);
rv = _drbd_set_state(mdev, ns, f, &done);
- drbd_state_unlock(mdev);
} else {
rv = _drbd_set_state(mdev, ns, f, &done);
}
}
if (current == mdev->tconn->worker.task) {
- /* The worker should not sleep waiting for drbd_state_lock(),
+ /* The worker should not sleep waiting for state_mutex,
that can take long */
- if (test_and_set_bit(CLUSTER_ST_CHANGE, &mdev->flags)) {
+ if (!mutex_trylock(&mdev->state_mutex)) {
set_bit(B_RS_H_DONE, &mdev->flags);
mdev->start_resync_timer.expires = jiffies + HZ/5;
add_timer(&mdev->start_resync_timer);
return;
}
} else {
- drbd_state_lock(mdev);
+ mutex_lock(&mdev->state_mutex);
}
clear_bit(B_RS_H_DONE, &mdev->flags);
if (!get_ldev_if_state(mdev, D_NEGOTIATING)) {
- drbd_state_unlock(mdev);
+ mutex_unlock(&mdev->state_mutex);
return;
}
drbd_md_sync(mdev);
}
put_ldev(mdev);
- drbd_state_unlock(mdev);
+ mutex_unlock(&mdev->state_mutex);
}
static int _worker_dying(int vnr, void *p, void *data)