(os.conn == C_CONNECTED && ns.conn == C_VERIFY_S);
}
+static union drbd_state
+apply_mask_val(union drbd_state os, union drbd_state mask, union drbd_state val)
+{
+ union drbd_state ns;
+ ns.i = (os.i & ~mask.i) | val.i;
+ return ns;
+}
+
enum drbd_state_rv
drbd_change_state(struct drbd_conf *mdev, enum chg_state_flags f,
union drbd_state mask, union drbd_state val)
{
unsigned long flags;
- union drbd_state os, ns;
+ union drbd_state ns;
enum drbd_state_rv rv;
spin_lock_irqsave(&mdev->tconn->req_lock, flags);
- os = mdev->state;
- ns.i = (os.i & ~mask.i) | val.i;
+ ns = apply_mask_val(mdev->state, mask, val);
rv = _drbd_set_state(mdev, ns, f, NULL);
ns = mdev->state;
spin_unlock_irqrestore(&mdev->tconn->req_lock, flags);
spin_lock_irqsave(&mdev->tconn->req_lock, flags);
os = mdev->state;
- ns.i = (os.i & ~mask.i) | val.i;
- ns = sanitize_state(mdev, ns, NULL);
+ ns = sanitize_state(mdev, apply_mask_val(os, mask, val), NULL);
rv = is_valid_transition(os, ns);
if (rv == SS_SUCCESS)
rv = SS_UNKNOWN_ERROR; /* cont waiting, otherwise fail. */
spin_lock_irqsave(&mdev->tconn->req_lock, flags);
os = mdev->state;
- ns.i = (os.i & ~mask.i) | val.i;
- ns = sanitize_state(mdev, ns, NULL);
+ ns = sanitize_state(mdev, apply_mask_val(os, mask, val), NULL);
rv = is_valid_transition(os, ns);
if (rv < SS_SUCCESS)
goto abort;
goto abort;
}
spin_lock_irqsave(&mdev->tconn->req_lock, flags);
- os = mdev->state;
- ns.i = (os.i & ~mask.i) | val.i;
+ ns = apply_mask_val(mdev->state, mask, val);
rv = _drbd_set_state(mdev, ns, f, &done);
drbd_state_unlock(mdev);
} else {