forked from Minki/linux
drbd: Fix comparison of is_valid_transition()'s return code
is_valid_transition() might return SS_NOTHING_TO_DO. The condition function _req_st_cond() returned SS_NOTHING_TO_DO, which caused the wait_event to abort too early. Therefore drbd_req_state() did not consume the next CL_ST_CHG_SUCCESS or SS_CW_FAILED_BY_PEER causing serve disruption of the state machine logic... Detaching from a single volue was one way to trigger this bug. Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
This commit is contained in:
parent
1393b59f8c
commit
a3025a2737
@ -277,16 +277,16 @@ _req_st_cond(struct drbd_conf *mdev, union drbd_state mask,
|
||||
os = drbd_read_state(mdev);
|
||||
ns = sanitize_state(mdev, apply_mask_val(os, mask, val), NULL);
|
||||
rv = is_valid_transition(os, ns);
|
||||
if (rv == SS_SUCCESS)
|
||||
if (rv >= SS_SUCCESS)
|
||||
rv = SS_UNKNOWN_ERROR; /* cont waiting, otherwise fail. */
|
||||
|
||||
if (!cl_wide_st_chg(mdev, os, ns))
|
||||
rv = SS_CW_NO_NEED;
|
||||
if (rv == SS_UNKNOWN_ERROR) {
|
||||
rv = is_valid_state(mdev, ns);
|
||||
if (rv == SS_SUCCESS) {
|
||||
if (rv >= SS_SUCCESS) {
|
||||
rv = is_valid_soft_transition(os, ns, mdev->tconn);
|
||||
if (rv == SS_SUCCESS)
|
||||
if (rv >= SS_SUCCESS)
|
||||
rv = SS_UNKNOWN_ERROR; /* cont waiting, otherwise fail. */
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user