From nobody Sat Apr 11 05:40:16 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 57FECC7EE30 for ; Thu, 2 Mar 2023 12:55:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229928AbjCBMzb (ORCPT ); Thu, 2 Mar 2023 07:55:31 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52546 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229896AbjCBMz2 (ORCPT ); Thu, 2 Mar 2023 07:55:28 -0500 Received: from mail-ed1-x52f.google.com (mail-ed1-x52f.google.com [IPv6:2a00:1450:4864:20::52f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 20681196B9 for ; Thu, 2 Mar 2023 04:55:27 -0800 (PST) Received: by mail-ed1-x52f.google.com with SMTP id cw28so18022742edb.5 for ; Thu, 02 Mar 2023 04:55:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linbit-com.20210112.gappssmtp.com; s=20210112; t=1677761725; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=54k/F/kd1jw+ZRVo2rfRXmr6Q0n6AeiP/4wU154+q3M=; b=DiYufgsNUoUuET376YLirzNgz4MVoF9JGtbOLkgT9k9ZJD35xX57JvfCvzvTT7g+BM 2VMDCUs2GtxDAM0nBW6VRfnbt9NmMM58l2kJ+BNWAxLG4I7dRVN4MAw5/XZWjRMPZ3YR to1KACqfwGfqC8mvdRQ6Vpu7XE7ULLgmMLBUoQWJKc8WQ5Wc65+kkPNBwwveSN9Zl6dA KYI1BuagHWj57GzPc96lXU2WqQD3Zrsh9+jiotUGPmBTJdrlIx4Erqv8XW4a6JaFsDyO 0E+Wo4giVsNhttMqArV20tgQaWpNYnv4T7C8+hqwiBc+WI+iWL7hbbPUlGJm2MsCYW4A SLTQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1677761725; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=54k/F/kd1jw+ZRVo2rfRXmr6Q0n6AeiP/4wU154+q3M=; b=NCp4+Zf3VytbSzvPUkg0jdYiRAjpnpoXVt+/KEbjxbQsDjvdFI3q3QLeZMx2uYS2Oo aNltzgW5UF/oISFaptqmQv5gIEMchfyyAR5jk4iI5n22tpdsOJD+ZP80WYovbavuTARj /XmFBhz/zE7ZYNtqSgRHm3RYM/IqpvfOWa+f6QR2UftUhiPPxShWNJXtQ0x/DiF0+E6A u0jfeUhZ8u265XSgTXCwoYpyW6E4AQ2PXwFjKtQRy5Nj8vLxCAx4dGyvINUYxRllEgob ic3v1XOIPYY0m3LY++4MEu//6KlLqTa8wAGBPxFkVFOIorrNAnY002ZK25U5G8mqTopo yI+A== X-Gm-Message-State: AO0yUKVNa5Dnf35tcSK8j3yQlK77U6ql3HTwNY+QL0jhxMluuSUecC9Z pJIGmlG0p0XBTI0HKQmMbUbOcQ== X-Google-Smtp-Source: AK7set/8pIVyuXgKoQRPGW3GjFFjUmIZqdaOxXk1X6aOFM5g3/5F089uBAXT394Gy23mPnOOYs6zpg== X-Received: by 2002:a17:906:468d:b0:8b1:353a:2636 with SMTP id a13-20020a170906468d00b008b1353a2636mr11122371ejr.14.1677761725603; Thu, 02 Mar 2023 04:55:25 -0800 (PST) Received: from localhost.localdomain (h082218028181.host.wavenet.at. [82.218.28.181]) by smtp.gmail.com with ESMTPSA id a98-20020a509eeb000000b004ad601533a3sm6955034edf.55.2023.03.02.04.55.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:55:24 -0800 (PST) From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?= To: Jens Axboe Cc: drbd-dev@lists.linbit.com, linux-kernel@vger.kernel.org, Lars Ellenberg , Philipp Reisner , linux-block@vger.kernel.org, =?UTF-8?q?Christoph=20B=C3=B6hmwalder?= Subject: [PATCH v2 1/7] genetlink: make _genl_cmd_to_str static Date: Thu, 2 Mar 2023 13:54:39 +0100 Message-Id: <20230302125445.2653493-2-christoph.boehmwalder@linbit.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302125445.2653493-1-christoph.boehmwalder@linbit.com> References: <20230302125445.2653493-1-christoph.boehmwalder@linbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Primarily to silence warnings like: warning: no previous prototype for 'xxx_genl_cmd_to_str' [-Wmissing-prototy= pes] Signed-off-by: Christoph B=C3=B6hmwalder --- include/linux/genl_magic_func.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/linux/genl_magic_func.h b/include/linux/genl_magic_fun= c.h index 4a4b387181ad..2984b0cb24b1 100644 --- a/include/linux/genl_magic_func.h +++ b/include/linux/genl_magic_func.h @@ -209,7 +209,7 @@ static int s_name ## _from_attrs_for_change(struct s_na= me *s, \ * Magic: define op number to op name mapping {{{1 * {{{2 */ -const char *CONCAT_(GENL_MAGIC_FAMILY, _genl_cmd_to_str)(__u8 cmd) +static const char *CONCAT_(GENL_MAGIC_FAMILY, _genl_cmd_to_str)(__u8 cmd) { switch (cmd) { #undef GENL_op --=20 2.39.1 From nobody Sat Apr 11 05:40:16 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 634EEC678D4 for ; Thu, 2 Mar 2023 12:55:36 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229728AbjCBMze (ORCPT ); Thu, 2 Mar 2023 07:55:34 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52616 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229751AbjCBMza (ORCPT ); Thu, 2 Mar 2023 07:55:30 -0500 Received: from mail-ed1-x533.google.com (mail-ed1-x533.google.com [IPv6:2a00:1450:4864:20::533]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 227EEAD34 for ; Thu, 2 Mar 2023 04:55:28 -0800 (PST) Received: by mail-ed1-x533.google.com with SMTP id o12so67112075edb.9 for ; Thu, 02 Mar 2023 04:55:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linbit-com.20210112.gappssmtp.com; s=20210112; t=1677761726; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=4P+RPLywpWRpuXMP+b0VdhJHn8q4YXA5NPmEVVhViGs=; b=xsbXLGVMB0BEySbmuZ4OPbz54jIQrq9L8n+vgdNwdHVZChDW1eXmofRZ2XwzaUaDes Fe6ThvsEHdUip+LQxNazRFqukSssQRL2GDL4p4Gs3PzGLXtttvg5UC5cUj4dQfblsn+0 AhUsqK/EZP7w8hKhMxwj4L4LTeQ6vhwpguMpWc49rpHZNvTptUZRRYk7WZEiaYVBs3aO GXOujLfVO0z5FhPSbeyIsAgyTX9E7t05/+9jdjBZSXWFQ4IF2bpl638GSsA1WqdrpSRi IHgaDSorhNPpMGp2hK3GqLZcNboSRr3S5UV2DrCmn4XtZ+RifH66LMMMgIwc0LFh7GMm dgRw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1677761726; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=4P+RPLywpWRpuXMP+b0VdhJHn8q4YXA5NPmEVVhViGs=; b=RtESvVvznk7H+KsDehgffCCvgUw8Rf2D+9hvsIBpFMZ4vDBYIOk02f0RxFBraHle0/ oBxlm3jN+eahHqx0MVyTxrlWSCDm9g3uN766pDocTtTbeQDiICQweCfGMa2RvBS+Q3uU UmMwlYPH0FrDTysaw3sd000iYVbUEzu/amfvvggSaNljV8Pxqa0piXEhGh9APDBI8TXN m4cJo8szZbfWwN0Pf7A0uJcNlELlpAHGbtlhEcU+nnslitVwRHIublPbV0OBOPzkjAtJ 2nH//eLwri6IzenVsYfkN1N3kvGsBhb2ETYD9Rx2P/tZgLGYs7GsaxDIK8OTN8mKDK0X pC1w== X-Gm-Message-State: AO0yUKWwYvmlJzmSaUzM5wrajMt7n99mR2B6YQ7nAMVvAB/pe1bmjdiK 03KVpwLkpkfGYTmU5K6yxJ2Aag== X-Google-Smtp-Source: AK7set/vznYuGtYbneGdvQ3uPKcuduB1qZLZKGGKrTPOJ9o6F4TkOUUHVZ4T2KJxjTqi422S9g3/RA== X-Received: by 2002:aa7:d612:0:b0:4c0:9bd7:54cc with SMTP id c18-20020aa7d612000000b004c09bd754ccmr1244162edr.11.1677761726641; Thu, 02 Mar 2023 04:55:26 -0800 (PST) Received: from localhost.localdomain (h082218028181.host.wavenet.at. [82.218.28.181]) by smtp.gmail.com with ESMTPSA id a98-20020a509eeb000000b004ad601533a3sm6955034edf.55.2023.03.02.04.55.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:55:26 -0800 (PST) From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?= To: Jens Axboe Cc: drbd-dev@lists.linbit.com, linux-kernel@vger.kernel.org, Lars Ellenberg , Philipp Reisner , linux-block@vger.kernel.org, Andreas Gruenbacher , =?UTF-8?q?Christoph=20B=C3=B6hmwalder?= Subject: [PATCH v2 2/7] drbd: Rip out the ERR_IF_CNT_IS_NEGATIVE macro Date: Thu, 2 Mar 2023 13:54:40 +0100 Message-Id: <20230302125445.2653493-3-christoph.boehmwalder@linbit.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302125445.2653493-1-christoph.boehmwalder@linbit.com> References: <20230302125445.2653493-1-christoph.boehmwalder@linbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Andreas Gruenbacher Signed-off-by: Andreas Gruenbacher Signed-off-by: Christoph B=C3=B6hmwalder --- drivers/block/drbd/drbd_int.h | 37 ++++++++++++++--------------------- 1 file changed, 15 insertions(+), 22 deletions(-) diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h index d89b7d03d4c8..772023ace749 100644 --- a/drivers/block/drbd/drbd_int.h +++ b/drivers/block/drbd/drbd_int.h @@ -1918,18 +1918,14 @@ static inline void inc_ap_pending(struct drbd_devic= e *device) atomic_inc(&device->ap_pending_cnt); } =20 -#define ERR_IF_CNT_IS_NEGATIVE(which, func, line) \ - if (atomic_read(&device->which) < 0) \ - drbd_err(device, "in %s:%d: " #which " =3D %d < 0 !\n", \ - func, line, \ - atomic_read(&device->which)) - -#define dec_ap_pending(device) _dec_ap_pending(device, __func__, __LINE__) -static inline void _dec_ap_pending(struct drbd_device *device, const char = *func, int line) +#define dec_ap_pending(device) ((void)expect((device), __dec_ap_pending(de= vice) >=3D 0)) +static inline int __dec_ap_pending(struct drbd_device *device) { - if (atomic_dec_and_test(&device->ap_pending_cnt)) + int ap_pending_cnt =3D atomic_dec_return(&device->ap_pending_cnt); + + if (ap_pending_cnt =3D=3D 0) wake_up(&device->misc_wait); - ERR_IF_CNT_IS_NEGATIVE(ap_pending_cnt, func, line); + return ap_pending_cnt; } =20 /* counts how many resync-related answers we still expect from the peer @@ -1943,11 +1939,10 @@ static inline void inc_rs_pending(struct drbd_devic= e *device) atomic_inc(&device->rs_pending_cnt); } =20 -#define dec_rs_pending(device) _dec_rs_pending(device, __func__, __LINE__) -static inline void _dec_rs_pending(struct drbd_device *device, const char = *func, int line) +#define dec_rs_pending(device) ((void)expect((device), __dec_rs_pending(de= vice) >=3D 0)) +static inline int __dec_rs_pending(struct drbd_device *device) { - atomic_dec(&device->rs_pending_cnt); - ERR_IF_CNT_IS_NEGATIVE(rs_pending_cnt, func, line); + return atomic_dec_return(&device->rs_pending_cnt); } =20 /* counts how many answers we still need to send to the peer. @@ -1964,18 +1959,16 @@ static inline void inc_unacked(struct drbd_device *= device) atomic_inc(&device->unacked_cnt); } =20 -#define dec_unacked(device) _dec_unacked(device, __func__, __LINE__) -static inline void _dec_unacked(struct drbd_device *device, const char *fu= nc, int line) +#define dec_unacked(device) ((void)expect(device, __dec_unacked(device) >= =3D 0)) +static inline int __dec_unacked(struct drbd_device *device) { - atomic_dec(&device->unacked_cnt); - ERR_IF_CNT_IS_NEGATIVE(unacked_cnt, func, line); + return atomic_dec_return(&device->unacked_cnt); } =20 -#define sub_unacked(device, n) _sub_unacked(device, n, __func__, __LINE__) -static inline void _sub_unacked(struct drbd_device *device, int n, const c= har *func, int line) +#define sub_unacked(device, n) ((void)expect(device, __sub_unacked(device)= >=3D 0)) +static inline int __sub_unacked(struct drbd_device *device, int n) { - atomic_sub(n, &device->unacked_cnt); - ERR_IF_CNT_IS_NEGATIVE(unacked_cnt, func, line); + return atomic_sub_return(n, &device->unacked_cnt); } =20 static inline bool is_sync_target_state(enum drbd_conns connection_state) --=20 2.39.1 From nobody Sat Apr 11 05:40:16 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 398DDC6FA8E for ; Thu, 2 Mar 2023 12:56:11 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229925AbjCBM4J (ORCPT ); Thu, 2 Mar 2023 07:56:09 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52740 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229950AbjCBMze (ORCPT ); Thu, 2 Mar 2023 07:55:34 -0500 Received: from mail-ed1-x52c.google.com (mail-ed1-x52c.google.com [IPv6:2a00:1450:4864:20::52c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DBF2E35B8 for ; Thu, 2 Mar 2023 04:55:29 -0800 (PST) Received: by mail-ed1-x52c.google.com with SMTP id f13so67177269edz.6 for ; Thu, 02 Mar 2023 04:55:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linbit-com.20210112.gappssmtp.com; s=20210112; t=1677761728; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=UaJTm5229yrEXubUNP5BlvhXsOlTa5vI/ZiuzzVczOs=; b=nrSf03EQ12I9MGmauo6h0BDCrlvgIwD8zJQazlNEMPCA5Rxj+I84hPJHXyKFe9sbiR ywgqpGEm8qmzXn5bgtGdUOpOO0sHkEmIDR0saJSBO3sF8pFqef1FL7VremvbqXKy0um7 oW1mNwebO451KaEKpnCaWfj35B4VPGDNWZebus8wALi9xDTUjZLieUiZhUe/HZ0SB5sL HxBB0vnDoEo1YlMlM4UuvvT7njmBwcU5IaoQbhRLbXl8SgdE3fFS+JKViReLXkxdkjXn /vxHbNnQXpra3BAND5MkOcs/ZnhoNavw4ddOlcGdfTQcSmXINVeyj3CYJzqmxIM43yxM tVdQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1677761728; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=UaJTm5229yrEXubUNP5BlvhXsOlTa5vI/ZiuzzVczOs=; b=C+lqSoI8UfZSKy4QdvHiTVIFkfmQmKkV7A3GjMuOqCdun6qzyvdD2N4Rh/q3//azhn +oq7Eynr2lpBC/W2UrFN2/tXurPwfTFiXug21rX4rmsyFdFHL7pBLyifrAEE+BDejMo/ jSJ3dHnbU1BoDPS/EknyWcf4zPUIKcaA9HMkfHVHOpp8Z5sBkaVEQTT5ITLAUMZWrAGh f0KxgpFgmuyb5FFz9OYHVtsUejLa4eIYJN4EruVwn1A942aMg7WZtzVO7vvLw0e/GD9Z xBjs35TiTPulwfF09rX5QkfUC5/PcKq9fqTm03Jw7tlFYNnWgmx8zU4EO7/268rSQIZ5 pxAw== X-Gm-Message-State: AO0yUKXtmpKSqNSpptoIApsdx6dw4nwulsXzZYu+DqJQrNfJ3mYR6mYK mpmRF84s2mWG7zXPcaeXfPOAaw== X-Google-Smtp-Source: AK7set/gO/C+StERSREkVC9HCS1ahuWk9uT9Fy53EKlngR1qJ/Y8ZU8/NbtoV4FVUXmZyvAlpr0Kxw== X-Received: by 2002:aa7:de99:0:b0:4ad:7c30:2596 with SMTP id j25-20020aa7de99000000b004ad7c302596mr10156513edv.3.1677761728172; Thu, 02 Mar 2023 04:55:28 -0800 (PST) Received: from localhost.localdomain (h082218028181.host.wavenet.at. [82.218.28.181]) by smtp.gmail.com with ESMTPSA id a98-20020a509eeb000000b004ad601533a3sm6955034edf.55.2023.03.02.04.55.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:55:27 -0800 (PST) From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?= To: Jens Axboe Cc: drbd-dev@lists.linbit.com, linux-kernel@vger.kernel.org, Lars Ellenberg , Philipp Reisner , linux-block@vger.kernel.org, Andreas Gruenbacher , =?UTF-8?q?Christoph=20B=C3=B6hmwalder?= Subject: [PATCH v2 3/7] drbd: Add peer device parameter to whole-bitmap I/O handlers Date: Thu, 2 Mar 2023 13:54:41 +0100 Message-Id: <20230302125445.2653493-4-christoph.boehmwalder@linbit.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302125445.2653493-1-christoph.boehmwalder@linbit.com> References: <20230302125445.2653493-1-christoph.boehmwalder@linbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Andreas Gruenbacher Pass a peer device parameter through the bitmap I/O functions to the I/O handlers. In after_state_ch(), set that parameter when queuing the drbd_send_bitmap operation so that this operation knows where to send the bitmap. Signed-off-by: Andreas Gruenbacher Signed-off-by: Christoph B=C3=B6hmwalder --- drivers/block/drbd/drbd_bitmap.c | 13 ++++--- drivers/block/drbd/drbd_int.h | 39 ++++++++++++-------- drivers/block/drbd/drbd_main.c | 57 ++++++++++++++++++------------ drivers/block/drbd/drbd_nl.c | 19 +++++----- drivers/block/drbd/drbd_receiver.c | 8 ++--- drivers/block/drbd/drbd_state.c | 19 +++++----- drivers/block/drbd/drbd_worker.c | 3 +- 7 files changed, 96 insertions(+), 62 deletions(-) diff --git a/drivers/block/drbd/drbd_bitmap.c b/drivers/block/drbd/drbd_bit= map.c index 289876ffbc31..6ac8c54b44c7 100644 --- a/drivers/block/drbd/drbd_bitmap.c +++ b/drivers/block/drbd/drbd_bitmap.c @@ -1216,7 +1216,9 @@ static int bm_rw(struct drbd_device *device, const un= signed int flags, unsigned * drbd_bm_read() - Read the whole bitmap from its on disk location. * @device: DRBD device. */ -int drbd_bm_read(struct drbd_device *device) __must_hold(local) +int drbd_bm_read(struct drbd_device *device, + struct drbd_peer_device *peer_device) __must_hold(local) + { return bm_rw(device, BM_AIO_READ, 0); } @@ -1227,7 +1229,8 @@ int drbd_bm_read(struct drbd_device *device) __must_h= old(local) * * Will only write pages that have changed since last IO. */ -int drbd_bm_write(struct drbd_device *device) __must_hold(local) +int drbd_bm_write(struct drbd_device *device, + struct drbd_peer_device *peer_device) __must_hold(local) { return bm_rw(device, 0, 0); } @@ -1238,7 +1241,8 @@ int drbd_bm_write(struct drbd_device *device) __must_= hold(local) * * Will write all pages. */ -int drbd_bm_write_all(struct drbd_device *device) __must_hold(local) +int drbd_bm_write_all(struct drbd_device *device, + struct drbd_peer_device *peer_device) __must_hold(local) { return bm_rw(device, BM_AIO_WRITE_ALL_PAGES, 0); } @@ -1264,7 +1268,8 @@ int drbd_bm_write_lazy(struct drbd_device *device, un= signed upper_idx) __must_ho * verify is aborted due to a failed peer disk, while local IO continues, = or * pending resync acks are still being processed. */ -int drbd_bm_write_copy_pages(struct drbd_device *device) __must_hold(local) +int drbd_bm_write_copy_pages(struct drbd_device *device, + struct drbd_peer_device *peer_device) __must_hold(local) { return bm_rw(device, BM_AIO_COPY_PAGES, 0); } diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h index 772023ace749..7bd10089bfc9 100644 --- a/drivers/block/drbd/drbd_int.h +++ b/drivers/block/drbd/drbd_int.h @@ -66,6 +66,7 @@ extern int drbd_proc_details; =20 struct drbd_device; struct drbd_connection; +struct drbd_peer_device; =20 /* Defines to control fault insertion */ enum { @@ -541,9 +542,10 @@ struct drbd_md_io { =20 struct bm_io_work { struct drbd_work w; + struct drbd_peer_device *peer_device; char *why; enum bm_flag flags; - int (*io_fn)(struct drbd_device *device); + int (*io_fn)(struct drbd_device *device, struct drbd_peer_device *peer_de= vice); void (*done)(struct drbd_device *device, int rv); }; =20 @@ -1041,7 +1043,7 @@ extern int drbd_send_drequest_csum(struct drbd_peer_d= evice *, sector_t sector, enum drbd_packet cmd); extern int drbd_send_ov_request(struct drbd_peer_device *, sector_t sector= , int size); =20 -extern int drbd_send_bitmap(struct drbd_device *device); +extern int drbd_send_bitmap(struct drbd_device *device, struct drbd_peer_d= evice *peer_device); extern void drbd_send_sr_reply(struct drbd_peer_device *, enum drbd_state_= rv retcode); extern void conn_send_sr_reply(struct drbd_connection *connection, enum dr= bd_state_rv retcode); extern int drbd_send_rs_deallocated(struct drbd_peer_device *, struct drbd= _peer_request *); @@ -1065,17 +1067,22 @@ extern void drbd_md_clear_flag(struct drbd_device *= device, int flags)__must_hold extern int drbd_md_test_flag(struct drbd_backing_dev *, int); extern void drbd_md_mark_dirty(struct drbd_device *device); extern void drbd_queue_bitmap_io(struct drbd_device *device, - int (*io_fn)(struct drbd_device *), + int (*io_fn)(struct drbd_device *, struct drbd_peer_device *), void (*done)(struct drbd_device *, int), - char *why, enum bm_flag flags); + char *why, enum bm_flag flags, + struct drbd_peer_device *peer_device); extern int drbd_bitmap_io(struct drbd_device *device, - int (*io_fn)(struct drbd_device *), - char *why, enum bm_flag flags); + int (*io_fn)(struct drbd_device *, struct drbd_peer_device *), + char *why, enum bm_flag flags, + struct drbd_peer_device *peer_device); extern int drbd_bitmap_io_from_worker(struct drbd_device *device, - int (*io_fn)(struct drbd_device *), - char *why, enum bm_flag flags); -extern int drbd_bmio_set_n_write(struct drbd_device *device) __must_hold(l= ocal); -extern int drbd_bmio_clear_n_write(struct drbd_device *device) __must_hold= (local); + int (*io_fn)(struct drbd_device *, struct drbd_peer_device *), + char *why, enum bm_flag flags, + struct drbd_peer_device *peer_device); +extern int drbd_bmio_set_n_write(struct drbd_device *device, + struct drbd_peer_device *peer_device) __must_hold(local); +extern int drbd_bmio_clear_n_write(struct drbd_device *device, + struct drbd_peer_device *peer_device) __must_hold(local); =20 /* Meta data layout * @@ -1284,14 +1291,18 @@ extern void _drbd_bm_set_bits(struct drbd_device *d= evice, const unsigned long s, const unsigned long e); extern int drbd_bm_test_bit(struct drbd_device *device, unsigned long bit= nr); extern int drbd_bm_e_weight(struct drbd_device *device, unsigned long enr= ); -extern int drbd_bm_read(struct drbd_device *device) __must_hold(local); +extern int drbd_bm_read(struct drbd_device *device, + struct drbd_peer_device *peer_device) __must_hold(local); extern void drbd_bm_mark_for_writeout(struct drbd_device *device, int page= _nr); -extern int drbd_bm_write(struct drbd_device *device) __must_hold(local); +extern int drbd_bm_write(struct drbd_device *device, + struct drbd_peer_device *peer_device) __must_hold(local); extern void drbd_bm_reset_al_hints(struct drbd_device *device) __must_hold= (local); extern int drbd_bm_write_hinted(struct drbd_device *device) __must_hold(l= ocal); extern int drbd_bm_write_lazy(struct drbd_device *device, unsigned upper_= idx) __must_hold(local); -extern int drbd_bm_write_all(struct drbd_device *device) __must_hold(local= ); -extern int drbd_bm_write_copy_pages(struct drbd_device *device) __must_ho= ld(local); +extern int drbd_bm_write_all(struct drbd_device *device, + struct drbd_peer_device *peer_device) __must_hold(local); +extern int drbd_bm_write_copy_pages(struct drbd_device *device, + struct drbd_peer_device *peer_device) __must_hold(local); extern size_t drbd_bm_words(struct drbd_device *device); extern unsigned long drbd_bm_bits(struct drbd_device *device); extern sector_t drbd_bm_capacity(struct drbd_device *device); diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c index 2c764f7ee4a7..178a7ae40af8 100644 --- a/drivers/block/drbd/drbd_main.c +++ b/drivers/block/drbd/drbd_main.c @@ -1198,10 +1198,11 @@ static int fill_bitmap_rle_bits(struct drbd_device = *device, * code upon failure. */ static int -send_bitmap_rle_or_plain(struct drbd_device *device, struct bm_xfer_ctx *c) +send_bitmap_rle_or_plain(struct drbd_peer_device *peer_device, struct bm_x= fer_ctx *c) { - struct drbd_socket *sock =3D &first_peer_device(device)->connection->data; - unsigned int header_size =3D drbd_header_size(first_peer_device(device)->= connection); + struct drbd_device *device =3D peer_device->device; + struct drbd_socket *sock =3D &peer_device->connection->data; + unsigned int header_size =3D drbd_header_size(peer_device->connection); struct p_compressed_bm *p =3D sock->sbuf + header_size; int len, err; =20 @@ -1212,7 +1213,7 @@ send_bitmap_rle_or_plain(struct drbd_device *device, = struct bm_xfer_ctx *c) =20 if (len) { dcbp_set_code(p, RLE_VLI_Bits); - err =3D __send_command(first_peer_device(device)->connection, device->vn= r, sock, + err =3D __send_command(peer_device->connection, device->vnr, sock, P_COMPRESSED_BITMAP, sizeof(*p) + len, NULL, 0); c->packets[0]++; @@ -1233,7 +1234,8 @@ send_bitmap_rle_or_plain(struct drbd_device *device, = struct bm_xfer_ctx *c) len =3D num_words * sizeof(*p); if (len) drbd_bm_get_lel(device, c->word_offset, num_words, p); - err =3D __send_command(first_peer_device(device)->connection, device->vn= r, sock, P_BITMAP, len, NULL, 0); + err =3D __send_command(peer_device->connection, device->vnr, sock, P_BIT= MAP, + len, NULL, 0); c->word_offset +=3D num_words; c->bit_offset =3D c->word_offset * BITS_PER_LONG; =20 @@ -1254,7 +1256,8 @@ send_bitmap_rle_or_plain(struct drbd_device *device, = struct bm_xfer_ctx *c) } =20 /* See the comment at receive_bitmap() */ -static int _drbd_send_bitmap(struct drbd_device *device) +static int _drbd_send_bitmap(struct drbd_device *device, + struct drbd_peer_device *peer_device) { struct bm_xfer_ctx c; int err; @@ -1266,7 +1269,7 @@ static int _drbd_send_bitmap(struct drbd_device *devi= ce) if (drbd_md_test_flag(device->ldev, MDF_FULL_SYNC)) { drbd_info(device, "Writing the whole bitmap, MDF_FullSync was set.\n"); drbd_bm_set_all(device); - if (drbd_bm_write(device)) { + if (drbd_bm_write(device, peer_device)) { /* write_bm did fail! Leave full sync flag set in Meta P_DATA * but otherwise process as per normal - need to tell other * side that a full resync is required! */ @@ -1285,20 +1288,20 @@ static int _drbd_send_bitmap(struct drbd_device *de= vice) }; =20 do { - err =3D send_bitmap_rle_or_plain(device, &c); + err =3D send_bitmap_rle_or_plain(peer_device, &c); } while (err > 0); =20 return err =3D=3D 0; } =20 -int drbd_send_bitmap(struct drbd_device *device) +int drbd_send_bitmap(struct drbd_device *device, struct drbd_peer_device *= peer_device) { - struct drbd_socket *sock =3D &first_peer_device(device)->connection->data; + struct drbd_socket *sock =3D &peer_device->connection->data; int err =3D -1; =20 mutex_lock(&sock->mutex); if (sock->socket) - err =3D !_drbd_send_bitmap(device); + err =3D !_drbd_send_bitmap(device, peer_device); mutex_unlock(&sock->mutex); return err; } @@ -3406,7 +3409,9 @@ void drbd_uuid_set_bm(struct drbd_device *device, u64= val) __must_hold(local) * * Sets all bits in the bitmap and writes the whole bitmap to stable stora= ge. */ -int drbd_bmio_set_n_write(struct drbd_device *device) __must_hold(local) +int drbd_bmio_set_n_write(struct drbd_device *device, + struct drbd_peer_device *peer_device) __must_hold(local) + { int rv =3D -EIO; =20 @@ -3414,7 +3419,7 @@ int drbd_bmio_set_n_write(struct drbd_device *device)= __must_hold(local) drbd_md_sync(device); drbd_bm_set_all(device); =20 - rv =3D drbd_bm_write(device); + rv =3D drbd_bm_write(device, peer_device); =20 if (!rv) { drbd_md_clear_flag(device, MDF_FULL_SYNC); @@ -3430,11 +3435,13 @@ int drbd_bmio_set_n_write(struct drbd_device *devic= e) __must_hold(local) * * Clears all bits in the bitmap and writes the whole bitmap to stable sto= rage. */ -int drbd_bmio_clear_n_write(struct drbd_device *device) __must_hold(local) +int drbd_bmio_clear_n_write(struct drbd_device *device, + struct drbd_peer_device *peer_device) __must_hold(local) + { drbd_resume_al(device); drbd_bm_clear_all(device); - return drbd_bm_write(device); + return drbd_bm_write(device, peer_device); } =20 static int w_bitmap_io(struct drbd_work *w, int unused) @@ -3453,7 +3460,7 @@ static int w_bitmap_io(struct drbd_work *w, int unuse= d) =20 if (get_ldev(device)) { drbd_bm_lock(device, work->why, work->flags); - rv =3D work->io_fn(device); + rv =3D work->io_fn(device, work->peer_device); drbd_bm_unlock(device); put_ldev(device); } @@ -3488,11 +3495,12 @@ static int w_bitmap_io(struct drbd_work *w, int unu= sed) * put_ldev(). */ void drbd_queue_bitmap_io(struct drbd_device *device, - int (*io_fn)(struct drbd_device *), + int (*io_fn)(struct drbd_device *, struct drbd_peer_device *), void (*done)(struct drbd_device *, int), - char *why, enum bm_flag flags) + char *why, enum bm_flag flags, + struct drbd_peer_device *peer_device) { - D_ASSERT(device, current =3D=3D first_peer_device(device)->connection->wo= rker.task); + D_ASSERT(device, current =3D=3D peer_device->connection->worker.task); =20 D_ASSERT(device, !test_bit(BITMAP_IO_QUEUED, &device->flags)); D_ASSERT(device, !test_bit(BITMAP_IO, &device->flags)); @@ -3501,6 +3509,7 @@ void drbd_queue_bitmap_io(struct drbd_device *device, drbd_err(device, "FIXME going to queue '%s' but '%s' still pending?\n", why, device->bm_io_work.why); =20 + device->bm_io_work.peer_device =3D peer_device; device->bm_io_work.io_fn =3D io_fn; device->bm_io_work.done =3D done; device->bm_io_work.why =3D why; @@ -3512,7 +3521,7 @@ void drbd_queue_bitmap_io(struct drbd_device *device, * application IO does not conflict anyways. */ if (flags =3D=3D BM_LOCKED_CHANGE_ALLOWED || atomic_read(&device->ap_bio_= cnt) =3D=3D 0) { if (!test_and_set_bit(BITMAP_IO_QUEUED, &device->flags)) - drbd_queue_work(&first_peer_device(device)->connection->sender_work, + drbd_queue_work(&peer_device->connection->sender_work, &device->bm_io_work.w); } spin_unlock_irq(&device->resource->req_lock); @@ -3528,8 +3537,10 @@ void drbd_queue_bitmap_io(struct drbd_device *device, * freezes application IO while that the actual IO operations runs. This * functions MAY NOT be called from worker context. */ -int drbd_bitmap_io(struct drbd_device *device, int (*io_fn)(struct drbd_de= vice *), - char *why, enum bm_flag flags) +int drbd_bitmap_io(struct drbd_device *device, + int (*io_fn)(struct drbd_device *, struct drbd_peer_device *), + char *why, enum bm_flag flags, + struct drbd_peer_device *peer_device) { /* Only suspend io, if some operation is supposed to be locked out */ const bool do_suspend_io =3D flags & (BM_DONT_CLEAR|BM_DONT_SET|BM_DONT_T= EST); @@ -3541,7 +3552,7 @@ int drbd_bitmap_io(struct drbd_device *device, int (*= io_fn)(struct drbd_device * drbd_suspend_io(device); =20 drbd_bm_lock(device, why, flags); - rv =3D io_fn(device); + rv =3D io_fn(device, peer_device); drbd_bm_unlock(device); =20 if (do_suspend_io) diff --git a/drivers/block/drbd/drbd_nl.c b/drivers/block/drbd/drbd_nl.c index 60757ac31701..8967298968f3 100644 --- a/drivers/block/drbd/drbd_nl.c +++ b/drivers/block/drbd/drbd_nl.c @@ -1053,7 +1053,7 @@ drbd_determine_dev_size(struct drbd_device *device, e= num dds_flags flags, struct la_size_changed ? "size changed" : "md moved"); /* next line implicitly does drbd_suspend_io()+drbd_resume_io() */ drbd_bitmap_io(device, md_moved ? &drbd_bm_write_all : &drbd_bm_write, - "size changed", BM_LOCKED_MASK); + "size changed", BM_LOCKED_MASK, NULL); =20 /* on-disk bitmap and activity log is authoritative again * (unless there was an IO error meanwhile...) */ @@ -2027,13 +2027,15 @@ int drbd_adm_attach(struct sk_buff *skb, struct gen= l_info *info) drbd_info(device, "Assuming that all blocks are out of sync " "(aka FullSync)\n"); if (drbd_bitmap_io(device, &drbd_bmio_set_n_write, - "set_n_write from attaching", BM_LOCKED_MASK)) { + "set_n_write from attaching", BM_LOCKED_MASK, + NULL)) { retcode =3D ERR_IO_MD_DISK; goto force_diskless_dec; } } else { if (drbd_bitmap_io(device, &drbd_bm_read, - "read from attaching", BM_LOCKED_MASK)) { + "read from attaching", BM_LOCKED_MASK, + NULL)) { retcode =3D ERR_IO_MD_DISK; goto force_diskless_dec; } @@ -2972,7 +2974,7 @@ int drbd_adm_invalidate(struct sk_buff *skb, struct g= enl_info *info) retcode =3D drbd_request_state(device, NS(disk, D_INCONSISTENT)); if (retcode >=3D SS_SUCCESS) { if (drbd_bitmap_io(device, &drbd_bmio_set_n_write, - "set_n_write from invalidate", BM_LOCKED_MASK)) + "set_n_write from invalidate", BM_LOCKED_MASK, NULL)) retcode =3D ERR_IO_MD_DISK; } } else @@ -3005,11 +3007,12 @@ static int drbd_adm_simple_request_state(struct sk_= buff *skb, struct genl_info * return 0; } =20 -static int drbd_bmio_set_susp_al(struct drbd_device *device) __must_hold(l= ocal) +static int drbd_bmio_set_susp_al(struct drbd_device *device, + struct drbd_peer_device *peer_device) __must_hold(local) { int rv; =20 - rv =3D drbd_bmio_set_n_write(device); + rv =3D drbd_bmio_set_n_write(device, peer_device); drbd_suspend_al(device); return rv; } @@ -3052,7 +3055,7 @@ int drbd_adm_invalidate_peer(struct sk_buff *skb, str= uct genl_info *info) if (retcode >=3D SS_SUCCESS) { if (drbd_bitmap_io(device, &drbd_bmio_set_susp_al, "set_n_write from invalidate_peer", - BM_LOCKED_SET_ALLOWED)) + BM_LOCKED_SET_ALLOWED, NULL)) retcode =3D ERR_IO_MD_DISK; } } else @@ -4148,7 +4151,7 @@ int drbd_adm_new_c_uuid(struct sk_buff *skb, struct g= enl_info *info) =20 if (args.clear_bm) { err =3D drbd_bitmap_io(device, &drbd_bmio_clear_n_write, - "clear_n_write from new_c_uuid", BM_LOCKED_MASK); + "clear_n_write from new_c_uuid", BM_LOCKED_MASK, NULL); if (err) { drbd_err(device, "Writing bitmap failed with %d\n", err); retcode =3D ERR_IO_MD_DISK; diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_r= eceiver.c index 757f4692b5bd..e70076fe1f2e 100644 --- a/drivers/block/drbd/drbd_receiver.c +++ b/drivers/block/drbd/drbd_receiver.c @@ -3591,7 +3591,7 @@ static enum drbd_conns drbd_sync_handshake(struct drb= d_peer_device *peer_device, if (abs(hg) >=3D 2) { drbd_info(device, "Writing the whole bitmap, full sync required after dr= bd_sync_handshake.\n"); if (drbd_bitmap_io(device, &drbd_bmio_set_n_write, "set_n_write from syn= c_handshake", - BM_LOCKED_SET_ALLOWED)) + BM_LOCKED_SET_ALLOWED, NULL)) return C_MASK; } =20 @@ -4270,7 +4270,7 @@ static int receive_uuids(struct drbd_connection *conn= ection, struct packet_info drbd_info(device, "Accepted new current UUID, preparing to skip initial= sync\n"); drbd_bitmap_io(device, &drbd_bmio_clear_n_write, "clear_n_write from receive_uuids", - BM_LOCKED_TEST_ALLOWED); + BM_LOCKED_TEST_ALLOWED, NULL); _drbd_uuid_set(device, UI_CURRENT, p_uuid[UI_CURRENT]); _drbd_uuid_set(device, UI_BITMAP, 0); _drbd_set_state(_NS2(device, disk, D_UP_TO_DATE, pdsk, D_UP_TO_DATE), @@ -4877,7 +4877,7 @@ static int receive_bitmap(struct drbd_connection *con= nection, struct packet_info if (device->state.conn =3D=3D C_WF_BITMAP_T) { enum drbd_state_rv rv; =20 - err =3D drbd_send_bitmap(device); + err =3D drbd_send_bitmap(device, peer_device); if (err) goto out; /* Omit CS_ORDERED with this state transition to avoid deadlocks. */ @@ -5214,7 +5214,7 @@ static int drbd_disconnected(struct drbd_peer_device = *peer_device) =20 if (get_ldev(device)) { drbd_bitmap_io(device, &drbd_bm_write_copy_pages, - "write from disconnected", BM_LOCKED_CHANGE_ALLOWED); + "write from disconnected", BM_LOCKED_CHANGE_ALLOWED, NULL); put_ldev(device); } =20 diff --git a/drivers/block/drbd/drbd_state.c b/drivers/block/drbd/drbd_stat= e.c index 75d13ea0024f..c92dc6093b0a 100644 --- a/drivers/block/drbd/drbd_state.c +++ b/drivers/block/drbd/drbd_state.c @@ -1518,8 +1518,9 @@ static void abw_start_sync(struct drbd_device *device= , int rv) } =20 int drbd_bitmap_io_from_worker(struct drbd_device *device, - int (*io_fn)(struct drbd_device *), - char *why, enum bm_flag flags) + int (*io_fn)(struct drbd_device *, struct drbd_peer_device *), + char *why, enum bm_flag flags, + struct drbd_peer_device *peer_device) { int rv; =20 @@ -1529,7 +1530,7 @@ int drbd_bitmap_io_from_worker(struct drbd_device *de= vice, atomic_inc(&device->suspend_cnt); =20 drbd_bm_lock(device, why, flags); - rv =3D io_fn(device); + rv =3D io_fn(device, peer_device); drbd_bm_unlock(device); =20 drbd_resume_io(device); @@ -1809,7 +1810,7 @@ static void after_state_ch(struct drbd_device *device= , union drbd_state os, device->state.conn =3D=3D C_WF_BITMAP_S) drbd_queue_bitmap_io(device, &drbd_send_bitmap, NULL, "send_bitmap (WFBitMapS)", - BM_LOCKED_TEST_ALLOWED); + BM_LOCKED_TEST_ALLOWED, peer_device); =20 /* Lost contact to peer's copy of the data */ if (lost_contact_to_peer_data(os.pdsk, ns.pdsk)) { @@ -1839,7 +1840,7 @@ static void after_state_ch(struct drbd_device *device= , union drbd_state os, * No harm done if the bitmap still changes, * redirtied pages will follow later. */ drbd_bitmap_io_from_worker(device, &drbd_bm_write, - "demote diskless peer", BM_LOCKED_SET_ALLOWED); + "demote diskless peer", BM_LOCKED_SET_ALLOWED, peer_device); put_ldev(device); } =20 @@ -1851,7 +1852,7 @@ static void after_state_ch(struct drbd_device *device= , union drbd_state os, /* No changes to the bitmap expected this time, so assert that, * even though no harm was done if it did change. */ drbd_bitmap_io_from_worker(device, &drbd_bm_write, - "demote", BM_LOCKED_TEST_ALLOWED); + "demote", BM_LOCKED_TEST_ALLOWED, peer_device); put_ldev(device); } =20 @@ -1888,7 +1889,8 @@ static void after_state_ch(struct drbd_device *device= , union drbd_state os, /* no other bitmap changes expected during this phase */ drbd_queue_bitmap_io(device, &drbd_bmio_set_n_write, &abw_start_sync, - "set_n_write from StartingSync", BM_LOCKED_TEST_ALLOWED); + "set_n_write from StartingSync", BM_LOCKED_TEST_ALLOWED, + peer_device); =20 /* first half of local IO error, failure to attach, * or administrative detach */ @@ -2011,7 +2013,8 @@ static void after_state_ch(struct drbd_device *device= , union drbd_state os, if ((os.conn > C_CONNECTED && os.conn < C_AHEAD) && (ns.conn =3D=3D C_CONNECTED || ns.conn >=3D C_AHEAD) && get_ldev(devi= ce)) { drbd_queue_bitmap_io(device, &drbd_bm_write_copy_pages, NULL, - "write from resync_finished", BM_LOCKED_CHANGE_ALLOWED); + "write from resync_finished", BM_LOCKED_CHANGE_ALLOWED, + peer_device); put_ldev(device); } =20 diff --git a/drivers/block/drbd/drbd_worker.c b/drivers/block/drbd/drbd_wor= ker.c index f46738040d6b..68d5ba4af17d 100644 --- a/drivers/block/drbd/drbd_worker.c +++ b/drivers/block/drbd/drbd_worker.c @@ -1945,6 +1945,7 @@ static void drbd_ldev_destroy(struct drbd_device *dev= ice) =20 static void go_diskless(struct drbd_device *device) { + struct drbd_peer_device *peer_device =3D first_peer_device(device); D_ASSERT(device, device->state.disk =3D=3D D_FAILED); /* we cannot assert local_cnt =3D=3D 0 here, as get_ldev_if_state will * inc/dec it frequently. Once we are D_DISKLESS, no one will touch @@ -1970,7 +1971,7 @@ static void go_diskless(struct drbd_device *device) * Any modifications would not be expected anymore, though. */ if (drbd_bitmap_io_from_worker(device, drbd_bm_write, - "detach", BM_LOCKED_TEST_ALLOWED)) { + "detach", BM_LOCKED_TEST_ALLOWED, peer_device)) { if (test_bit(WAS_READ_ERROR, &device->flags)) { drbd_md_set_flag(device, MDF_FULL_SYNC); drbd_md_sync(device); --=20 2.39.1 From nobody Sat Apr 11 05:40:16 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id AC389C678D4 for ; Thu, 2 Mar 2023 12:56:01 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229959AbjCBMzh (ORCPT ); Thu, 2 Mar 2023 07:55:37 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52658 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229925AbjCBMzb (ORCPT ); Thu, 2 Mar 2023 07:55:31 -0500 Received: from mail-ed1-x536.google.com (mail-ed1-x536.google.com [IPv6:2a00:1450:4864:20::536]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D8A9A4BEA4 for ; Thu, 2 Mar 2023 04:55:29 -0800 (PST) Received: by mail-ed1-x536.google.com with SMTP id a25so4684659edb.0 for ; Thu, 02 Mar 2023 04:55:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linbit-com.20210112.gappssmtp.com; s=20210112; t=1677761729; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=auAYDTnqMksP1wMx0yJS7PzTopkqCdoZrZ0FhOZKDi0=; b=FN4J47y0MmAZSZ/+MyhiIwdUL7qSPuoeC1/JJcWdXtH1H9IAqUUAtGcE5hhU+TZrva /bmav/to85jpijxlJxMv3hBqJKQGL8+PtQBq5lIzl90nbp708Bn3ncEYntXYUgVfengG /BchF+rqEJ00ft8mr25Q3BNQEIp7ch8FF7S/UFJmyDHwsEpA91Dwonc43dOxuxNQYdPS 86jYzV0fWtGNo/cJOuCPXhcaGcdlHzZAOg5PdKXWKDI2PS0LgXP21hRvhpnl3ZX9ycFe NHndQ611Yp/bvq98zkaHBfMhZoKYEZqA3t60qGoqyqo17Riz/CbdJRXXt0AJ6XJ4QPfa iWbA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1677761729; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=auAYDTnqMksP1wMx0yJS7PzTopkqCdoZrZ0FhOZKDi0=; b=y+g6cnmsx7jXqEAGE7keC0vn4hQbGbI5ZIaqTpr1osU4V1SZI3bP4AReT+tivVbK0S Amup63OoIlqTpghvWxAHZTcYTOu61LVpSlLxWHy6+IM2qza5u9TYI0MXOAs7xAdK2DM3 Ti/v/AyfRPBO1TzY5UaWcRgFc033wGvdQ/Cy1bGVntOPq1aIe71cWHTEERL8AGlzkKBi s3Thp8rd790uYOs4Vsq3/2/QVMYeRKjszuhhkHKfPDbyoVo51EuPAN0KWaquVIaUmRi8 FiPxVmF7Lz4H5oQei5iY5JoY6GIkf/tA54hAtItEWdFAtZw04T01vQnmGI0iON+uzBhd H4Yw== X-Gm-Message-State: AO0yUKVWaiCuxD8TpSOufJJqPnLaTv+kz5zV5+iV+EWAVD89hh8JY4of q1nqLq4GIH2S3zEVr0LhvKvahw== X-Google-Smtp-Source: AK7set/nkU5jrcwMqRiuiL6ckgWBwz0ltSIEvUXgwQxvUMO6kJJSK2AujWKmxYX3PLum2DZFrkL5KA== X-Received: by 2002:a17:906:6601:b0:88a:724:244c with SMTP id b1-20020a170906660100b0088a0724244cmr10538676ejp.71.1677761729415; Thu, 02 Mar 2023 04:55:29 -0800 (PST) Received: from localhost.localdomain (h082218028181.host.wavenet.at. [82.218.28.181]) by smtp.gmail.com with ESMTPSA id a98-20020a509eeb000000b004ad601533a3sm6955034edf.55.2023.03.02.04.55.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:55:28 -0800 (PST) From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?= To: Jens Axboe Cc: drbd-dev@lists.linbit.com, linux-kernel@vger.kernel.org, Lars Ellenberg , Philipp Reisner , linux-block@vger.kernel.org, Andreas Gruenbacher , =?UTF-8?q?Christoph=20B=C3=B6hmwalder?= Subject: [PATCH v2 4/7] drbd: INFO_bm_xfer_stats(): Pass a peer device argument Date: Thu, 2 Mar 2023 13:54:42 +0100 Message-Id: <20230302125445.2653493-5-christoph.boehmwalder@linbit.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302125445.2653493-1-christoph.boehmwalder@linbit.com> References: <20230302125445.2653493-1-christoph.boehmwalder@linbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Andreas Gruenbacher Signed-off-by: Andreas Gruenbacher Signed-off-by: Christoph B=C3=B6hmwalder --- drivers/block/drbd/drbd_int.h | 4 ++-- drivers/block/drbd/drbd_main.c | 2 +- drivers/block/drbd/drbd_receiver.c | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h index 7bd10089bfc9..97c091990bf6 100644 --- a/drivers/block/drbd/drbd_int.h +++ b/drivers/block/drbd/drbd_int.h @@ -127,8 +127,8 @@ struct bm_xfer_ctx { unsigned bytes[2]; }; =20 -extern void INFO_bm_xfer_stats(struct drbd_device *device, - const char *direction, struct bm_xfer_ctx *c); +extern void INFO_bm_xfer_stats(struct drbd_peer_device *peer_device, + const char *direction, struct bm_xfer_ctx *c); =20 static inline void bm_xfer_ctx_bit_to_word_offset(struct bm_xfer_ctx *c) { diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c index 178a7ae40af8..6647f84f3879 100644 --- a/drivers/block/drbd/drbd_main.c +++ b/drivers/block/drbd/drbd_main.c @@ -1247,7 +1247,7 @@ send_bitmap_rle_or_plain(struct drbd_peer_device *pee= r_device, struct bm_xfer_ct } if (!err) { if (len =3D=3D 0) { - INFO_bm_xfer_stats(device, "send", c); + INFO_bm_xfer_stats(peer_device, "send", c); return 0; } else return 1; diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_r= eceiver.c index e70076fe1f2e..c6f93a9087b1 100644 --- a/drivers/block/drbd/drbd_receiver.c +++ b/drivers/block/drbd/drbd_receiver.c @@ -4766,11 +4766,11 @@ decode_bitmap_c(struct drbd_peer_device *peer_devic= e, return -EIO; } =20 -void INFO_bm_xfer_stats(struct drbd_device *device, +void INFO_bm_xfer_stats(struct drbd_peer_device *peer_device, const char *direction, struct bm_xfer_ctx *c) { /* what would it take to transfer it "plaintext" */ - unsigned int header_size =3D drbd_header_size(first_peer_device(device)->= connection); + unsigned int header_size =3D drbd_header_size(peer_device->connection); unsigned int data_size =3D DRBD_SOCKET_BUFFER_SIZE - header_size; unsigned int plain =3D header_size * (DIV_ROUND_UP(c->bm_words, data_size) + 1) + @@ -4794,7 +4794,7 @@ void INFO_bm_xfer_stats(struct drbd_device *device, r =3D 1000; =20 r =3D 1000 - r; - drbd_info(device, "%s bitmap stats [Bytes(packets)]: plain %u(%u), RLE %u= (%u), " + drbd_info(peer_device, "%s bitmap stats [Bytes(packets)]: plain %u(%u), R= LE %u(%u), " "total %u; compression: %u.%u%%\n", direction, c->bytes[1], c->packets[1], @@ -4872,7 +4872,7 @@ static int receive_bitmap(struct drbd_connection *con= nection, struct packet_info goto out; } =20 - INFO_bm_xfer_stats(device, "receive", &c); + INFO_bm_xfer_stats(peer_device, "receive", &c); =20 if (device->state.conn =3D=3D C_WF_BITMAP_T) { enum drbd_state_rv rv; --=20 2.39.1 From nobody Sat Apr 11 05:40:16 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 669D2C6FA8E for ; Thu, 2 Mar 2023 12:56:05 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229927AbjCBM4D (ORCPT ); Thu, 2 Mar 2023 07:56:03 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53206 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229925AbjCBMzj (ORCPT ); Thu, 2 Mar 2023 07:55:39 -0500 Received: from mail-ed1-x52a.google.com (mail-ed1-x52a.google.com [IPv6:2a00:1450:4864:20::52a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C33634E5C3 for ; Thu, 2 Mar 2023 04:55:31 -0800 (PST) Received: by mail-ed1-x52a.google.com with SMTP id o12so67112735edb.9 for ; Thu, 02 Mar 2023 04:55:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linbit-com.20210112.gappssmtp.com; s=20210112; t=1677761730; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=1kxDLEHqeSUzC07bB1oJ0MhsEczzoLXd9EtZFkAmxP8=; b=VsQz9FhdRKRUmHZD9G4GNRJ454L7tKxaTS345k7aLCTJeR+OHIfOvpLCuA5wndRXlC 82gkRGUj4ue7MyzthafS9UNIdwK67PDkzgOzVxHEt61mqB/o3NQ1iMVBL/WO8TtYDNQ3 H3a0UNzaJB/wFAVc8oZ9YrdQyclihBoBAHrG84vDbmO/Lren53oZB6ry6cnosf4kuluN eGhi2ThiEJmCiClCbNyyUUM+1HyoPiWEO9ZkTzA/AA+xkDEtsW+h0OO4vXiCP8OWvl9b SSfN3UwdSzg6qL1af6CzPCgx1C0GUe9Z9J2jGME76Thl9G8izfhtspgH2aUN3tg0uCuB 7mRQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1677761730; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=1kxDLEHqeSUzC07bB1oJ0MhsEczzoLXd9EtZFkAmxP8=; b=hNfDN31lyDuvB0TQd6eFefVMSypEsJA62lFdlLV8r4bVxr2hLUvHG+0ACh0jTsTVBH USA72TFSKRoriOFUQZeJTIH4U/ltZs44QGPU2SUaQ3jn3o8DRWToJ0mr9DqebX9LBWhp NWEbY/KzsHhTK26nK3P2+AkYrAH3V79B2Gv/bRlL0p9tyX20wWl+ZyDFUF1cEBj1Ugpp HObsXJBnfXCC84i4Zr6LlHtI6dAFgIf/T4olCVQ3oI7mMbw5VeJcJk6Unp9bdSiBbElD Vfv5tL2Tm2ndE7RLcqtql/lJqjJJd5DssIYAFwHocKvfhSERJLvzO9ksGaFkgMwbw1zZ qM8w== X-Gm-Message-State: AO0yUKVg/rpkaIuCaGLvKUsEvc8gZX7eccjYLkIzEwZd8GT+X3m+RvXs +CjtNwy+UIMTOubVJ4tHBhHB7ZuPeW2KcZra9Etsjw== X-Google-Smtp-Source: AK7set+pHZNmbblwwxa6IeoJky8Rxxwh3CnNVwCpC5M7ssBOdrx2CR7rlC0zNSJRJ81lbS2YCpJs/A== X-Received: by 2002:aa7:c91a:0:b0:4af:5aa1:6e58 with SMTP id b26-20020aa7c91a000000b004af5aa16e58mr11277992edt.21.1677761730423; Thu, 02 Mar 2023 04:55:30 -0800 (PST) Received: from localhost.localdomain (h082218028181.host.wavenet.at. [82.218.28.181]) by smtp.gmail.com with ESMTPSA id a98-20020a509eeb000000b004ad601533a3sm6955034edf.55.2023.03.02.04.55.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:55:30 -0800 (PST) From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?= To: Jens Axboe Cc: drbd-dev@lists.linbit.com, linux-kernel@vger.kernel.org, Lars Ellenberg , Philipp Reisner , linux-block@vger.kernel.org, =?UTF-8?q?Christoph=20B=C3=B6hmwalder?= Subject: [PATCH v2 5/7] drbd: drbd_uuid_compare: pass a peer_device Date: Thu, 2 Mar 2023 13:54:43 +0100 Message-Id: <20230302125445.2653493-6-christoph.boehmwalder@linbit.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302125445.2653493-1-christoph.boehmwalder@linbit.com> References: <20230302125445.2653493-1-christoph.boehmwalder@linbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Signed-off-by: Christoph B=C3=B6hmwalder --- drivers/block/drbd/drbd_receiver.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_r= eceiver.c index c6f93a9087b1..e352880c70b5 100644 --- a/drivers/block/drbd/drbd_receiver.c +++ b/drivers/block/drbd/drbd_receiver.c @@ -3226,10 +3226,11 @@ static void drbd_uuid_dump(struct drbd_device *devi= ce, char *text, u64 *uuid, -1096 requires proto 96 */ =20 -static int drbd_uuid_compare(struct drbd_device *const device, enum drbd_r= ole const peer_role, int *rule_nr) __must_hold(local) +static int drbd_uuid_compare(struct drbd_peer_device *const peer_device, + enum drbd_role const peer_role, int *rule_nr) __must_hold(local) { - struct drbd_peer_device *const peer_device =3D first_peer_device(device); - struct drbd_connection *const connection =3D peer_device ? peer_device->c= onnection : NULL; + struct drbd_connection *const connection =3D peer_device->connection; + struct drbd_device *device =3D peer_device->device; u64 self, peer; int i, j; =20 @@ -3465,7 +3466,7 @@ static enum drbd_conns drbd_sync_handshake(struct drb= d_peer_device *peer_device, drbd_uuid_dump(device, "peer", device->p_uuid, device->p_uuid[UI_SIZE], device->p_uuid[UI_FLAGS]); =20 - hg =3D drbd_uuid_compare(device, peer_role, &rule_nr); + hg =3D drbd_uuid_compare(peer_device, peer_role, &rule_nr); spin_unlock_irq(&device->ldev->md.uuid_lock); =20 drbd_info(device, "uuid_compare()=3D%d by rule %d\n", hg, rule_nr); --=20 2.39.1 From nobody Sat Apr 11 05:40:16 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 61685C678D4 for ; Thu, 2 Mar 2023 12:56:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229815AbjCBM4H (ORCPT ); Thu, 2 Mar 2023 07:56:07 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53250 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229992AbjCBMzl (ORCPT ); Thu, 2 Mar 2023 07:55:41 -0500 Received: from mail-ed1-x530.google.com (mail-ed1-x530.google.com [IPv6:2a00:1450:4864:20::530]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AFCFF4ECC1 for ; Thu, 2 Mar 2023 04:55:33 -0800 (PST) Received: by mail-ed1-x530.google.com with SMTP id u9so17692482edd.2 for ; Thu, 02 Mar 2023 04:55:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linbit-com.20210112.gappssmtp.com; s=20210112; t=1677761733; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=WEZrr2qFQW9ERuryd/Xa3HES4vMXDyS6kRQIukpjsyc=; b=VDDEtLVT6VUv+puMjrWVIxVPND7Xs7qc07Qzwt5O5zUEdmbOcM5yfDHKAXW2vhIRl1 NYp1OwgHks7M1pz3k7Iqx8HzXHhroBWxqyJPduxpChbNyUXUGJI4CMICykcMo9STJ/OK 8F3IQJbJII57p0ynsdHj1z0UXz1WiVdKGgK4FMAgSZurin6Qqor2a2w40YCeHIw8UZUv rqA9Dpj5oN8hKvfhEye4gCDwEc7dLiYaEF/QHCOPPggVdMOwYeRDy4drRyxt36L9I6RQ vjFRhL+FAZE4TIoL1s+koEMwp/KnwYO2tdobSXdea/j8HWs4wZa2IdSxqpVutVZeOaKN n/QQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1677761733; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=WEZrr2qFQW9ERuryd/Xa3HES4vMXDyS6kRQIukpjsyc=; b=PIxcTmmSNtas1oR9FVSFbuMNlAngbQYmlHr81eMtcYgJosx09ZUlIlzXua4FEDI3kJ R0cYUSKfzyLloYllXSHQwBIBXSq4lHD2sEkyMhODECdSNJBRvLnfPxqn18v+qLuQY5aE RwHOJAjz7cHpd+AOG0Ono7fQufEG5GQo0QKSjf+1txAmS48wetbNz7PC4kS61wFNhc68 ffAXKZYLacevvHlpq45Ui+QjHdwyqXDN0+ETySdd23Jrx34N6CahQl9SdKuqaCO7kIIc P4qqLey6hFiUxlpanrTDtP86xYvlQscomF37eCYaVbsprjZUJDSryO33bbFW+XvmF9hX 80qw== X-Gm-Message-State: AO0yUKXG8cs/6Ox7PifhNPTGW/scd1zwpsLdfzMVnTBJ2mPrug9bpjCd yIxSX7ME4xTLOtyPy4E/8usSeoBNgLWB2tfviwbDjw== X-Google-Smtp-Source: AK7set+jyIsEmuqMcnYK7Il5vwmMGkHoN9vkuvyZeZfuFO8JMbBL6MBN3wSsnijIv4JyfRzQ289SGg== X-Received: by 2002:a17:907:11d1:b0:8b1:304e:589e with SMTP id va17-20020a17090711d100b008b1304e589emr10555759ejb.53.1677761733246; Thu, 02 Mar 2023 04:55:33 -0800 (PST) Received: from localhost.localdomain (h082218028181.host.wavenet.at. [82.218.28.181]) by smtp.gmail.com with ESMTPSA id a98-20020a509eeb000000b004ad601533a3sm6955034edf.55.2023.03.02.04.55.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:55:31 -0800 (PST) From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?= To: Jens Axboe Cc: drbd-dev@lists.linbit.com, linux-kernel@vger.kernel.org, Lars Ellenberg , Philipp Reisner , linux-block@vger.kernel.org, =?UTF-8?q?Christoph=20B=C3=B6hmwalder?= Subject: [PATCH v2 6/7] drbd: pass drbd_peer_device to __req_mod Date: Thu, 2 Mar 2023 13:54:44 +0100 Message-Id: <20230302125445.2653493-7-christoph.boehmwalder@linbit.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302125445.2653493-1-christoph.boehmwalder@linbit.com> References: <20230302125445.2653493-1-christoph.boehmwalder@linbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org In preparation to support multiple connections, we need to know which one we need to modify the request state for. Originally-from: Lars Ellenberg Signed-off-by: Christoph B=C3=B6hmwalder --- drivers/block/drbd/drbd_main.c | 13 +++++++++---- drivers/block/drbd/drbd_receiver.c | 18 ++++++++++-------- drivers/block/drbd/drbd_req.c | 21 +++++++++++++-------- drivers/block/drbd/drbd_req.h | 11 +++++++---- drivers/block/drbd/drbd_worker.c | 14 +++++++------- 5 files changed, 46 insertions(+), 31 deletions(-) diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c index 6647f84f3879..83987e7a5ef2 100644 --- a/drivers/block/drbd/drbd_main.c +++ b/drivers/block/drbd/drbd_main.c @@ -231,9 +231,11 @@ void tl_release(struct drbd_connection *connection, un= signed int barrier_nr, } req =3D list_prepare_entry(tmp, &connection->transfer_log, tl_requests); list_for_each_entry_safe_from(req, r, &connection->transfer_log, tl_reque= sts) { + struct drbd_peer_device *peer_device; if (req->epoch !=3D expect_epoch) break; - _req_mod(req, BARRIER_ACKED); + peer_device =3D conn_peer_device(connection, req->device->vnr); + _req_mod(req, BARRIER_ACKED, peer_device); } spin_unlock_irq(&connection->resource->req_lock); =20 @@ -256,10 +258,13 @@ void tl_release(struct drbd_connection *connection, u= nsigned int barrier_nr, /* must hold resource->req_lock */ void _tl_restart(struct drbd_connection *connection, enum drbd_req_event w= hat) { + struct drbd_peer_device *peer_device; struct drbd_request *req, *r; =20 - list_for_each_entry_safe(req, r, &connection->transfer_log, tl_requests) - _req_mod(req, what); + list_for_each_entry_safe(req, r, &connection->transfer_log, tl_requests) { + peer_device =3D conn_peer_device(connection, req->device->vnr); + _req_mod(req, what, peer_device); + } } =20 void tl_restart(struct drbd_connection *connection, enum drbd_req_event wh= at) @@ -297,7 +302,7 @@ void tl_abort_disk_io(struct drbd_device *device) continue; if (req->device !=3D device) continue; - _req_mod(req, ABORT_DISK_IO); + _req_mod(req, ABORT_DISK_IO, NULL); } spin_unlock_irq(&connection->resource->req_lock); } diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_r= eceiver.c index e352880c70b5..856c0e3a6630 100644 --- a/drivers/block/drbd/drbd_receiver.c +++ b/drivers/block/drbd/drbd_receiver.c @@ -2138,7 +2138,7 @@ static int receive_DataReply(struct drbd_connection *= connection, struct packet_i =20 err =3D recv_dless_read(peer_device, req, sector, pi->size); if (!err) - req_mod(req, DATA_RECEIVED); + req_mod(req, DATA_RECEIVED, peer_device); /* else: nothing. handled from drbd_disconnect... * I don't think we may complete this just yet * in case we are "on-disconnect: freeze" */ @@ -2196,7 +2196,7 @@ static void restart_conflicting_writes(struct drbd_de= vice *device, continue; /* as it is RQ_POSTPONED, this will cause it to * be queued on the retry workqueue. */ - __req_mod(req, CONFLICT_RESOLVED, NULL); + __req_mod(req, CONFLICT_RESOLVED, NULL, NULL); } } =20 @@ -2420,6 +2420,7 @@ static blk_opf_t wire_flags_to_bio(struct drbd_connec= tion *connection, u32 dpf) static void fail_postponed_requests(struct drbd_device *device, sector_t s= ector, unsigned int size) { + struct drbd_peer_device *peer_device =3D first_peer_device(device); struct drbd_interval *i; =20 repeat: @@ -2433,7 +2434,7 @@ static void fail_postponed_requests(struct drbd_devic= e *device, sector_t sector, if (!(req->rq_state & RQ_POSTPONED)) continue; req->rq_state &=3D ~RQ_POSTPONED; - __req_mod(req, NEG_ACKED, &m); + __req_mod(req, NEG_ACKED, peer_device, &m); spin_unlock_irq(&device->resource->req_lock); if (m.bio) complete_master_bio(device, &m); @@ -5661,10 +5662,11 @@ static int got_IsInSync(struct drbd_connection *con= nection, struct packet_info * } =20 static int -validate_req_change_req_state(struct drbd_device *device, u64 id, sector_t= sector, +validate_req_change_req_state(struct drbd_peer_device *peer_device, u64 id= , sector_t sector, struct rb_root *root, const char *func, enum drbd_req_event what, bool missing_ok) { + struct drbd_device *device =3D peer_device->device; struct drbd_request *req; struct bio_and_error m; =20 @@ -5674,7 +5676,7 @@ validate_req_change_req_state(struct drbd_device *dev= ice, u64 id, sector_t secto spin_unlock_irq(&device->resource->req_lock); return -EIO; } - __req_mod(req, what, &m); + __req_mod(req, what, peer_device, &m); spin_unlock_irq(&device->resource->req_lock); =20 if (m.bio) @@ -5723,7 +5725,7 @@ static int got_BlockAck(struct drbd_connection *conne= ction, struct packet_info * BUG(); } =20 - return validate_req_change_req_state(device, p->block_id, sector, + return validate_req_change_req_state(peer_device, p->block_id, sector, &device->write_requests, __func__, what, false); } @@ -5750,7 +5752,7 @@ static int got_NegAck(struct drbd_connection *connect= ion, struct packet_info *pi return 0; } =20 - err =3D validate_req_change_req_state(device, p->block_id, sector, + err =3D validate_req_change_req_state(peer_device, p->block_id, sector, &device->write_requests, __func__, NEG_ACKED, true); if (err) { @@ -5781,7 +5783,7 @@ static int got_NegDReply(struct drbd_connection *conn= ection, struct packet_info drbd_err(device, "Got NegDReply; Sector %llus, len %u.\n", (unsigned long long)sector, be32_to_cpu(p->blksize)); =20 - return validate_req_change_req_state(device, p->block_id, sector, + return validate_req_change_req_state(peer_device, p->block_id, sector, &device->read_requests, __func__, NEG_ACKED, false); } diff --git a/drivers/block/drbd/drbd_req.c b/drivers/block/drbd/drbd_req.c index e36216d50753..528f29ebf369 100644 --- a/drivers/block/drbd/drbd_req.c +++ b/drivers/block/drbd/drbd_req.c @@ -552,12 +552,15 @@ static inline bool is_pending_write_protocol_A(struct= drbd_request *req) * happen "atomically" within the req_lock, * and it enforces that we have to think in a very structured manner * about the "events" that may happen to a request during its life time .= .. + * + * + * peer_device =3D=3D NULL means local disk */ int __req_mod(struct drbd_request *req, enum drbd_req_event what, + struct drbd_peer_device *peer_device, struct bio_and_error *m) { struct drbd_device *const device =3D req->device; - struct drbd_peer_device *const peer_device =3D first_peer_device(device); struct drbd_connection *const connection =3D peer_device ? peer_device->c= onnection : NULL; struct net_conf *nc; int p, rv =3D 0; @@ -1100,6 +1103,7 @@ static bool drbd_should_send_out_of_sync(union drbd_d= ev_state s) static int drbd_process_write_request(struct drbd_request *req) { struct drbd_device *device =3D req->device; + struct drbd_peer_device *peer_device =3D first_peer_device(device); int remote, send_oos; =20 remote =3D drbd_should_do_remote(device->state); @@ -1115,7 +1119,7 @@ static int drbd_process_write_request(struct drbd_req= uest *req) /* The only size=3D=3D0 bios we expect are empty flushes. */ D_ASSERT(device, req->master_bio->bi_opf & REQ_PREFLUSH); if (remote) - _req_mod(req, QUEUE_AS_DRBD_BARRIER); + _req_mod(req, QUEUE_AS_DRBD_BARRIER, peer_device); return remote; } =20 @@ -1125,10 +1129,10 @@ static int drbd_process_write_request(struct drbd_r= equest *req) D_ASSERT(device, !(remote && send_oos)); =20 if (remote) { - _req_mod(req, TO_BE_SENT); - _req_mod(req, QUEUE_FOR_NET_WRITE); + _req_mod(req, TO_BE_SENT, peer_device); + _req_mod(req, QUEUE_FOR_NET_WRITE, peer_device); } else if (drbd_set_out_of_sync(device, req->i.sector, req->i.size)) - _req_mod(req, QUEUE_FOR_SEND_OOS); + _req_mod(req, QUEUE_FOR_SEND_OOS, peer_device); =20 return remote; } @@ -1312,6 +1316,7 @@ static void drbd_update_plug(struct drbd_plug_cb *plu= g, struct drbd_request *req static void drbd_send_and_submit(struct drbd_device *device, struct drbd_r= equest *req) { struct drbd_resource *resource =3D device->resource; + struct drbd_peer_device *peer_device =3D first_peer_device(device); const int rw =3D bio_data_dir(req->master_bio); struct bio_and_error m =3D { NULL, }; bool no_remote =3D false; @@ -1375,8 +1380,8 @@ static void drbd_send_and_submit(struct drbd_device *= device, struct drbd_request /* We either have a private_bio, or we can read from remote. * Otherwise we had done the goto nodata above. */ if (req->private_bio =3D=3D NULL) { - _req_mod(req, TO_BE_SENT); - _req_mod(req, QUEUE_FOR_NET_READ); + _req_mod(req, TO_BE_SENT, peer_device); + _req_mod(req, QUEUE_FOR_NET_READ, peer_device); } else no_remote =3D true; } @@ -1397,7 +1402,7 @@ static void drbd_send_and_submit(struct drbd_device *= device, struct drbd_request req->pre_submit_jif =3D jiffies; list_add_tail(&req->req_pending_local, &device->pending_completion[rw =3D=3D WRITE]); - _req_mod(req, TO_BE_SUBMITTED); + _req_mod(req, TO_BE_SUBMITTED, NULL); /* but we need to give up the spinlock to submit */ submit_private_bio =3D true; } else if (no_remote) { diff --git a/drivers/block/drbd/drbd_req.h b/drivers/block/drbd/drbd_req.h index b4017b5c3fbc..9ae860e7591b 100644 --- a/drivers/block/drbd/drbd_req.h +++ b/drivers/block/drbd/drbd_req.h @@ -267,6 +267,7 @@ struct bio_and_error { extern void start_new_tl_epoch(struct drbd_connection *connection); extern void drbd_req_destroy(struct kref *kref); extern int __req_mod(struct drbd_request *req, enum drbd_req_event what, + struct drbd_peer_device *peer_device, struct bio_and_error *m); extern void complete_master_bio(struct drbd_device *device, struct bio_and_error *m); @@ -280,14 +281,15 @@ extern void drbd_restart_request(struct drbd_request = *req); =20 /* use this if you don't want to deal with calling complete_master_bio() * outside the spinlock, e.g. when walking some list on cleanup. */ -static inline int _req_mod(struct drbd_request *req, enum drbd_req_event w= hat) +static inline int _req_mod(struct drbd_request *req, enum drbd_req_event w= hat, + struct drbd_peer_device *peer_device) { struct drbd_device *device =3D req->device; struct bio_and_error m; int rv; =20 /* __req_mod possibly frees req, do not touch req after that! */ - rv =3D __req_mod(req, what, &m); + rv =3D __req_mod(req, what, peer_device, &m); if (m.bio) complete_master_bio(device, &m); =20 @@ -299,7 +301,8 @@ static inline int _req_mod(struct drbd_request *req, en= um drbd_req_event what) * of the lower level driver completion callback, so we need to * spin_lock_irqsave here. */ static inline int req_mod(struct drbd_request *req, - enum drbd_req_event what) + enum drbd_req_event what, + struct drbd_peer_device *peer_device) { unsigned long flags; struct drbd_device *device =3D req->device; @@ -307,7 +310,7 @@ static inline int req_mod(struct drbd_request *req, int rv; =20 spin_lock_irqsave(&device->resource->req_lock, flags); - rv =3D __req_mod(req, what, &m); + rv =3D __req_mod(req, what, peer_device, &m); spin_unlock_irqrestore(&device->resource->req_lock, flags); =20 if (m.bio) diff --git a/drivers/block/drbd/drbd_worker.c b/drivers/block/drbd/drbd_wor= ker.c index 68d5ba4af17d..6455edca7aa9 100644 --- a/drivers/block/drbd/drbd_worker.c +++ b/drivers/block/drbd/drbd_worker.c @@ -276,7 +276,7 @@ void drbd_request_endio(struct bio *bio) =20 /* not req_mod(), we need irqsave here! */ spin_lock_irqsave(&device->resource->req_lock, flags); - __req_mod(req, what, &m); + __req_mod(req, what, NULL, &m); spin_unlock_irqrestore(&device->resource->req_lock, flags); put_ldev(device); =20 @@ -1425,7 +1425,7 @@ int w_send_out_of_sync(struct drbd_work *w, int cance= l) int err; =20 if (unlikely(cancel)) { - req_mod(req, SEND_CANCELED); + req_mod(req, SEND_CANCELED, peer_device); return 0; } req->pre_send_jif =3D jiffies; @@ -1437,7 +1437,7 @@ int w_send_out_of_sync(struct drbd_work *w, int cance= l) maybe_send_barrier(connection, req->epoch); =20 err =3D drbd_send_out_of_sync(peer_device, req); - req_mod(req, OOS_HANDED_TO_NETWORK); + req_mod(req, OOS_HANDED_TO_NETWORK, peer_device); =20 return err; } @@ -1457,7 +1457,7 @@ int w_send_dblock(struct drbd_work *w, int cancel) int err; =20 if (unlikely(cancel)) { - req_mod(req, SEND_CANCELED); + req_mod(req, SEND_CANCELED, peer_device); return 0; } req->pre_send_jif =3D jiffies; @@ -1467,7 +1467,7 @@ int w_send_dblock(struct drbd_work *w, int cancel) connection->send.current_epoch_writes++; =20 err =3D drbd_send_dblock(peer_device, req); - req_mod(req, err ? SEND_FAILED : HANDED_OVER_TO_NETWORK); + req_mod(req, err ? SEND_FAILED : HANDED_OVER_TO_NETWORK, peer_device); =20 if (do_send_unplug && !err) pd_send_unplug_remote(peer_device); @@ -1490,7 +1490,7 @@ int w_send_read_req(struct drbd_work *w, int cancel) int err; =20 if (unlikely(cancel)) { - req_mod(req, SEND_CANCELED); + req_mod(req, SEND_CANCELED, peer_device); return 0; } req->pre_send_jif =3D jiffies; @@ -1502,7 +1502,7 @@ int w_send_read_req(struct drbd_work *w, int cancel) err =3D drbd_send_drequest(peer_device, P_DATA_REQUEST, req->i.sector, re= q->i.size, (unsigned long)req); =20 - req_mod(req, err ? SEND_FAILED : HANDED_OVER_TO_NETWORK); + req_mod(req, err ? SEND_FAILED : HANDED_OVER_TO_NETWORK, peer_device); =20 if (do_send_unplug && !err) pd_send_unplug_remote(peer_device); --=20 2.39.1 From nobody Sat Apr 11 05:40:16 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A41B8C6FA8E for ; Thu, 2 Mar 2023 12:56:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229978AbjCBM4N (ORCPT ); Thu, 2 Mar 2023 07:56:13 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53348 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230009AbjCBMzm (ORCPT ); Thu, 2 Mar 2023 07:55:42 -0500 Received: from mail-ed1-x531.google.com (mail-ed1-x531.google.com [IPv6:2a00:1450:4864:20::531]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E04154E5EE for ; Thu, 2 Mar 2023 04:55:35 -0800 (PST) Received: by mail-ed1-x531.google.com with SMTP id s11so3188134edy.8 for ; Thu, 02 Mar 2023 04:55:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linbit-com.20210112.gappssmtp.com; s=20210112; t=1677761734; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=bl+f61gPv3YcHhSpJ6d/UUGcw0+eXxBFZehJkRpUHGw=; b=K2RP+/lGH+k+L4Cbo4avoDUNprO2ipBUFUy46uePWDXzkTieb+qcAcdSxPZ84JPV2p onpGZdAXuUZnHF9xrVcyifuNa+VNjTJmiBKPbwNgXo1QrdIVGDkiE5e6oZNkJf/ZQgcl iIzj4ES+yk/c7OcEA0j1ygeY0nRxM5OQgcTPIsk4adoTHkoeRCDuOTdJxYeecsof684e KaboK3nBVsPkbr44V9hsdIpGjPBHv4ldTTP7lk3P8wu68oTRu6lQhuiSbn7cFfsH2JuS IgKCV2IPIQbRCTXQxPIFPivC7n4ML5zucpe9k13EQmA077vyKknLIfvIEphtOiKbCVz3 CrOw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1677761734; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=bl+f61gPv3YcHhSpJ6d/UUGcw0+eXxBFZehJkRpUHGw=; b=pJ6XnyAUK9SBWpM3ISZOT174Zi9O0NFlDtQypamhAnnoU1oozJJkWPfDok2+4+FF7d T9OGQfnwjA+6LgfYALkhinCa4q8LrZz/fnh8zg6N0b5wacVAkH7fr80Fy6lCxLtL4h+X tUq4CmeWuBL2B3UxGnoFKfjmojXuRaQUbasuZFOjLpbgOQEP8EXBS+2axZnCkUsmgLcr OXPHL9n8lDokQbZ7nQkx/ld++T57F6/ecHE0AECmcErycOPnFYnhXSuZ+Dg/TslvXA62 FYZBHzZje5SoZzKs22+7jF1JnCFTXszlsnplHWRhrKI8/GhVPZSY8VsHEyTzfX5uK3wB eZWg== X-Gm-Message-State: AO0yUKXwGM2Fxjrz0i8PwTWVXj5fqC1R91+AYG25XQqjkPQVv+XTAS07 +bHM6o3DMug/Qg+6pI9M6l23qw== X-Google-Smtp-Source: AK7set+yogQJRR/F1w7YjP4cHex15idSc3lBTb7v2iHiyvGCNjT2veL2jX6JHz8AwF85sjxC0WTnRw== X-Received: by 2002:a17:906:f751:b0:887:8f6:c1d7 with SMTP id jp17-20020a170906f75100b0088708f6c1d7mr11551109ejb.38.1677761734332; Thu, 02 Mar 2023 04:55:34 -0800 (PST) Received: from localhost.localdomain (h082218028181.host.wavenet.at. [82.218.28.181]) by smtp.gmail.com with ESMTPSA id a98-20020a509eeb000000b004ad601533a3sm6955034edf.55.2023.03.02.04.55.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Mar 2023 04:55:33 -0800 (PST) From: =?UTF-8?q?Christoph=20B=C3=B6hmwalder?= To: Jens Axboe Cc: drbd-dev@lists.linbit.com, linux-kernel@vger.kernel.org, Lars Ellenberg , Philipp Reisner , linux-block@vger.kernel.org, =?UTF-8?q?Christoph=20B=C3=B6hmwalder?= Subject: [PATCH v2 7/7] drbd: Pass a peer device to the resync and online verify functions Date: Thu, 2 Mar 2023 13:54:45 +0100 Message-Id: <20230302125445.2653493-8-christoph.boehmwalder@linbit.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20230302125445.2653493-1-christoph.boehmwalder@linbit.com> References: <20230302125445.2653493-1-christoph.boehmwalder@linbit.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Originally-from: Andreas Gr=C3=BCnbacher Signed-off-by: Christoph B=C3=B6hmwalder --- drivers/block/drbd/drbd_actlog.c | 13 ++-- drivers/block/drbd/drbd_int.h | 46 +++++++------- drivers/block/drbd/drbd_receiver.c | 59 +++++++++--------- drivers/block/drbd/drbd_req.c | 9 +-- drivers/block/drbd/drbd_state.c | 10 +-- drivers/block/drbd/drbd_worker.c | 97 ++++++++++++++++-------------- 6 files changed, 126 insertions(+), 108 deletions(-) diff --git a/drivers/block/drbd/drbd_actlog.c b/drivers/block/drbd/drbd_act= log.c index 429255876800..64b3a1c76f03 100644 --- a/drivers/block/drbd/drbd_actlog.c +++ b/drivers/block/drbd/drbd_actlog.c @@ -735,8 +735,9 @@ static bool update_rs_extent(struct drbd_device *device, return false; } =20 -void drbd_advance_rs_marks(struct drbd_device *device, unsigned long still= _to_go) +void drbd_advance_rs_marks(struct drbd_peer_device *peer_device, unsigned = long still_to_go) { + struct drbd_device *device =3D peer_device->device; unsigned long now =3D jiffies; unsigned long last =3D device->rs_mark_time[device->rs_last_mark]; int next =3D (device->rs_last_mark + 1) % DRBD_SYNC_MARKS; @@ -819,7 +820,7 @@ static int update_sync_bits(struct drbd_device *device, if (mode =3D=3D SET_IN_SYNC) { unsigned long still_to_go =3D drbd_bm_total_weight(device); bool rs_is_done =3D (still_to_go <=3D device->rs_failed); - drbd_advance_rs_marks(device, still_to_go); + drbd_advance_rs_marks(first_peer_device(device), still_to_go); if (cleared || rs_is_done) maybe_schedule_on_disk_bitmap_update(device, rs_is_done); } else if (mode =3D=3D RECORD_RS_FAILED) @@ -843,10 +844,11 @@ static bool plausible_request_size(int size) * called by worker on C_SYNC_TARGET and receiver on SyncSource. * */ -int __drbd_change_sync(struct drbd_device *device, sector_t sector, int si= ze, +int __drbd_change_sync(struct drbd_peer_device *peer_device, sector_t sect= or, int size, enum update_sync_bits_mode mode) { /* Is called from worker and receiver context _only_ */ + struct drbd_device *device =3D peer_device->device; unsigned long sbnr, ebnr, lbnr; unsigned long count =3D 0; sector_t esector, nr_sectors; @@ -1009,14 +1011,15 @@ int drbd_rs_begin_io(struct drbd_device *device, se= ctor_t sector) * tries to set it to BME_LOCKED. Returns 0 upon success, and -EAGAIN * if there is still application IO going on in this area. */ -int drbd_try_rs_begin_io(struct drbd_device *device, sector_t sector) +int drbd_try_rs_begin_io(struct drbd_peer_device *peer_device, sector_t se= ctor) { + struct drbd_device *device =3D peer_device->device; unsigned int enr =3D BM_SECT_TO_EXT(sector); const unsigned int al_enr =3D enr*AL_EXT_PER_BM_SECT; struct lc_element *e; struct bm_extent *bm_ext; int i; - bool throttle =3D drbd_rs_should_slow_down(device, sector, true); + bool throttle =3D drbd_rs_should_slow_down(peer_device, sector, true); =20 /* If we need to throttle, a half-locked (only marked BME_NO_WRITES, * not yet BME_LOCKED) extent needs to be kicked out explicitly if we diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h index 97c091990bf6..a30a5ed811be 100644 --- a/drivers/block/drbd/drbd_int.h +++ b/drivers/block/drbd/drbd_int.h @@ -1433,21 +1433,24 @@ void drbd_resync_after_changed(struct drbd_device *= device); extern void drbd_start_resync(struct drbd_device *device, enum drbd_conns = side); extern void resume_next_sg(struct drbd_device *device); extern void suspend_other_sg(struct drbd_device *device); -extern int drbd_resync_finished(struct drbd_device *device); +extern int drbd_resync_finished(struct drbd_peer_device *peer_device); /* maybe rather drbd_main.c ? */ extern void *drbd_md_get_buffer(struct drbd_device *device, const char *in= tent); extern void drbd_md_put_buffer(struct drbd_device *device); extern int drbd_md_sync_page_io(struct drbd_device *device, struct drbd_backing_dev *bdev, sector_t sector, enum req_op op); -extern void drbd_ov_out_of_sync_found(struct drbd_device *, sector_t, int); +extern void drbd_ov_out_of_sync_found(struct drbd_peer_device *peer_device, + sector_t sector, int size); extern void wait_until_done_or_force_detached(struct drbd_device *device, struct drbd_backing_dev *bdev, unsigned int *done); -extern void drbd_rs_controller_reset(struct drbd_device *device); +extern void drbd_rs_controller_reset(struct drbd_peer_device *peer_device); =20 -static inline void ov_out_of_sync_print(struct drbd_device *device) +static inline void ov_out_of_sync_print(struct drbd_peer_device *peer_devi= ce) { + struct drbd_device *device =3D peer_device->device; + if (device->ov_last_oos_size) { - drbd_err(device, "Out of sync: start=3D%llu, size=3D%lu (sectors)\n", + drbd_err(peer_device, "Out of sync: start=3D%llu, size=3D%lu (sectors)\n= ", (unsigned long long)device->ov_last_oos_start, (unsigned long)device->ov_last_oos_size); } @@ -1486,7 +1489,7 @@ extern int drbd_ack_receiver(struct drbd_thread *thi); extern void drbd_send_ping_wf(struct work_struct *ws); extern void drbd_send_acks_wf(struct work_struct *ws); extern bool drbd_rs_c_min_rate_throttle(struct drbd_device *device); -extern bool drbd_rs_should_slow_down(struct drbd_device *device, sector_t = sector, +extern bool drbd_rs_should_slow_down(struct drbd_peer_device *peer_device,= sector_t sector, bool throttle_if_app_is_waiting); extern int drbd_submit_peer_request(struct drbd_peer_request *peer_req); extern int drbd_free_peer_reqs(struct drbd_device *, struct list_head *); @@ -1542,22 +1545,22 @@ extern void drbd_al_begin_io(struct drbd_device *de= vice, struct drbd_interval *i extern void drbd_al_complete_io(struct drbd_device *device, struct drbd_in= terval *i); extern void drbd_rs_complete_io(struct drbd_device *device, sector_t secto= r); extern int drbd_rs_begin_io(struct drbd_device *device, sector_t sector); -extern int drbd_try_rs_begin_io(struct drbd_device *device, sector_t secto= r); +extern int drbd_try_rs_begin_io(struct drbd_peer_device *peer_device, sect= or_t sector); extern void drbd_rs_cancel_all(struct drbd_device *device); extern int drbd_rs_del_all(struct drbd_device *device); -extern void drbd_rs_failed_io(struct drbd_device *device, +extern void drbd_rs_failed_io(struct drbd_peer_device *peer_device, sector_t sector, int size); -extern void drbd_advance_rs_marks(struct drbd_device *device, unsigned lon= g still_to_go); +extern void drbd_advance_rs_marks(struct drbd_peer_device *peer_device, un= signed long still_to_go); =20 enum update_sync_bits_mode { RECORD_RS_FAILED, SET_OUT_OF_SYNC, SET_IN_SYN= C }; -extern int __drbd_change_sync(struct drbd_device *device, sector_t sector,= int size, +extern int __drbd_change_sync(struct drbd_peer_device *peer_device, sector= _t sector, int size, enum update_sync_bits_mode mode); -#define drbd_set_in_sync(device, sector, size) \ - __drbd_change_sync(device, sector, size, SET_IN_SYNC) -#define drbd_set_out_of_sync(device, sector, size) \ - __drbd_change_sync(device, sector, size, SET_OUT_OF_SYNC) -#define drbd_rs_failed_io(device, sector, size) \ - __drbd_change_sync(device, sector, size, RECORD_RS_FAILED) +#define drbd_set_in_sync(peer_device, sector, size) \ + __drbd_change_sync(peer_device, sector, size, SET_IN_SYNC) +#define drbd_set_out_of_sync(peer_device, sector, size) \ + __drbd_change_sync(peer_device, sector, size, SET_OUT_OF_SYNC) +#define drbd_rs_failed_io(peer_device, sector, size) \ + __drbd_change_sync(peer_device, sector, size, RECORD_RS_FAILED) extern void drbd_al_shrink(struct drbd_device *device); extern int drbd_al_initialize(struct drbd_device *, void *); =20 @@ -1945,15 +1948,16 @@ static inline int __dec_ap_pending(struct drbd_devi= ce *device) * C_SYNC_SOURCE sends P_RS_DATA_REPLY (and expects P_WRITE_ACK with ID_= SYNCER) * (or P_NEG_ACK with ID_SYNCER) */ -static inline void inc_rs_pending(struct drbd_device *device) +static inline void inc_rs_pending(struct drbd_peer_device *peer_device) { - atomic_inc(&device->rs_pending_cnt); + atomic_inc(&peer_device->device->rs_pending_cnt); } =20 -#define dec_rs_pending(device) ((void)expect((device), __dec_rs_pending(de= vice) >=3D 0)) -static inline int __dec_rs_pending(struct drbd_device *device) +#define dec_rs_pending(peer_device) \ + ((void)expect((peer_device), __dec_rs_pending(peer_device) >=3D 0)) +static inline int __dec_rs_pending(struct drbd_peer_device *peer_device) { - return atomic_dec_return(&device->rs_pending_cnt); + return atomic_dec_return(&peer_device->device->rs_pending_cnt); } =20 /* counts how many answers we still need to send to the peer. diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_r= eceiver.c index 856c0e3a6630..e54404c632e7 100644 --- a/drivers/block/drbd/drbd_receiver.c +++ b/drivers/block/drbd/drbd_receiver.c @@ -2044,11 +2044,11 @@ static int e_end_resync_block(struct drbd_work *w, = int unused) D_ASSERT(device, drbd_interval_empty(&peer_req->i)); =20 if (likely((peer_req->flags & EE_WAS_ERROR) =3D=3D 0)) { - drbd_set_in_sync(device, sector, peer_req->i.size); + drbd_set_in_sync(peer_device, sector, peer_req->i.size); err =3D drbd_send_ack(peer_device, P_RS_WRITE_ACK, peer_req); } else { /* Record failure to sync */ - drbd_rs_failed_io(device, sector, peer_req->i.size); + drbd_rs_failed_io(peer_device, sector, peer_req->i.size); =20 err =3D drbd_send_ack(peer_device, P_NEG_ACK, peer_req); } @@ -2067,7 +2067,7 @@ static int recv_resync_read(struct drbd_peer_device *= peer_device, sector_t secto if (!peer_req) goto fail; =20 - dec_rs_pending(device); + dec_rs_pending(peer_device); =20 inc_unacked(device); /* corresponding dec_unacked() in e_end_resync_block() @@ -2220,7 +2220,7 @@ static int e_end_block(struct drbd_work *w, int cance= l) P_RS_WRITE_ACK : P_WRITE_ACK; err =3D drbd_send_ack(peer_device, pcmd, peer_req); if (pcmd =3D=3D P_RS_WRITE_ACK) - drbd_set_in_sync(device, sector, peer_req->i.size); + drbd_set_in_sync(peer_device, sector, peer_req->i.size); } else { err =3D drbd_send_ack(peer_device, P_NEG_ACK, peer_req); /* we expect it to be marked out of sync anyways... @@ -2691,7 +2691,7 @@ static int receive_Data(struct drbd_connection *conne= ction, struct packet_info * =20 if (device->state.pdsk < D_INCONSISTENT) { /* In case we have the only disk of the cluster, */ - drbd_set_out_of_sync(device, peer_req->i.sector, peer_req->i.size); + drbd_set_out_of_sync(peer_device, peer_req->i.sector, peer_req->i.size); peer_req->flags &=3D ~EE_MAY_SET_IN_SYNC; drbd_al_begin_io(device, &peer_req->i); peer_req->flags |=3D EE_CALL_AL_COMPLETE_IO; @@ -2730,9 +2730,10 @@ static int receive_Data(struct drbd_connection *conn= ection, struct packet_info * * The current sync rate used here uses only the most recent two step mark= s, * to have a short time average so we can react faster. */ -bool drbd_rs_should_slow_down(struct drbd_device *device, sector_t sector, +bool drbd_rs_should_slow_down(struct drbd_peer_device *peer_device, sector= _t sector, bool throttle_if_app_is_waiting) { + struct drbd_device *device =3D peer_device->device; struct lc_element *tmp; bool throttle =3D drbd_rs_c_min_rate_throttle(device); =20 @@ -2844,7 +2845,7 @@ static int receive_DataRequest(struct drbd_connection= *connection, struct packet break; case P_OV_REPLY: verb =3D 0; - dec_rs_pending(device); + dec_rs_pending(peer_device); drbd_send_ack_ex(peer_device, P_OV_RESULT, sector, size, ID_IN_SYNC); break; default: @@ -2915,7 +2916,7 @@ static int receive_DataRequest(struct drbd_connection= *connection, struct packet /* track progress, we may need to throttle */ atomic_add(size >> 9, &device->rs_sect_in); peer_req->w.cb =3D w_e_end_ov_reply; - dec_rs_pending(device); + dec_rs_pending(peer_device); /* drbd_rs_begin_io done when we sent this request, * but accounting still needs to be done. */ goto submit_for_resync; @@ -2978,7 +2979,7 @@ static int receive_DataRequest(struct drbd_connection= *connection, struct packet =20 update_receiver_timing_details(connection, drbd_rs_should_slow_down); if (device->state.peer !=3D R_PRIMARY - && drbd_rs_should_slow_down(device, sector, false)) + && drbd_rs_should_slow_down(peer_device, sector, false)) schedule_timeout_uninterruptible(HZ/10); update_receiver_timing_details(connection, drbd_rs_begin_io); if (drbd_rs_begin_io(device, sector)) @@ -4450,7 +4451,7 @@ static int receive_state(struct drbd_connection *conn= ection, struct packet_info else if (os.conn >=3D C_SYNC_SOURCE && peer_state.conn =3D=3D C_CONNECTED) { if (drbd_bm_total_weight(device) <=3D device->rs_failed) - drbd_resync_finished(device); + drbd_resync_finished(peer_device); return 0; } } @@ -4458,8 +4459,8 @@ static int receive_state(struct drbd_connection *conn= ection, struct packet_info /* explicit verify finished notification, stop sector reached. */ if (os.conn =3D=3D C_VERIFY_T && os.disk =3D=3D D_UP_TO_DATE && peer_state.conn =3D=3D C_CONNECTED && real_peer_disk =3D=3D D_UP_TO_D= ATE) { - ov_out_of_sync_print(device); - drbd_resync_finished(device); + ov_out_of_sync_print(peer_device); + drbd_resync_finished(peer_device); return 0; } =20 @@ -4937,7 +4938,7 @@ static int receive_out_of_sync(struct drbd_connection= *connection, struct packet drbd_conn_str(device->state.conn)); } =20 - drbd_set_out_of_sync(device, be64_to_cpu(p->sector), be32_to_cpu(p->blksi= ze)); + drbd_set_out_of_sync(peer_device, be64_to_cpu(p->sector), be32_to_cpu(p->= blksize)); =20 return 0; } @@ -4958,7 +4959,7 @@ static int receive_rs_deallocated(struct drbd_connect= ion *connection, struct pac sector =3D be64_to_cpu(p->sector); size =3D be32_to_cpu(p->blksize); =20 - dec_rs_pending(device); + dec_rs_pending(peer_device); =20 if (get_ldev(device)) { struct drbd_peer_request *peer_req; @@ -5650,12 +5651,12 @@ static int got_IsInSync(struct drbd_connection *con= nection, struct packet_info * =20 if (get_ldev(device)) { drbd_rs_complete_io(device, sector); - drbd_set_in_sync(device, sector, blksize); + drbd_set_in_sync(peer_device, sector, blksize); /* rs_same_csums is supposed to count in units of BM_BLOCK_SIZE */ device->rs_same_csum +=3D (blksize >> BM_BLOCK_SHIFT); put_ldev(device); } - dec_rs_pending(device); + dec_rs_pending(peer_device); atomic_add(blksize >> 9, &device->rs_sect_in); =20 return 0; @@ -5701,8 +5702,8 @@ static int got_BlockAck(struct drbd_connection *conne= ction, struct packet_info * update_peer_seq(peer_device, be32_to_cpu(p->seq_num)); =20 if (p->block_id =3D=3D ID_SYNCER) { - drbd_set_in_sync(device, sector, blksize); - dec_rs_pending(device); + drbd_set_in_sync(peer_device, sector, blksize); + dec_rs_pending(peer_device); return 0; } switch (pi->cmd) { @@ -5747,8 +5748,8 @@ static int got_NegAck(struct drbd_connection *connect= ion, struct packet_info *pi update_peer_seq(peer_device, be32_to_cpu(p->seq_num)); =20 if (p->block_id =3D=3D ID_SYNCER) { - dec_rs_pending(device); - drbd_rs_failed_io(device, sector, size); + dec_rs_pending(peer_device); + drbd_rs_failed_io(peer_device, sector, size); return 0; } =20 @@ -5761,7 +5762,7 @@ static int got_NegAck(struct drbd_connection *connect= ion, struct packet_info *pi request is no longer in the collision hash. */ /* In Protocol B we might already have got a P_RECV_ACK but then get a P_NEG_ACK afterwards. */ - drbd_set_out_of_sync(device, sector, size); + drbd_set_out_of_sync(peer_device, sector, size); } return 0; } @@ -5806,13 +5807,13 @@ static int got_NegRSDReply(struct drbd_connection *= connection, struct packet_inf =20 update_peer_seq(peer_device, be32_to_cpu(p->seq_num)); =20 - dec_rs_pending(device); + dec_rs_pending(peer_device); =20 if (get_ldev_if_state(device, D_FAILED)) { drbd_rs_complete_io(device, sector); switch (pi->cmd) { case P_NEG_RS_DREPLY: - drbd_rs_failed_io(device, sector, size); + drbd_rs_failed_io(peer_device, sector, size); break; case P_RS_CANCEL: break; @@ -5869,21 +5870,21 @@ static int got_OVResult(struct drbd_connection *con= nection, struct packet_info * update_peer_seq(peer_device, be32_to_cpu(p->seq_num)); =20 if (be64_to_cpu(p->block_id) =3D=3D ID_OUT_OF_SYNC) - drbd_ov_out_of_sync_found(device, sector, size); + drbd_ov_out_of_sync_found(peer_device, sector, size); else - ov_out_of_sync_print(device); + ov_out_of_sync_print(peer_device); =20 if (!get_ldev(device)) return 0; =20 drbd_rs_complete_io(device, sector); - dec_rs_pending(device); + dec_rs_pending(peer_device); =20 --device->ov_left; =20 /* let's advance progress step marks only for every other megabyte */ if ((device->ov_left & 0x200) =3D=3D 0x200) - drbd_advance_rs_marks(device, device->ov_left); + drbd_advance_rs_marks(peer_device, device->ov_left); =20 if (device->ov_left =3D=3D 0) { dw =3D kmalloc(sizeof(*dw), GFP_NOIO); @@ -5893,8 +5894,8 @@ static int got_OVResult(struct drbd_connection *conne= ction, struct packet_info * drbd_queue_work(&peer_device->connection->sender_work, &dw->w); } else { drbd_err(device, "kmalloc(dw) failed."); - ov_out_of_sync_print(device); - drbd_resync_finished(device); + ov_out_of_sync_print(peer_device); + drbd_resync_finished(peer_device); } } put_ldev(device); diff --git a/drivers/block/drbd/drbd_req.c b/drivers/block/drbd/drbd_req.c index 528f29ebf369..380e6584a4ee 100644 --- a/drivers/block/drbd/drbd_req.c +++ b/drivers/block/drbd/drbd_req.c @@ -122,12 +122,13 @@ void drbd_req_destroy(struct kref *kref) * before it even was submitted or sent. * In that case we do not want to touch the bitmap at all. */ + struct drbd_peer_device *peer_device =3D first_peer_device(device); if ((s & (RQ_POSTPONED|RQ_LOCAL_MASK|RQ_NET_MASK)) !=3D RQ_POSTPONED) { if (!(s & RQ_NET_OK) || !(s & RQ_LOCAL_OK)) - drbd_set_out_of_sync(device, req->i.sector, req->i.size); + drbd_set_out_of_sync(peer_device, req->i.sector, req->i.size); =20 if ((s & RQ_NET_OK) && (s & RQ_LOCAL_OK) && (s & RQ_NET_SIS)) - drbd_set_in_sync(device, req->i.sector, req->i.size); + drbd_set_in_sync(peer_device, req->i.sector, req->i.size); } =20 /* one might be tempted to move the drbd_al_complete_io @@ -620,7 +621,7 @@ int __req_mod(struct drbd_request *req, enum drbd_req_e= vent what, break; =20 case READ_COMPLETED_WITH_ERROR: - drbd_set_out_of_sync(device, req->i.sector, req->i.size); + drbd_set_out_of_sync(peer_device, req->i.sector, req->i.size); drbd_report_io_error(device, req); __drbd_chk_io_error(device, DRBD_READ_ERROR); fallthrough; @@ -1131,7 +1132,7 @@ static int drbd_process_write_request(struct drbd_req= uest *req) if (remote) { _req_mod(req, TO_BE_SENT, peer_device); _req_mod(req, QUEUE_FOR_NET_WRITE, peer_device); - } else if (drbd_set_out_of_sync(device, req->i.sector, req->i.size)) + } else if (drbd_set_out_of_sync(peer_device, req->i.sector, req->i.size)) _req_mod(req, QUEUE_FOR_SEND_OOS, peer_device); =20 return remote; diff --git a/drivers/block/drbd/drbd_state.c b/drivers/block/drbd/drbd_stat= e.c index c92dc6093b0a..563e67f1ead9 100644 --- a/drivers/block/drbd/drbd_state.c +++ b/drivers/block/drbd/drbd_state.c @@ -1222,9 +1222,11 @@ void drbd_resume_al(struct drbd_device *device) } =20 /* helper for _drbd_set_state */ -static void set_ov_position(struct drbd_device *device, enum drbd_conns cs) +static void set_ov_position(struct drbd_peer_device *peer_device, enum drb= d_conns cs) { - if (first_peer_device(device)->connection->agreed_pro_version < 90) + struct drbd_device *device =3D peer_device->device; + + if (peer_device->connection->agreed_pro_version < 90) device->ov_start_sector =3D 0; device->rs_total =3D drbd_bm_bits(device); device->ov_position =3D 0; @@ -1387,7 +1389,7 @@ _drbd_set_state(struct drbd_device *device, union drb= d_state ns, unsigned long now =3D jiffies; int i; =20 - set_ov_position(device, ns.conn); + set_ov_position(peer_device, ns.conn); device->rs_start =3D now; device->rs_last_sect_ev =3D 0; device->ov_last_oos_size =3D 0; @@ -1398,7 +1400,7 @@ _drbd_set_state(struct drbd_device *device, union drb= d_state ns, device->rs_mark_time[i] =3D now; } =20 - drbd_rs_controller_reset(device); + drbd_rs_controller_reset(peer_device); =20 if (ns.conn =3D=3D C_VERIFY_S) { drbd_info(device, "Starting Online Verify from sector %llu\n", diff --git a/drivers/block/drbd/drbd_worker.c b/drivers/block/drbd/drbd_wor= ker.c index 6455edca7aa9..4352a50fbb3f 100644 --- a/drivers/block/drbd/drbd_worker.c +++ b/drivers/block/drbd/drbd_worker.c @@ -28,8 +28,8 @@ #include "drbd_protocol.h" #include "drbd_req.h" =20 -static int make_ov_request(struct drbd_device *, int); -static int make_resync_request(struct drbd_device *, int); +static int make_ov_request(struct drbd_peer_device *, int); +static int make_resync_request(struct drbd_peer_device *, int); =20 /* endio handlers: * drbd_md_endio (defined here) @@ -124,7 +124,7 @@ void drbd_endio_write_sec_final(struct drbd_peer_reques= t *peer_req) __releases(l * In case of a write error, send the neg ack anyways. */ if (!__test_and_set_bit(__EE_SEND_WRITE_ACK, &peer_req->flags)) inc_unacked(device); - drbd_set_out_of_sync(device, peer_req->i.sector, peer_req->i.size); + drbd_set_out_of_sync(peer_device, peer_req->i.sector, peer_req->i.size); } =20 spin_lock_irqsave(&device->resource->req_lock, flags); @@ -363,7 +363,7 @@ static int w_e_send_csum(struct drbd_work *w, int cance= l) * drbd_alloc_pages due to pp_in_use > max_buffers. */ drbd_free_peer_req(device, peer_req); peer_req =3D NULL; - inc_rs_pending(device); + inc_rs_pending(peer_device); err =3D drbd_send_drequest_csum(peer_device, sector, size, digest, digest_size, P_CSUM_RS_REQUEST); @@ -430,10 +430,10 @@ int w_resync_timer(struct drbd_work *w, int cancel) =20 switch (device->state.conn) { case C_VERIFY_S: - make_ov_request(device, cancel); + make_ov_request(first_peer_device(device), cancel); break; case C_SYNC_TARGET: - make_resync_request(device, cancel); + make_resync_request(first_peer_device(device), cancel); break; } =20 @@ -493,8 +493,9 @@ struct fifo_buffer *fifo_alloc(unsigned int fifo_size) return fb; } =20 -static int drbd_rs_controller(struct drbd_device *device, unsigned int sec= t_in) +static int drbd_rs_controller(struct drbd_peer_device *peer_device, unsign= ed int sect_in) { + struct drbd_device *device =3D peer_device->device; struct disk_conf *dc; unsigned int want; /* The number of sectors we want in-flight */ int req_sect; /* Number of sectors to request in this turn */ @@ -545,8 +546,9 @@ static int drbd_rs_controller(struct drbd_device *devic= e, unsigned int sect_in) return req_sect; } =20 -static int drbd_rs_number_requests(struct drbd_device *device) +static int drbd_rs_number_requests(struct drbd_peer_device *peer_device) { + struct drbd_device *device =3D peer_device->device; unsigned int sect_in; /* Number of sectors that came in since the last t= urn */ int number, mxb; =20 @@ -556,7 +558,7 @@ static int drbd_rs_number_requests(struct drbd_device *= device) rcu_read_lock(); mxb =3D drbd_get_max_buffers(device) / 2; if (rcu_dereference(device->rs_plan_s)->size) { - number =3D drbd_rs_controller(device, sect_in) >> (BM_BLOCK_SHIFT - 9); + number =3D drbd_rs_controller(peer_device, sect_in) >> (BM_BLOCK_SHIFT -= 9); device->c_sync_rate =3D number * HZ * (BM_BLOCK_SIZE / 1024) / SLEEP_TIM= E; } else { device->c_sync_rate =3D rcu_dereference(device->ldev->disk_conf)->resync= _rate; @@ -580,9 +582,9 @@ static int drbd_rs_number_requests(struct drbd_device *= device) return number; } =20 -static int make_resync_request(struct drbd_device *const device, int cance= l) +static int make_resync_request(struct drbd_peer_device *const peer_device,= int cancel) { - struct drbd_peer_device *const peer_device =3D first_peer_device(device); + struct drbd_device *const device =3D peer_device->device; struct drbd_connection *const connection =3D peer_device ? peer_device->c= onnection : NULL; unsigned long bit; sector_t sector; @@ -598,7 +600,7 @@ static int make_resync_request(struct drbd_device *cons= t device, int cancel) =20 if (device->rs_total =3D=3D 0) { /* empty resync? */ - drbd_resync_finished(device); + drbd_resync_finished(peer_device); return 0; } =20 @@ -618,7 +620,7 @@ static int make_resync_request(struct drbd_device *cons= t device, int cancel) } =20 max_bio_size =3D queue_max_hw_sectors(device->rq_queue) << 9; - number =3D drbd_rs_number_requests(device); + number =3D drbd_rs_number_requests(peer_device); if (number <=3D 0) goto requeue; =20 @@ -653,7 +655,7 @@ static int make_resync_request(struct drbd_device *cons= t device, int cancel) =20 sector =3D BM_BIT_TO_SECT(bit); =20 - if (drbd_try_rs_begin_io(device, sector)) { + if (drbd_try_rs_begin_io(peer_device, sector)) { device->bm_resync_fo =3D bit; goto requeue; } @@ -729,13 +731,13 @@ static int make_resync_request(struct drbd_device *co= nst device, int cancel) } else { int err; =20 - inc_rs_pending(device); + inc_rs_pending(peer_device); err =3D drbd_send_drequest(peer_device, size =3D=3D discard_granularity ? P_RS_THIN_REQ : P_RS_DATA_REQUEST, sector, size, ID_SYNCER); if (err) { drbd_err(device, "drbd_send_drequest() failed, aborting...\n"); - dec_rs_pending(device); + dec_rs_pending(peer_device); put_ldev(device); return err; } @@ -760,8 +762,9 @@ static int make_resync_request(struct drbd_device *cons= t device, int cancel) return 0; } =20 -static int make_ov_request(struct drbd_device *device, int cancel) +static int make_ov_request(struct drbd_peer_device *peer_device, int cance= l) { + struct drbd_device *device =3D peer_device->device; int number, i, size; sector_t sector; const sector_t capacity =3D get_capacity(device->vdisk); @@ -770,7 +773,7 @@ static int make_ov_request(struct drbd_device *device, = int cancel) if (unlikely(cancel)) return 1; =20 - number =3D drbd_rs_number_requests(device); + number =3D drbd_rs_number_requests(peer_device); =20 sector =3D device->ov_position; for (i =3D 0; i < number; i++) { @@ -788,7 +791,7 @@ static int make_ov_request(struct drbd_device *device, = int cancel) =20 size =3D BM_BLOCK_SIZE; =20 - if (drbd_try_rs_begin_io(device, sector)) { + if (drbd_try_rs_begin_io(peer_device, sector)) { device->ov_position =3D sector; goto requeue; } @@ -796,9 +799,9 @@ static int make_ov_request(struct drbd_device *device, = int cancel) if (sector + (size>>9) > capacity) size =3D (capacity-sector)<<9; =20 - inc_rs_pending(device); + inc_rs_pending(peer_device); if (drbd_send_ov_request(first_peer_device(device), sector, size)) { - dec_rs_pending(device); + dec_rs_pending(peer_device); return 0; } sector +=3D BM_SECT_PER_BIT; @@ -818,8 +821,8 @@ int w_ov_finished(struct drbd_work *w, int cancel) container_of(w, struct drbd_device_work, w); struct drbd_device *device =3D dw->device; kfree(dw); - ov_out_of_sync_print(device); - drbd_resync_finished(device); + ov_out_of_sync_print(first_peer_device(device)); + drbd_resync_finished(first_peer_device(device)); =20 return 0; } @@ -831,7 +834,7 @@ static int w_resync_finished(struct drbd_work *w, int c= ancel) struct drbd_device *device =3D dw->device; kfree(dw); =20 - drbd_resync_finished(device); + drbd_resync_finished(first_peer_device(device)); =20 return 0; } @@ -846,9 +849,10 @@ static void ping_peer(struct drbd_device *device) test_bit(GOT_PING_ACK, &connection->flags) || device->state.conn < C_= CONNECTED); } =20 -int drbd_resync_finished(struct drbd_device *device) +int drbd_resync_finished(struct drbd_peer_device *peer_device) { - struct drbd_connection *connection =3D first_peer_device(device)->connect= ion; + struct drbd_device *device =3D peer_device->device; + struct drbd_connection *connection =3D peer_device->connection; unsigned long db, dt, dbdt; unsigned long n_oos; union drbd_state os, ns; @@ -1129,7 +1133,7 @@ int w_e_end_rsdata_req(struct drbd_work *w, int cance= l) err =3D drbd_send_ack(peer_device, P_RS_CANCEL, peer_req); } else if (likely((peer_req->flags & EE_WAS_ERROR) =3D=3D 0)) { if (likely(device->state.pdsk >=3D D_INCONSISTENT)) { - inc_rs_pending(device); + inc_rs_pending(peer_device); if (peer_req->flags & EE_RS_THIN_REQ && all_zero(peer_req)) err =3D drbd_send_rs_deallocated(peer_device, peer_req); else @@ -1148,7 +1152,7 @@ int w_e_end_rsdata_req(struct drbd_work *w, int cance= l) err =3D drbd_send_ack(peer_device, P_NEG_RS_DREPLY, peer_req); =20 /* update resync data with failure */ - drbd_rs_failed_io(device, peer_req->i.sector, peer_req->i.size); + drbd_rs_failed_io(peer_device, peer_req->i.sector, peer_req->i.size); } =20 dec_unacked(device); @@ -1199,12 +1203,12 @@ int w_e_end_csum_rs_req(struct drbd_work *w, int ca= ncel) } =20 if (eq) { - drbd_set_in_sync(device, peer_req->i.sector, peer_req->i.size); + drbd_set_in_sync(peer_device, peer_req->i.sector, peer_req->i.size); /* rs_same_csums unit is BM_BLOCK_SIZE */ device->rs_same_csum +=3D peer_req->i.size >> BM_BLOCK_SHIFT; err =3D drbd_send_ack(peer_device, P_RS_IS_IN_SYNC, peer_req); } else { - inc_rs_pending(device); + inc_rs_pending(peer_device); peer_req->block_id =3D ID_SYNCER; /* By setting block_id, digest pointe= r becomes invalid! */ peer_req->flags &=3D ~EE_HAS_DIGEST; /* This peer request no longer has= a digest pointer */ kfree(di); @@ -1257,10 +1261,10 @@ int w_e_end_ov_req(struct drbd_work *w, int cancel) * drbd_alloc_pages due to pp_in_use > max_buffers. */ drbd_free_peer_req(device, peer_req); peer_req =3D NULL; - inc_rs_pending(device); + inc_rs_pending(peer_device); err =3D drbd_send_drequest_csum(peer_device, sector, size, digest, digest= _size, P_OV_REPLY); if (err) - dec_rs_pending(device); + dec_rs_pending(peer_device); kfree(digest); =20 out: @@ -1270,15 +1274,16 @@ int w_e_end_ov_req(struct drbd_work *w, int cancel) return err; } =20 -void drbd_ov_out_of_sync_found(struct drbd_device *device, sector_t sector= , int size) +void drbd_ov_out_of_sync_found(struct drbd_peer_device *peer_device, secto= r_t sector, int size) { + struct drbd_device *device =3D peer_device->device; if (device->ov_last_oos_start + device->ov_last_oos_size =3D=3D sector) { device->ov_last_oos_size +=3D size>>9; } else { device->ov_last_oos_start =3D sector; device->ov_last_oos_size =3D size>>9; } - drbd_set_out_of_sync(device, sector, size); + drbd_set_out_of_sync(peer_device, sector, size); } =20 int w_e_end_ov_reply(struct drbd_work *w, int cancel) @@ -1328,9 +1333,9 @@ int w_e_end_ov_reply(struct drbd_work *w, int cancel) * drbd_alloc_pages due to pp_in_use > max_buffers. */ drbd_free_peer_req(device, peer_req); if (!eq) - drbd_ov_out_of_sync_found(device, sector, size); + drbd_ov_out_of_sync_found(peer_device, sector, size); else - ov_out_of_sync_print(device); + ov_out_of_sync_print(peer_device); =20 err =3D drbd_send_ack_ex(peer_device, P_OV_RESULT, sector, size, eq ? ID_IN_SYNC : ID_OUT_OF_SYNC); @@ -1341,14 +1346,14 @@ int w_e_end_ov_reply(struct drbd_work *w, int cance= l) =20 /* let's advance progress step marks only for every other megabyte */ if ((device->ov_left & 0x200) =3D=3D 0x200) - drbd_advance_rs_marks(device, device->ov_left); + drbd_advance_rs_marks(peer_device, device->ov_left); =20 stop_sector_reached =3D verify_can_do_stop_sector(device) && (sector + (size>>9)) >=3D device->ov_stop_sector; =20 if (device->ov_left =3D=3D 0 || stop_sector_reached) { - ov_out_of_sync_print(device); - drbd_resync_finished(device); + ov_out_of_sync_print(peer_device); + drbd_resync_finished(peer_device); } =20 return err; @@ -1668,8 +1673,9 @@ void drbd_resync_after_changed(struct drbd_device *de= vice) } while (changed); } =20 -void drbd_rs_controller_reset(struct drbd_device *device) +void drbd_rs_controller_reset(struct drbd_peer_device *peer_device) { + struct drbd_device *device =3D peer_device->device; struct gendisk *disk =3D device->ldev->backing_bdev->bd_disk; struct fifo_buffer *plan; =20 @@ -1891,10 +1897,10 @@ void drbd_start_resync(struct drbd_device *device, = enum drbd_conns side) rcu_read_unlock(); schedule_timeout_interruptible(timeo); } - drbd_resync_finished(device); + drbd_resync_finished(peer_device); } =20 - drbd_rs_controller_reset(device); + drbd_rs_controller_reset(peer_device); /* ns.conn may already be !=3D device->state.conn, * we may have been paused in between, or become paused until * the timer triggers. @@ -1909,8 +1915,9 @@ void drbd_start_resync(struct drbd_device *device, en= um drbd_conns side) mutex_unlock(device->state_mutex); } =20 -static void update_on_disk_bitmap(struct drbd_device *device, bool resync_= done) +static void update_on_disk_bitmap(struct drbd_peer_device *peer_device, bo= ol resync_done) { + struct drbd_device *device =3D peer_device->device; struct sib_info sib =3D { .sib_reason =3D SIB_SYNC_PROGRESS, }; device->rs_last_bcast =3D jiffies; =20 @@ -1919,7 +1926,7 @@ static void update_on_disk_bitmap(struct drbd_device = *device, bool resync_done) =20 drbd_bm_write_lazy(device, 0); if (resync_done && is_sync_state(device->state.conn)) - drbd_resync_finished(device); + drbd_resync_finished(peer_device); =20 drbd_bcast_event(device, &sib); /* update timestamp, in case it took a while to write out stuff */ @@ -2018,7 +2025,7 @@ static void do_device_work(struct drbd_device *device= , const unsigned long todo) do_md_sync(device); if (test_bit(RS_DONE, &todo) || test_bit(RS_PROGRESS, &todo)) - update_on_disk_bitmap(device, test_bit(RS_DONE, &todo)); + update_on_disk_bitmap(first_peer_device(device), test_bit(RS_DONE, &todo= )); if (test_bit(GO_DISKLESS, &todo)) go_diskless(device); if (test_bit(DESTROY_DISK, &todo)) --=20 2.39.1