summaryrefslogtreecommitdiffstats
path: root/drivers/block/drbd/drbd_state.c
diff options
context:
space:
mode:
authorPhilipp Reisner2011-02-16 14:57:50 +0100
committerPhilipp Reisner2011-09-28 10:33:22 +0200
commit56707f9e873108c0173b4edf20ea452e1d2a89d2 (patch)
tree809b85d3ff3dfdd2bf77f1b3bd20d862c75f1780 /drivers/block/drbd/drbd_state.c
parentdrbd: Removed the os parameter form sanitize_state() (diff)
downloadkernel-qcow2-linux-56707f9e873108c0173b4edf20ea452e1d2a89d2.tar.gz
kernel-qcow2-linux-56707f9e873108c0173b4edf20ea452e1d2a89d2.tar.xz
kernel-qcow2-linux-56707f9e873108c0173b4edf20ea452e1d2a89d2.zip
drbd: Code de-duplication; new function apply_mask_val()
Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
Diffstat (limited to 'drivers/block/drbd/drbd_state.c')
-rw-r--r--drivers/block/drbd/drbd_state.c22
1 files changed, 13 insertions, 9 deletions
diff --git a/drivers/block/drbd/drbd_state.c b/drivers/block/drbd/drbd_state.c
index 02516ed9127c..0100aab1288d 100644
--- a/drivers/block/drbd/drbd_state.c
+++ b/drivers/block/drbd/drbd_state.c
@@ -69,17 +69,24 @@ static int cl_wide_st_chg(struct drbd_conf *mdev,
(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);
@@ -115,8 +122,7 @@ _req_st_cond(struct drbd_conf *mdev, union drbd_state mask,
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. */
@@ -162,8 +168,7 @@ drbd_req_state(struct drbd_conf *mdev, union drbd_state mask,
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;
@@ -199,8 +204,7 @@ drbd_req_state(struct drbd_conf *mdev, union drbd_state mask,
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 {