From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-m3163.qiye.163.com (mail-m3163.qiye.163.com [103.74.31.63]) by mail19.linbit.com (LINBIT Mail Daemon) with ESMTP id 6AEAA421023 for ; Wed, 21 Sep 2022 11:15:30 +0200 (CEST) From: Rui Xu To: philipp.reisner@linbit.com, drbd-dev@lists.linbit.com, joel.colledge@linbit.com Date: Wed, 21 Sep 2022 17:07:10 +0800 Message-Id: <20220921090710.2238953-1-rui.xu@easystack.cn> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Cc: Rui Xu , dongsheng.yang@easystack.cn Subject: [Drbd-dev] [PATCH] drbd: fix a bug of got_peer_ack List-Id: "*Coordination* of development, patches, contributions -- *Questions* \(even to developers\) go to drbd-user, please." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Consider a scenrio that io is ongoing and the backing disk of secondary drbd suddenly broken. Some requset from primary node will not be processed in receive_Data since there is no ldev. And primary node will send peer_ack to secondary node for those requsets, but the secondary node will not find these requests in got_peer_ack. The first problem caused by this bug is that the two nodes will be disconnected, and the second problem is that some peer requests can't be destroyed. Fix it by find the last peer request on peer_requests list and then the remaining requests on the list will be destroyed. Signed-off-by: Rui Xu --- drbd/drbd_receiver.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/drbd/drbd_receiver.c b/drbd/drbd_receiver.c index 656d4eced..b63e83f52 100644 --- a/drbd/drbd_receiver.c +++ b/drbd/drbd_receiver.c @@ -9343,6 +9343,13 @@ static int got_peer_ack(struct drbd_connection *connection, struct packet_info * if (dagtag == peer_req->dagtag_sector) goto found; } + + list_for_each_entry(peer_req, &connection->peer_requests, recv_order) { + if (peer_req->dagtag_sector == atomic64_read(&connection->last_dagtag_sector)) { + drbd_info(connection, "peer request with last dagtag sector %llu has found\n", peer_req->dagtag_sector); + goto found; + } + } spin_unlock_irq(&connection->peer_reqs_lock); drbd_err(connection, "peer request with dagtag %llu not found\n", dagtag); -- 2.25.1