提交 3e394da1 编写于 作者: A Andreas Gruenbacher 提交者: Philipp Reisner

drbd: Move sequence number logic into drbd_receiver.c and simplify it

These things are only used there.
Signed-off-by: NPhilipp Reisner <philipp.reisner@linbit.com>
Signed-off-by: NLars Ellenberg <lars.ellenberg@linbit.com>
上级 cc378270
......@@ -2355,33 +2355,6 @@ static inline int drbd_set_ed_uuid(struct drbd_conf *mdev, u64 val)
return changed;
}
static inline int seq_cmp(u32 a, u32 b)
{
/* we assume wrap around at 32bit.
* for wrap around at 24bit (old atomic_t),
* we'd have to
* a <<= 8; b <<= 8;
*/
return (s32)(a) - (s32)(b);
}
#define seq_lt(a, b) (seq_cmp((a), (b)) < 0)
#define seq_gt(a, b) (seq_cmp((a), (b)) > 0)
#define seq_ge(a, b) (seq_cmp((a), (b)) >= 0)
#define seq_le(a, b) (seq_cmp((a), (b)) <= 0)
/* CAUTION: please no side effects in arguments! */
#define seq_max(a, b) ((u32)(seq_gt((a), (b)) ? (a) : (b)))
static inline void update_peer_seq(struct drbd_conf *mdev, unsigned int new_seq)
{
unsigned int m;
spin_lock(&mdev->peer_seq_lock);
m = seq_max(mdev->peer_seq, new_seq);
mdev->peer_seq = m;
spin_unlock(&mdev->peer_seq_lock);
if (m == new_seq)
wake_up(&mdev->seq_wait);
}
static inline void drbd_update_congested(struct drbd_conf *mdev)
{
struct sock *sk = mdev->tconn->data.socket->sk;
......
......@@ -1621,6 +1621,33 @@ static int e_send_discard_ack(struct drbd_conf *mdev, struct drbd_work *w, int u
return ok;
}
static bool seq_greater(u32 a, u32 b)
{
/*
* We assume 32-bit wrap-around here.
* For 24-bit wrap-around, we would have to shift:
* a <<= 8; b <<= 8;
*/
return (s32)a - (s32)b > 0;
}
static u32 seq_max(u32 a, u32 b)
{
return seq_greater(a, b) ? a : b;
}
static void update_peer_seq(struct drbd_conf *mdev, unsigned int new_seq)
{
unsigned int m;
spin_lock(&mdev->peer_seq_lock);
m = seq_max(mdev->peer_seq, new_seq);
mdev->peer_seq = m;
spin_unlock(&mdev->peer_seq_lock);
if (m == new_seq)
wake_up(&mdev->seq_wait);
}
/* Called from receive_Data.
* Synchronize packets on sock with packets on msock.
*
......@@ -1651,7 +1678,7 @@ static int drbd_wait_peer_seq(struct drbd_conf *mdev, const u32 packet_seq)
spin_lock(&mdev->peer_seq_lock);
for (;;) {
prepare_to_wait(&mdev->seq_wait, &wait, TASK_INTERRUPTIBLE);
if (seq_le(packet_seq, mdev->peer_seq+1))
if (!seq_greater(packet_seq, mdev->peer_seq + 1))
break;
if (signal_pending(current)) {
ret = -ERESTARTSYS;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册