* [PATCH 1/7] drbd: rename drbd_worker.c to drbd_sender.c
2026-09-23 14:06 [PATCH 0/7] drbd: preparation for DRBD 9 Christoph Böhmwalder
@ 2026-09-23 14:06 ` Christoph Böhmwalder
2026-09-23 14:06 ` [PATCH 2/7] drbd: modernize the file header comments Christoph Böhmwalder
` (7 subsequent siblings)
8 siblings, 0 replies; 11+ messages in thread
From: Christoph Böhmwalder @ 2026-09-23 14:06 UTC (permalink / raw)
To: Jens Axboe
Cc: Philipp Reisner, Lars Ellenberg, drbd-dev, linux-block,
linux-kernel, Christoph Böhmwalder, Lars Ellenberg
The "worker" thread has long since become the thread that sends data
and resync requests to the peer; the receiving side lives in
drbd_receiver.c. The out-of-tree DRBD 9 code base has called this file
drbd_sender.c for years.
Rename the file up front, with no content change, so that the upcoming
DRBD 9 rework of this thread shows up as a modification of one file
instead of the removal of one file and the addition of another.
Signed-off-by: Christoph Böhmwalder <christoph.boehmwalder@linbit.com>
---
drivers/block/drbd/Makefile | 2 +-
drivers/block/drbd/{drbd_worker.c => drbd_sender.c} | 0
2 files changed, 1 insertion(+), 1 deletion(-)
rename drivers/block/drbd/{drbd_worker.c => drbd_sender.c} (100%)
diff --git a/drivers/block/drbd/Makefile b/drivers/block/drbd/Makefile
index 5faaa8a8e7f0..1a6dc0f482f5 100644
--- a/drivers/block/drbd/Makefile
+++ b/drivers/block/drbd/Makefile
@@ -1,6 +1,6 @@
# SPDX-License-Identifier: GPL-2.0-only
drbd-y := drbd_buildtag.o drbd_bitmap.o drbd_proc.o
-drbd-y += drbd_worker.o drbd_receiver.o drbd_req.o drbd_actlog.o
+drbd-y += drbd_sender.o drbd_receiver.o drbd_req.o drbd_actlog.o
drbd-y += drbd_main.o drbd_strings.o drbd_nl.o
drbd-y += drbd_interval.o drbd_state.o
drbd-y += drbd_nl_gen.o
diff --git a/drivers/block/drbd/drbd_worker.c b/drivers/block/drbd/drbd_sender.c
similarity index 100%
rename from drivers/block/drbd/drbd_worker.c
rename to drivers/block/drbd/drbd_sender.c
--
2.55.0
^ permalink raw reply [flat|nested] 11+ messages in thread* [PATCH 2/7] drbd: modernize the file header comments
2026-09-23 14:06 [PATCH 0/7] drbd: preparation for DRBD 9 Christoph Böhmwalder
2026-09-23 14:06 ` [PATCH 1/7] drbd: rename drbd_worker.c to drbd_sender.c Christoph Böhmwalder
@ 2026-09-23 14:06 ` Christoph Böhmwalder
2026-09-23 14:06 ` [PATCH 3/7] drbd: raise the socket buffer size limits to 128 MiB Christoph Böhmwalder
` (6 subsequent siblings)
8 siblings, 0 replies; 11+ messages in thread
From: Christoph Böhmwalder @ 2026-09-23 14:06 UTC (permalink / raw)
To: Jens Axboe
Cc: Philipp Reisner, Lars Ellenberg, drbd-dev, linux-block,
linux-kernel, Christoph Böhmwalder, Lars Ellenberg
Replace the pre-SPDX "This file is part of DRBD by ..." blocks with plain
kernel-style copyright notices, and add the missing ones. The license is
carried by the SPDX identifier since commit 93c68cc46a07 ("drbd: use
consistent license"), so the prose about it in every file is redundant.
The file name lines were partly wrong anyway (drbd_vli.h calls itself
drbd_receiver.c, drbd_strings.c calls itself drbd.h).
This is the header layout the out-of-tree DRBD 9 sources carry, so the
upcoming rework no longer touches the first lines of every file.
No functional change.
Signed-off-by: Christoph Böhmwalder <christoph.boehmwalder@linbit.com>
---
drivers/block/drbd/drbd_actlog.c | 13 ++++---------
drivers/block/drbd/drbd_bitmap.c | 12 ++++--------
drivers/block/drbd/drbd_debugfs.c | 4 ++++
drivers/block/drbd/drbd_debugfs.h | 4 ++++
drivers/block/drbd/drbd_int.h | 15 +++++----------
drivers/block/drbd/drbd_interval.c | 4 ++++
drivers/block/drbd/drbd_interval.h | 4 ++++
drivers/block/drbd/drbd_main.c | 16 ++++------------
drivers/block/drbd/drbd_nl.c | 13 ++++---------
drivers/block/drbd/drbd_proc.c | 10 +---------
drivers/block/drbd/drbd_protocol.h | 4 ++++
drivers/block/drbd/drbd_receiver.c | 13 ++++---------
drivers/block/drbd/drbd_req.c | 13 ++++---------
drivers/block/drbd/drbd_req.h | 12 ++++--------
drivers/block/drbd/drbd_sender.c | 15 +++++----------
drivers/block/drbd/drbd_state.c | 15 ++++-----------
drivers/block/drbd/drbd_strings.c | 12 ++----------
drivers/block/drbd/drbd_strings.h | 4 ++++
drivers/block/drbd/drbd_vli.h | 12 ++++--------
include/uapi/linux/drbd.h | 12 ++----------
include/uapi/linux/drbd_limits.h | 5 ++---
21 files changed, 77 insertions(+), 135 deletions(-)
diff --git a/drivers/block/drbd/drbd_actlog.c b/drivers/block/drbd/drbd_actlog.c
index b3dbf6c76e98..04b8d50e4e9e 100644
--- a/drivers/block/drbd/drbd_actlog.c
+++ b/drivers/block/drbd/drbd_actlog.c
@@ -1,14 +1,9 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
- drbd_actlog.c
-
- This file is part of DRBD by Philipp Reisner and Lars Ellenberg.
-
- Copyright (C) 2003-2008, LINBIT Information Technologies GmbH.
- Copyright (C) 2003-2008, Philipp Reisner <philipp.reisner@linbit.com>.
- Copyright (C) 2003-2008, Lars Ellenberg <lars.ellenberg@linbit.com>.
-
-
+ * Copyright (C) 2003-2008, LINBIT Information Technologies GmbH.
+ * Copyright (C) 2003-2008, Philipp Reisner <philipp.reisner@linbit.com>.
+ * Copyright (C) 2003-2008, Lars Ellenberg <lars.ellenberg@linbit.com>.
+ * Copyright (C) 2008, LINBIT HA-Solutions GmbH.
*/
#include <linux/slab.h>
diff --git a/drivers/block/drbd/drbd_bitmap.c b/drivers/block/drbd/drbd_bitmap.c
index 65ea6ec66bfd..8416c7e8257c 100644
--- a/drivers/block/drbd/drbd_bitmap.c
+++ b/drivers/block/drbd/drbd_bitmap.c
@@ -1,13 +1,9 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
- drbd_bitmap.c
-
- This file is part of DRBD by Philipp Reisner and Lars Ellenberg.
-
- Copyright (C) 2004-2008, LINBIT Information Technologies GmbH.
- Copyright (C) 2004-2008, Philipp Reisner <philipp.reisner@linbit.com>.
- Copyright (C) 2004-2008, Lars Ellenberg <lars.ellenberg@linbit.com>.
-
+ * Copyright (C) 2004-2008, LINBIT Information Technologies GmbH.
+ * Copyright (C) 2004-2008, Philipp Reisner <philipp.reisner@linbit.com>.
+ * Copyright (C) 2004-2008, Lars Ellenberg <lars.ellenberg@linbit.com>.
+ * Copyright (C) 2008, LINBIT HA-Solutions GmbH.
*/
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
diff --git a/drivers/block/drbd/drbd_debugfs.c b/drivers/block/drbd/drbd_debugfs.c
index 371abcd7e880..b8e698dbb475 100644
--- a/drivers/block/drbd/drbd_debugfs.c
+++ b/drivers/block/drbd/drbd_debugfs.c
@@ -1,4 +1,8 @@
// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (C) 2014, LINBIT HA-Solutions GmbH.
+ */
+
#define pr_fmt(fmt) "drbd debugfs: " fmt
#include <linux/kernel.h>
#include <linux/module.h>
diff --git a/drivers/block/drbd/drbd_debugfs.h b/drivers/block/drbd/drbd_debugfs.h
index ee3d66eb40c6..e02960c6ec35 100644
--- a/drivers/block/drbd/drbd_debugfs.h
+++ b/drivers/block/drbd/drbd_debugfs.h
@@ -1,4 +1,8 @@
/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright (C) 2014, LINBIT HA-Solutions GmbH.
+ */
+
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/debugfs.h>
diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h
index 48b45c3142f7..d3ca2b730a11 100644
--- a/drivers/block/drbd/drbd_int.h
+++ b/drivers/block/drbd/drbd_int.h
@@ -1,15 +1,10 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
- drbd_int.h
-
- This file is part of DRBD by Philipp Reisner and Lars Ellenberg.
-
- Copyright (C) 2001-2008, LINBIT Information Technologies GmbH.
- Copyright (C) 1999-2008, Philipp Reisner <philipp.reisner@linbit.com>.
- Copyright (C) 2002-2008, Lars Ellenberg <lars.ellenberg@linbit.com>.
-
-
-*/
+ * Copyright (C) 1999-2008, Philipp Reisner <philipp.reisner@linbit.com>.
+ * Copyright (C) 2002-2008, Lars Ellenberg <lars.ellenberg@linbit.com>.
+ * Copyright (C) 2001-2008, LINBIT Information Technologies GmbH.
+ * Copyright (C) 2008, LINBIT HA-Solutions GmbH.
+ */
#ifndef _DRBD_INT_H
#define _DRBD_INT_H
diff --git a/drivers/block/drbd/drbd_interval.c b/drivers/block/drbd/drbd_interval.c
index 873beda6de24..2c12297ffdaf 100644
--- a/drivers/block/drbd/drbd_interval.c
+++ b/drivers/block/drbd/drbd_interval.c
@@ -1,4 +1,8 @@
// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Copyright (C) 2011, LINBIT HA-Solutions GmbH.
+ */
+
#include <asm/bug.h>
#include <linux/rbtree_augmented.h>
#include "drbd_interval.h"
diff --git a/drivers/block/drbd/drbd_interval.h b/drivers/block/drbd/drbd_interval.h
index 5d3213b81eed..9d290ac120cd 100644
--- a/drivers/block/drbd/drbd_interval.h
+++ b/drivers/block/drbd/drbd_interval.h
@@ -1,4 +1,8 @@
/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright (C) 2011, LINBIT HA-Solutions GmbH.
+ */
+
#ifndef __DRBD_INTERVAL_H
#define __DRBD_INTERVAL_H
diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c
index a2a841c89201..590ac5cb84f5 100644
--- a/drivers/block/drbd/drbd_main.c
+++ b/drivers/block/drbd/drbd_main.c
@@ -1,17 +1,9 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
- drbd.c
-
- This file is part of DRBD by Philipp Reisner and Lars Ellenberg.
-
- Copyright (C) 2001-2008, LINBIT Information Technologies GmbH.
- Copyright (C) 1999-2008, Philipp Reisner <philipp.reisner@linbit.com>.
- Copyright (C) 2002-2008, Lars Ellenberg <lars.ellenberg@linbit.com>.
-
- Thanks to Carter Burden, Bart Grantham and Gennadiy Nerubayev
- from Logicworks, Inc. for making SDP replication support possible.
-
-
+ * Copyright (C) 1999-2008, Philipp Reisner <philipp.reisner@linbit.com>.
+ * Copyright (C) 2002-2008, Lars Ellenberg <lars.ellenberg@linbit.com>.
+ * Copyright (C) 2001-2008, LINBIT Information Technologies GmbH.
+ * Copyright (C) 2008, LINBIT HA-Solutions GmbH.
*/
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
diff --git a/drivers/block/drbd/drbd_nl.c b/drivers/block/drbd/drbd_nl.c
index b77f901fc3ef..51ba8e542928 100644
--- a/drivers/block/drbd/drbd_nl.c
+++ b/drivers/block/drbd/drbd_nl.c
@@ -1,14 +1,9 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
- drbd_nl.c
-
- This file is part of DRBD by Philipp Reisner and Lars Ellenberg.
-
- Copyright (C) 2001-2008, LINBIT Information Technologies GmbH.
- Copyright (C) 1999-2008, Philipp Reisner <philipp.reisner@linbit.com>.
- Copyright (C) 2002-2008, Lars Ellenberg <lars.ellenberg@linbit.com>.
-
-
+ * Copyright (C) 1999-2008, Philipp Reisner <philipp.reisner@linbit.com>.
+ * Copyright (C) 2002-2008, Lars Ellenberg <lars.ellenberg@linbit.com>.
+ * Copyright (C) 2001-2008, LINBIT Information Technologies GmbH.
+ * Copyright (C) 2008, LINBIT HA-Solutions GmbH.
*/
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
diff --git a/drivers/block/drbd/drbd_proc.c b/drivers/block/drbd/drbd_proc.c
index 6d0c12c10260..fb2b68c5c5f7 100644
--- a/drivers/block/drbd/drbd_proc.c
+++ b/drivers/block/drbd/drbd_proc.c
@@ -1,14 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
- drbd_proc.c
-
- This file is part of DRBD by Philipp Reisner and Lars Ellenberg.
-
- Copyright (C) 2001-2008, LINBIT Information Technologies GmbH.
- Copyright (C) 1999-2008, Philipp Reisner <philipp.reisner@linbit.com>.
- Copyright (C) 2002-2008, Lars Ellenberg <lars.ellenberg@linbit.com>.
-
-
+ * Copyright (C) 2001, LINBIT HA-Solutions GmbH.
*/
#include <linux/module.h>
diff --git a/drivers/block/drbd/drbd_protocol.h b/drivers/block/drbd/drbd_protocol.h
index 56bbca9d7700..be7dacac5a86 100644
--- a/drivers/block/drbd/drbd_protocol.h
+++ b/drivers/block/drbd/drbd_protocol.h
@@ -1,4 +1,8 @@
/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright (C) 2014, LINBIT HA-Solutions GmbH.
+ */
+
#ifndef __DRBD_PROTOCOL_H
#define __DRBD_PROTOCOL_H
diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c
index 2135c14354a8..2c4507add143 100644
--- a/drivers/block/drbd/drbd_receiver.c
+++ b/drivers/block/drbd/drbd_receiver.c
@@ -1,16 +1,11 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
- drbd_receiver.c
-
- This file is part of DRBD by Philipp Reisner and Lars Ellenberg.
-
- Copyright (C) 2001-2008, LINBIT Information Technologies GmbH.
- Copyright (C) 1999-2008, Philipp Reisner <philipp.reisner@linbit.com>.
- Copyright (C) 2002-2008, Lars Ellenberg <lars.ellenberg@linbit.com>.
-
+ * Copyright (C) 1999-2008, Philipp Reisner <philipp.reisner@linbit.com>.
+ * Copyright (C) 2002-2008, Lars Ellenberg <lars.ellenberg@linbit.com>.
+ * Copyright (C) 2001-2008, LINBIT Information Technologies GmbH.
+ * Copyright (C) 2008, LINBIT HA-Solutions GmbH.
*/
-
#include <linux/module.h>
#include <linux/uaccess.h>
diff --git a/drivers/block/drbd/drbd_req.c b/drivers/block/drbd/drbd_req.c
index 70f75ef07945..1648d0dabcbd 100644
--- a/drivers/block/drbd/drbd_req.c
+++ b/drivers/block/drbd/drbd_req.c
@@ -1,14 +1,9 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
- drbd_req.c
-
- This file is part of DRBD by Philipp Reisner and Lars Ellenberg.
-
- Copyright (C) 2001-2008, LINBIT Information Technologies GmbH.
- Copyright (C) 1999-2008, Philipp Reisner <philipp.reisner@linbit.com>.
- Copyright (C) 2002-2008, Lars Ellenberg <lars.ellenberg@linbit.com>.
-
-
+ * Copyright (C) 1999-2008, Philipp Reisner <philipp.reisner@linbit.com>.
+ * Copyright (C) 2002-2008, Lars Ellenberg <lars.ellenberg@linbit.com>.
+ * Copyright (C) 2001-2008, LINBIT Information Technologies GmbH.
+ * Copyright (C) 2008, LINBIT HA-Solutions GmbH.
*/
#include <linux/module.h>
diff --git a/drivers/block/drbd/drbd_req.h b/drivers/block/drbd/drbd_req.h
index 9ae860e7591b..51b12a960e45 100644
--- a/drivers/block/drbd/drbd_req.h
+++ b/drivers/block/drbd/drbd_req.h
@@ -1,13 +1,9 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
- drbd_req.h
-
- This file is part of DRBD by Philipp Reisner and Lars Ellenberg.
-
- Copyright (C) 2006-2008, LINBIT Information Technologies GmbH.
- Copyright (C) 2006-2008, Lars Ellenberg <lars.ellenberg@linbit.com>.
- Copyright (C) 2006-2008, Philipp Reisner <philipp.reisner@linbit.com>.
-
+ * Copyright (C) 2006-2008, Lars Ellenberg <lars.ellenberg@linbit.com>.
+ * Copyright (C) 2006-2008, Philipp Reisner <philipp.reisner@linbit.com>.
+ * Copyright (C) 2006-2008, LINBIT Information Technologies GmbH.
+ * Copyright (C) 2008, LINBIT HA-Solutions GmbH.
*/
#ifndef _DRBD_REQ_H
diff --git a/drivers/block/drbd/drbd_sender.c b/drivers/block/drbd/drbd_sender.c
index 0697f99fed18..df0b6c99a59f 100644
--- a/drivers/block/drbd/drbd_sender.c
+++ b/drivers/block/drbd/drbd_sender.c
@@ -1,15 +1,10 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
- drbd_worker.c
-
- This file is part of DRBD by Philipp Reisner and Lars Ellenberg.
-
- Copyright (C) 2001-2008, LINBIT Information Technologies GmbH.
- Copyright (C) 1999-2008, Philipp Reisner <philipp.reisner@linbit.com>.
- Copyright (C) 2002-2008, Lars Ellenberg <lars.ellenberg@linbit.com>.
-
-
-*/
+ * Copyright (C) 1999-2008, Philipp Reisner <philipp.reisner@linbit.com>.
+ * Copyright (C) 2002-2008, Lars Ellenberg <lars.ellenberg@linbit.com>.
+ * Copyright (C) 2001-2008, LINBIT Information Technologies GmbH.
+ * Copyright (C) 2008, LINBIT HA-Solutions GmbH.
+ */
#include <linux/module.h>
#include <linux/drbd.h>
diff --git a/drivers/block/drbd/drbd_state.c b/drivers/block/drbd/drbd_state.c
index adcba7f1d8ea..f1a5d899fd54 100644
--- a/drivers/block/drbd/drbd_state.c
+++ b/drivers/block/drbd/drbd_state.c
@@ -1,16 +1,9 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
- drbd_state.c
-
- This file is part of DRBD by Philipp Reisner and Lars Ellenberg.
-
- Copyright (C) 2001-2008, LINBIT Information Technologies GmbH.
- Copyright (C) 1999-2008, Philipp Reisner <philipp.reisner@linbit.com>.
- Copyright (C) 2002-2008, Lars Ellenberg <lars.ellenberg@linbit.com>.
-
- Thanks to Carter Burden, Bart Grantham and Gennadiy Nerubayev
- from Logicworks, Inc. for making SDP replication support possible.
-
+ * Copyright (C) 1999-2008, Philipp Reisner <philipp.reisner@linbit.com>.
+ * Copyright (C) 2002-2008, Lars Ellenberg <lars.ellenberg@linbit.com>.
+ * Copyright (C) 2001-2008, LINBIT Information Technologies GmbH.
+ * Copyright (C) 2008, LINBIT HA-Solutions GmbH.
*/
#include <linux/drbd_limits.h>
diff --git a/drivers/block/drbd/drbd_strings.c b/drivers/block/drbd/drbd_strings.c
index 0a06f744b096..a35ff87a93b1 100644
--- a/drivers/block/drbd/drbd_strings.c
+++ b/drivers/block/drbd/drbd_strings.c
@@ -1,15 +1,7 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
- drbd.h
-
- This file is part of DRBD by Philipp Reisner and Lars Ellenberg.
-
- Copyright (C) 2003-2008, LINBIT Information Technologies GmbH.
- Copyright (C) 2003-2008, Philipp Reisner <philipp.reisner@linbit.com>.
- Copyright (C) 2003-2008, Lars Ellenberg <lars.ellenberg@linbit.com>.
-
-
-*/
+ * Copyright (C) 2014, LINBIT HA-Solutions GmbH.
+ */
#include <linux/drbd.h>
#include "drbd_strings.h"
diff --git a/drivers/block/drbd/drbd_strings.h b/drivers/block/drbd/drbd_strings.h
index 0201f6590f6a..397c2eb9b666 100644
--- a/drivers/block/drbd/drbd_strings.h
+++ b/drivers/block/drbd/drbd_strings.h
@@ -1,4 +1,8 @@
/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright (C) 2014, LINBIT HA-Solutions GmbH.
+ */
+
#ifndef __DRBD_STRINGS_H
#define __DRBD_STRINGS_H
diff --git a/drivers/block/drbd/drbd_vli.h b/drivers/block/drbd/drbd_vli.h
index 941c511cc4da..609a91c68a86 100644
--- a/drivers/block/drbd/drbd_vli.h
+++ b/drivers/block/drbd/drbd_vli.h
@@ -1,13 +1,9 @@
/* SPDX-License-Identifier: GPL-2.0-only */
/*
--*- linux-c -*-
- drbd_receiver.c
- This file is part of DRBD by Philipp Reisner and Lars Ellenberg.
-
- Copyright (C) 2001-2008, LINBIT Information Technologies GmbH.
- Copyright (C) 1999-2008, Philipp Reisner <philipp.reisner@linbit.com>.
- Copyright (C) 2002-2008, Lars Ellenberg <lars.ellenberg@linbit.com>.
-
+ * Copyright (C) 1999-2008, Philipp Reisner <philipp.reisner@linbit.com>.
+ * Copyright (C) 2002-2008, Lars Ellenberg <lars.ellenberg@linbit.com>.
+ * Copyright (C) 2001-2008, LINBIT Information Technologies GmbH.
+ * Copyright (C) 2008, LINBIT HA-Solutions GmbH.
*/
#ifndef _DRBD_VLI_H
diff --git a/include/uapi/linux/drbd.h b/include/uapi/linux/drbd.h
index cf1ec3eb872f..b7d6b1c52df0 100644
--- a/include/uapi/linux/drbd.h
+++ b/include/uapi/linux/drbd.h
@@ -1,16 +1,8 @@
/* SPDX-License-Identifier: GPL-2.0-or-later WITH Linux-syscall-note */
/*
- drbd.h
- Kernel module for 2.6.x Kernels
-
- This file is part of DRBD by Philipp Reisner and Lars Ellenberg.
-
- Copyright (C) 2001-2008, LINBIT Information Technologies GmbH.
- Copyright (C) 2001-2008, Philipp Reisner <philipp.reisner@linbit.com>.
- Copyright (C) 2001-2008, Lars Ellenberg <lars.ellenberg@linbit.com>.
-
+ * Copyright (C) 2014, LINBIT HA-Solutions GmbH.
+ */
-*/
#ifndef _UAPI_LINUX_DRBD_H
#define _UAPI_LINUX_DRBD_H
#include <linux/types.h>
diff --git a/include/uapi/linux/drbd_limits.h b/include/uapi/linux/drbd_limits.h
index acefe84bc602..65d3ebf2437b 100644
--- a/include/uapi/linux/drbd_limits.h
+++ b/include/uapi/linux/drbd_limits.h
@@ -1,8 +1,7 @@
/* SPDX-License-Identifier: GPL-2.0-only WITH Linux-syscall-note */
/*
- drbd_limits.h
- This file is part of DRBD by Philipp Reisner and Lars Ellenberg.
-*/
+ * Copyright (C) 2014, LINBIT HA-Solutions GmbH.
+ */
/*
* Our current limitations.
--
2.55.0
^ permalink raw reply [flat|nested] 11+ messages in thread* [PATCH 3/7] drbd: raise the socket buffer size limits to 128 MiB
2026-09-23 14:06 [PATCH 0/7] drbd: preparation for DRBD 9 Christoph Böhmwalder
2026-09-23 14:06 ` [PATCH 1/7] drbd: rename drbd_worker.c to drbd_sender.c Christoph Böhmwalder
2026-09-23 14:06 ` [PATCH 2/7] drbd: modernize the file header comments Christoph Böhmwalder
@ 2026-09-23 14:06 ` Christoph Böhmwalder
2026-09-23 14:06 ` [PATCH 4/7] drbd: raise the maximum resync rate to 8 GiB/s Christoph Böhmwalder
` (5 subsequent siblings)
8 siblings, 0 replies; 11+ messages in thread
From: Christoph Böhmwalder @ 2026-09-23 14:06 UTC (permalink / raw)
To: Jens Axboe
Cc: Philipp Reisner, Lars Ellenberg, drbd-dev, linux-block,
linux-kernel, Christoph Böhmwalder, Lars Ellenberg
sndbuf-size and rcvbuf-size are capped at 10 MiB, with a comment that a
larger TCP buffer is not useful. That was written for the networks of
2008. On today's long-haul 25G+ links the bandwidth-delay product of a
single DRBD connection easily exceeds 10 MiB, and the cap then limits
replication throughput regardless of how the rest of the stack is tuned.
Raise both limits to 128 MiB, the value DRBD 9 has used for years. The
defaults are unchanged: 0 keeps the kernel's auto-tuning.
Signed-off-by: Christoph Böhmwalder <christoph.boehmwalder@linbit.com>
---
include/uapi/linux/drbd_limits.h | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/include/uapi/linux/drbd_limits.h b/include/uapi/linux/drbd_limits.h
index 65d3ebf2437b..4132b619376c 100644
--- a/include/uapi/linux/drbd_limits.h
+++ b/include/uapi/linux/drbd_limits.h
@@ -87,14 +87,13 @@
#define DRBD_MAX_EPOCH_SIZE_DEF 2048U
#define DRBD_MAX_EPOCH_SIZE_SCALE '1'
- /* I don't think that a tcp send buffer of more than 10M is useful */
#define DRBD_SNDBUF_SIZE_MIN 0U
-#define DRBD_SNDBUF_SIZE_MAX (10U<<20)
+#define DRBD_SNDBUF_SIZE_MAX (128U << 20)
#define DRBD_SNDBUF_SIZE_DEF 0U
#define DRBD_SNDBUF_SIZE_SCALE '1'
#define DRBD_RCVBUF_SIZE_MIN 0U
-#define DRBD_RCVBUF_SIZE_MAX (10U<<20)
+#define DRBD_RCVBUF_SIZE_MAX (128U << 20)
#define DRBD_RCVBUF_SIZE_DEF 0U
#define DRBD_RCVBUF_SIZE_SCALE '1'
--
2.55.0
^ permalink raw reply [flat|nested] 11+ messages in thread* [PATCH 4/7] drbd: raise the maximum resync rate to 8 GiB/s
2026-09-23 14:06 [PATCH 0/7] drbd: preparation for DRBD 9 Christoph Böhmwalder
` (2 preceding siblings ...)
2026-09-23 14:06 ` [PATCH 3/7] drbd: raise the socket buffer size limits to 128 MiB Christoph Böhmwalder
@ 2026-09-23 14:06 ` Christoph Böhmwalder
2026-09-23 14:06 ` [PATCH 5/7] drbd: replace the drbd_interval bitfields with a type and flags Christoph Böhmwalder
` (4 subsequent siblings)
8 siblings, 0 replies; 11+ messages in thread
From: Christoph Böhmwalder @ 2026-09-23 14:06 UTC (permalink / raw)
To: Jens Axboe
Cc: Philipp Reisner, Lars Ellenberg, drbd-dev, linux-block,
linux-kernel, Christoph Böhmwalder, Lars Ellenberg
The resync-rate limit tops out at 4 GiB/s, which was chosen for bonded
10 GbE. Current hardware exceeds that with a single link. Double the
limit to 8 GiB/s, matching DRBD 9, and make the constant unsigned like
its neighbours.
Signed-off-by: Christoph Böhmwalder <christoph.boehmwalder@linbit.com>
---
include/uapi/linux/drbd_limits.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/include/uapi/linux/drbd_limits.h b/include/uapi/linux/drbd_limits.h
index 4132b619376c..bba0a0aa8792 100644
--- a/include/uapi/linux/drbd_limits.h
+++ b/include/uapi/linux/drbd_limits.h
@@ -121,7 +121,7 @@
/* FIXME allow rate to be zero? */
#define DRBD_RESYNC_RATE_MIN 1U
/* channel bonding 10 GbE, or other hardware */
-#define DRBD_RESYNC_RATE_MAX (4 << 20)
+#define DRBD_RESYNC_RATE_MAX (8U << 20)
#define DRBD_RESYNC_RATE_DEF 250U
#define DRBD_RESYNC_RATE_SCALE 'k' /* kilobytes */
--
2.55.0
^ permalink raw reply [flat|nested] 11+ messages in thread* [PATCH 5/7] drbd: replace the drbd_interval bitfields with a type and flags
2026-09-23 14:06 [PATCH 0/7] drbd: preparation for DRBD 9 Christoph Böhmwalder
` (3 preceding siblings ...)
2026-09-23 14:06 ` [PATCH 4/7] drbd: raise the maximum resync rate to 8 GiB/s Christoph Böhmwalder
@ 2026-09-23 14:06 ` Christoph Böhmwalder
2026-09-23 14:06 ` [PATCH 6/7] drbd: move the packet name table to drbd_strings.c Christoph Böhmwalder
` (3 subsequent siblings)
8 siblings, 0 replies; 11+ messages in thread
From: Christoph Böhmwalder @ 2026-09-23 14:06 UTC (permalink / raw)
To: Jens Axboe
Cc: Philipp Reisner, Lars Ellenberg, drbd-dev, linux-block,
linux-kernel, Christoph Böhmwalder, Lars Ellenberg
struct drbd_interval carries three single-bit fields: whether the
request is local, whether someone waits for it, and whether it has
completed. They only say "local or not", so every user that needs to
know what kind of request an interval belongs to has to look at the
containing object.
Record the kind of request in the interval itself as an
enum drbd_interval_type, set by whoever allocates the request, and turn
the remaining bits into an atomic flags word so they can be tested and
set with the usual bit operations. drbd_interval_is_local() replaces
the open-coded tests of the "local" bit.
This is the representation the DRBD 9 conflict handling is built on;
the types are the ones it uses, so the rework only has to add flags.
No functional change.
Signed-off-by: Christoph Böhmwalder <christoph.boehmwalder@linbit.com>
---
drivers/block/drbd/drbd_interval.h | 51 +++++++++++++++++++++++-------
drivers/block/drbd/drbd_main.c | 2 +-
drivers/block/drbd/drbd_receiver.c | 21 ++++++++----
drivers/block/drbd/drbd_req.c | 17 +++++-----
drivers/block/drbd/drbd_sender.c | 5 +++
5 files changed, 68 insertions(+), 28 deletions(-)
diff --git a/drivers/block/drbd/drbd_interval.h b/drivers/block/drbd/drbd_interval.h
index 9d290ac120cd..3749377ec172 100644
--- a/drivers/block/drbd/drbd_interval.h
+++ b/drivers/block/drbd/drbd_interval.h
@@ -9,20 +9,47 @@
#include <linux/types.h>
#include <linux/rbtree.h>
+/*
+ * Interval types stored directly in drbd_interval so that we can handle
+ * conflicts without having to inspect the containing object. The value 0 is
+ * reserved for uninitialized intervals.
+ */
+enum drbd_interval_type {
+ INTERVAL_LOCAL_WRITE = 1,
+ INTERVAL_PEER_WRITE,
+ INTERVAL_LOCAL_READ,
+ INTERVAL_PEER_READ,
+ INTERVAL_RESYNC_WRITE, /* C_SYNC_TARGET */
+ INTERVAL_RESYNC_READ, /* C_SYNC_SOURCE */
+ INTERVAL_OV_READ_SOURCE, /* C_VERIFY_S */
+ INTERVAL_OV_READ_TARGET, /* C_VERIFY_T */
+};
+
+enum drbd_interval_flags {
+ /* Someone is waiting on device->misc_wait for this to make progress. */
+ INTERVAL_WAITING,
+
+ /* This has been completed already; ignore for conflict detection. */
+ INTERVAL_COMPLETED,
+};
+
struct drbd_interval {
struct rb_node rb;
sector_t sector; /* start sector of the interval */
sector_t end; /* highest interval end in subtree */
unsigned int size; /* size in bytes */
- unsigned int local:1 /* local or remote request? */;
- unsigned int waiting:1; /* someone is waiting for completion */
- unsigned int completed:1; /* this has been completed already;
- * ignore for conflict detection */
+ enum drbd_interval_type type; /* what type of interval this is */
+ unsigned long flags;
/* to resume a partially successful drbd_al_begin_io_nonblock(); */
unsigned int partially_in_al_next_enr;
};
+static inline bool drbd_interval_is_local(struct drbd_interval *i)
+{
+ return i->type == INTERVAL_LOCAL_READ || i->type == INTERVAL_LOCAL_WRITE;
+}
+
static inline void drbd_clear_interval(struct drbd_interval *i)
{
RB_CLEAR_NODE(&i->rb);
@@ -33,14 +60,14 @@ static inline bool drbd_interval_empty(struct drbd_interval *i)
return RB_EMPTY_NODE(&i->rb);
}
-extern bool drbd_insert_interval(struct rb_root *, struct drbd_interval *);
-extern bool drbd_contains_interval(struct rb_root *, sector_t,
- struct drbd_interval *);
-extern void drbd_remove_interval(struct rb_root *, struct drbd_interval *);
-extern struct drbd_interval *drbd_find_overlap(struct rb_root *, sector_t,
- unsigned int);
-extern struct drbd_interval *drbd_next_overlap(struct drbd_interval *, sector_t,
- unsigned int);
+bool drbd_insert_interval(struct rb_root *root, struct drbd_interval *this);
+bool drbd_contains_interval(struct rb_root *root, sector_t sector,
+ struct drbd_interval *interval);
+void drbd_remove_interval(struct rb_root *root, struct drbd_interval *this);
+struct drbd_interval *drbd_find_overlap(struct rb_root *root, sector_t sector,
+ unsigned int size);
+struct drbd_interval *drbd_next_overlap(struct drbd_interval *i,
+ sector_t sector, unsigned int size);
#define drbd_for_each_overlap(i, root, sector, size) \
for (i = drbd_find_overlap(root, sector, size); \
diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c
index 590ac5cb84f5..09e42706c83e 100644
--- a/drivers/block/drbd/drbd_main.c
+++ b/drivers/block/drbd/drbd_main.c
@@ -3656,7 +3656,7 @@ int drbd_wait_misc(struct drbd_device *device, struct drbd_interval *i)
rcu_read_unlock();
/* Indicate to wake up device->misc_wait on progress. */
- i->waiting = true;
+ set_bit(INTERVAL_WAITING, &i->flags);
prepare_to_wait(&device->misc_wait, &wait, TASK_INTERRUPTIBLE);
spin_unlock_irq(&device->resource->req_lock);
timeout = schedule_timeout(timeout);
diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c
index 2c4507add143..3ebe18535fcf 100644
--- a/drivers/block/drbd/drbd_receiver.c
+++ b/drivers/block/drbd/drbd_receiver.c
@@ -1540,7 +1540,7 @@ static void drbd_remove_epoch_entry_interval(struct drbd_device *device,
drbd_clear_interval(i);
/* Wake up any processes waiting for this peer request to complete. */
- if (i->waiting)
+ if (test_bit(INTERVAL_WAITING, &i->flags))
wake_up(&device->misc_wait);
}
@@ -1878,6 +1878,8 @@ static int recv_resync_read(struct drbd_peer_device *peer_device, sector_t secto
if (!peer_req)
goto fail;
+ peer_req->i.type = INTERVAL_RESYNC_WRITE;
+
dec_rs_pending(peer_device);
inc_unacked(device);
@@ -1916,7 +1918,7 @@ find_request(struct drbd_device *device, struct rb_root *root, u64 id,
/* Request object according to our peer */
req = (struct drbd_request *)(unsigned long)id;
- if (drbd_contains_interval(root, sector, &req->i) && req->i.local)
+ if (drbd_contains_interval(root, sector, &req->i) && drbd_interval_is_local(&req->i))
return req;
if (!missing_ok) {
drbd_err(device, "%s: failed to find request 0x%lx, sector %llus\n", func,
@@ -1999,7 +2001,7 @@ static void restart_conflicting_writes(struct drbd_device *device,
struct drbd_request *req;
drbd_for_each_overlap(i, &device->write_requests, sector, size) {
- if (!i->local)
+ if (!drbd_interval_is_local(i))
continue;
req = container_of(i, struct drbd_request, i);
if (req->rq_state & RQ_LOCAL_PENDING ||
@@ -2239,7 +2241,7 @@ static void fail_postponed_requests(struct drbd_device *device, sector_t sector,
struct drbd_request *req;
struct bio_and_error m;
- if (!i->local)
+ if (!drbd_interval_is_local(i))
continue;
req = container_of(i, struct drbd_request, i);
if (!(req->rq_state & RQ_POSTPONED))
@@ -2275,10 +2277,10 @@ static int handle_write_conflicts(struct drbd_device *device,
drbd_for_each_overlap(i, &device->write_requests, sector, size) {
if (i == &peer_req->i)
continue;
- if (i->completed)
+ if (test_bit(INTERVAL_COMPLETED, &i->flags))
continue;
- if (!i->local) {
+ if (!drbd_interval_is_local(i)) {
/*
* Our peer has sent a conflicting remote request; this
* should not happen in a two-node setup. Wait for the
@@ -2409,6 +2411,7 @@ static int receive_Data(struct drbd_connection *connection, struct packet_info *
return -EIO;
}
+ peer_req->i.type = INTERVAL_PEER_WRITE;
peer_req->w.cb = e_end_block;
peer_req->submit_jif = jiffies;
peer_req->flags |= EE_APPLICATION;
@@ -2687,6 +2690,7 @@ static int receive_DataRequest(struct drbd_connection *connection, struct packet
switch (pi->cmd) {
case P_DATA_REQUEST:
+ peer_req->i.type = INTERVAL_PEER_READ;
peer_req->w.cb = w_e_end_data_req;
/* application IO, don't drbd_rs_begin_io */
peer_req->flags |= EE_APPLICATION;
@@ -2700,6 +2704,7 @@ static int receive_DataRequest(struct drbd_connection *connection, struct packet
peer_req->flags |= EE_RS_THIN_REQ;
fallthrough;
case P_RS_DATA_REQUEST:
+ peer_req->i.type = INTERVAL_RESYNC_READ;
peer_req->w.cb = w_e_end_rsdata_req;
/* used in the sector offset progress display */
device->bm_resync_fo = BM_SECT_TO_BIT(sector);
@@ -2722,6 +2727,7 @@ static int receive_DataRequest(struct drbd_connection *connection, struct packet
if (pi->cmd == P_CSUM_RS_REQUEST) {
D_ASSERT(device, peer_device->connection->agreed_pro_version >= 89);
+ peer_req->i.type = INTERVAL_RESYNC_READ;
peer_req->w.cb = w_e_end_csum_rs_req;
/* used in the sector offset progress display */
device->bm_resync_fo = BM_SECT_TO_BIT(sector);
@@ -2730,6 +2736,7 @@ static int receive_DataRequest(struct drbd_connection *connection, struct packet
} else if (pi->cmd == P_OV_REPLY) {
/* track progress, we may need to throttle */
atomic_add(size >> 9, &device->rs_sect_in);
+ peer_req->i.type = INTERVAL_OV_READ_SOURCE;
peer_req->w.cb = w_e_end_ov_reply;
dec_rs_pending(peer_device);
/* drbd_rs_begin_io done when we sent this request,
@@ -2754,6 +2761,7 @@ static int receive_DataRequest(struct drbd_connection *connection, struct packet
drbd_info(device, "Online Verify start sector: %llu\n",
(unsigned long long)sector);
}
+ peer_req->i.type = INTERVAL_OV_READ_TARGET;
peer_req->w.cb = w_e_end_ov_req;
break;
@@ -4786,6 +4794,7 @@ static int receive_rs_deallocated(struct drbd_connection *connection, struct pac
return -ENOMEM;
}
+ peer_req->i.type = INTERVAL_RESYNC_WRITE;
peer_req->w.cb = e_end_resync_block;
peer_req->opf = REQ_OP_DISCARD;
peer_req->submit_jif = jiffies;
diff --git a/drivers/block/drbd/drbd_req.c b/drivers/block/drbd/drbd_req.c
index 1648d0dabcbd..f16b925fecc1 100644
--- a/drivers/block/drbd/drbd_req.c
+++ b/drivers/block/drbd/drbd_req.c
@@ -35,8 +35,7 @@ static struct drbd_request *drbd_req_new(struct drbd_device *device, struct bio
drbd_clear_interval(&req->i);
req->i.sector = bio_src->bi_iter.bi_sector;
req->i.size = bio_src->bi_iter.bi_size;
- req->i.local = true;
- req->i.waiting = false;
+ req->i.type = bio_data_dir(bio_src) == WRITE ? INTERVAL_LOCAL_WRITE : INTERVAL_LOCAL_READ;
INIT_LIST_HEAD(&req->tl_requests);
INIT_LIST_HEAD(&req->w.list);
@@ -59,7 +58,7 @@ static void drbd_remove_request_interval(struct rb_root *root,
drbd_remove_interval(root, i);
/* Wake up any processes waiting for this request to complete. */
- if (i->waiting)
+ if (test_bit(INTERVAL_WAITING, &i->flags))
wake_up(&device->misc_wait);
}
@@ -270,10 +269,10 @@ void drbd_req_complete(struct drbd_request *req, struct bio_and_error *m)
* write-acks in protocol != C during resync.
* But we mark it as "complete", so it won't be counted as
* conflict in a multi-primary setup. */
- req->i.completed = true;
+ set_bit(INTERVAL_COMPLETED, &req->i.flags);
}
- if (req->i.waiting)
+ if (test_bit(INTERVAL_WAITING, &req->i.flags))
wake_up(&device->misc_wait);
/* Either we are about to complete to upper layers,
@@ -505,7 +504,7 @@ static void mod_rq_state(struct drbd_request *req, struct bio_and_error *m,
/* potentially complete and destroy */
/* If we made progress, retry conflicting peer requests, if any. */
- if (req->i.waiting)
+ if (test_bit(INTERVAL_WAITING, &req->i.flags))
wake_up(&device->misc_wait);
drbd_req_put_completion_ref(req, m, c_put);
@@ -786,7 +785,7 @@ int __req_mod(struct drbd_request *req, enum drbd_req_event what,
*/
D_ASSERT(device, req->rq_state & RQ_NET_PENDING);
req->rq_state |= RQ_POSTPONED;
- if (req->i.waiting)
+ if (test_bit(INTERVAL_WAITING, &req->i.flags))
wake_up(&device->misc_wait);
/* Do not clear RQ_NET_PENDING. This request will make further
* progress via restart_conflicting_writes() or
@@ -957,7 +956,7 @@ static void complete_conflicting_writes(struct drbd_request *req)
for (;;) {
drbd_for_each_overlap(i, &device->write_requests, sector, size) {
/* Ignore, if already completed to upper layers. */
- if (i->completed)
+ if (test_bit(INTERVAL_COMPLETED, &i->flags))
continue;
/* Handle the first found overlap. After the schedule
* we have to restart the tree walk. */
@@ -968,7 +967,7 @@ static void complete_conflicting_writes(struct drbd_request *req)
/* Indicate to wake up device->misc_wait on progress. */
prepare_to_wait(&device->misc_wait, &wait, TASK_UNINTERRUPTIBLE);
- i->waiting = true;
+ set_bit(INTERVAL_WAITING, &i->flags);
spin_unlock_irq(&device->resource->req_lock);
schedule();
spin_lock_irq(&device->resource->req_lock);
diff --git a/drivers/block/drbd/drbd_sender.c b/drivers/block/drbd/drbd_sender.c
index df0b6c99a59f..69b3676961d2 100644
--- a/drivers/block/drbd/drbd_sender.c
+++ b/drivers/block/drbd/drbd_sender.c
@@ -394,6 +394,11 @@ static int read_for_csum(struct drbd_peer_device *peer_device, sector_t sector,
if (!peer_req)
goto defer;
+ /*
+ * This will be a resync write once we receive the data back from the
+ * peer, assuming the checksums differ.
+ */
+ peer_req->i.type = INTERVAL_RESYNC_WRITE;
peer_req->w.cb = w_e_send_csum;
peer_req->opf = REQ_OP_READ;
spin_lock_irq(&device->resource->req_lock);
--
2.55.0
^ permalink raw reply [flat|nested] 11+ messages in thread* [PATCH 6/7] drbd: move the packet name table to drbd_strings.c
2026-09-23 14:06 [PATCH 0/7] drbd: preparation for DRBD 9 Christoph Böhmwalder
` (4 preceding siblings ...)
2026-09-23 14:06 ` [PATCH 5/7] drbd: replace the drbd_interval bitfields with a type and flags Christoph Böhmwalder
@ 2026-09-23 14:06 ` Christoph Böhmwalder
2026-09-23 14:06 ` [PATCH 7/7] drbd: rate limit log messages per object Christoph Böhmwalder
` (2 subsequent siblings)
8 siblings, 0 replies; 11+ messages in thread
From: Christoph Böhmwalder @ 2026-09-23 14:06 UTC (permalink / raw)
To: Jens Axboe
Cc: Philipp Reisner, Lars Ellenberg, drbd-dev, linux-block,
linux-kernel, Christoph Böhmwalder, Lars Ellenberg
The string tables for the state enums live in drbd_strings.c, but the
one for the wire protocol commands is a static array hidden inside
cmdname() in drbd_main.c. Move it next to the others as
drbd_packet_name(), and use the enum names themselves as the strings,
so a log message names exactly the constant a reader will grep for.
While at it, describe each table by a struct state_names, and make the
lookup helpers uniform: every one of them range-checks against the
table size and returns "?" for an index without a name, instead of
three different "TOO_LARGE"/"TOO_SMALL" strings.
This is the layout drbd_strings.[ch] have in DRBD 9.
Signed-off-by: Christoph Böhmwalder <christoph.boehmwalder@linbit.com>
---
drivers/block/drbd/drbd_int.h | 1 -
drivers/block/drbd/drbd_main.c | 74 -----------------
drivers/block/drbd/drbd_receiver.c | 18 ++---
drivers/block/drbd/drbd_strings.c | 126 ++++++++++++++++++++++++++---
drivers/block/drbd/drbd_strings.h | 23 +++++-
5 files changed, 142 insertions(+), 100 deletions(-)
diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h
index d3ca2b730a11..297deac20f7e 100644
--- a/drivers/block/drbd/drbd_int.h
+++ b/drivers/block/drbd/drbd_int.h
@@ -104,7 +104,6 @@ extern struct ratelimit_state drbd_ratelimit_state;
extern struct idr drbd_devices; /* RCU, updates: genl_lock() */
extern struct list_head drbd_resources; /* RCU, updates: genl_lock() */
-extern const char *cmdname(enum drbd_packet cmd);
/* for sending/receiving the bitmap,
* possibly in some encoding scheme */
diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c
index 09e42706c83e..fc674acf8bd4 100644
--- a/drivers/block/drbd/drbd_main.c
+++ b/drivers/block/drbd/drbd_main.c
@@ -3560,80 +3560,6 @@ static void md_sync_timer_fn(struct timer_list *t)
drbd_device_post_work(device, MD_SYNC);
}
-const char *cmdname(enum drbd_packet cmd)
-{
- /* THINK may need to become several global tables
- * when we want to support more than
- * one PRO_VERSION */
- static const char *cmdnames[] = {
-
- [P_DATA] = "Data",
- [P_DATA_REPLY] = "DataReply",
- [P_RS_DATA_REPLY] = "RSDataReply",
- [P_BARRIER] = "Barrier",
- [P_BITMAP] = "ReportBitMap",
- [P_BECOME_SYNC_TARGET] = "BecomeSyncTarget",
- [P_BECOME_SYNC_SOURCE] = "BecomeSyncSource",
- [P_UNPLUG_REMOTE] = "UnplugRemote",
- [P_DATA_REQUEST] = "DataRequest",
- [P_RS_DATA_REQUEST] = "RSDataRequest",
- [P_SYNC_PARAM] = "SyncParam",
- [P_PROTOCOL] = "ReportProtocol",
- [P_UUIDS] = "ReportUUIDs",
- [P_SIZES] = "ReportSizes",
- [P_STATE] = "ReportState",
- [P_SYNC_UUID] = "ReportSyncUUID",
- [P_AUTH_CHALLENGE] = "AuthChallenge",
- [P_AUTH_RESPONSE] = "AuthResponse",
- [P_STATE_CHG_REQ] = "StateChgRequest",
- [P_PING] = "Ping",
- [P_PING_ACK] = "PingAck",
- [P_RECV_ACK] = "RecvAck",
- [P_WRITE_ACK] = "WriteAck",
- [P_RS_WRITE_ACK] = "RSWriteAck",
- [P_SUPERSEDED] = "Superseded",
- [P_NEG_ACK] = "NegAck",
- [P_NEG_DREPLY] = "NegDReply",
- [P_NEG_RS_DREPLY] = "NegRSDReply",
- [P_BARRIER_ACK] = "BarrierAck",
- [P_STATE_CHG_REPLY] = "StateChgReply",
- [P_OV_REQUEST] = "OVRequest",
- [P_OV_REPLY] = "OVReply",
- [P_OV_RESULT] = "OVResult",
- [P_CSUM_RS_REQUEST] = "CsumRSRequest",
- [P_RS_IS_IN_SYNC] = "CsumRSIsInSync",
- [P_SYNC_PARAM89] = "SyncParam89",
- [P_COMPRESSED_BITMAP] = "CBitmap",
- [P_DELAY_PROBE] = "DelayProbe",
- [P_OUT_OF_SYNC] = "OutOfSync",
- [P_RS_CANCEL] = "RSCancel",
- [P_CONN_ST_CHG_REQ] = "conn_st_chg_req",
- [P_CONN_ST_CHG_REPLY] = "conn_st_chg_reply",
- [P_PROTOCOL_UPDATE] = "protocol_update",
- [P_TRIM] = "Trim",
- [P_RS_THIN_REQ] = "rs_thin_req",
- [P_RS_DEALLOCATED] = "rs_deallocated",
- [P_WSAME] = "WriteSame",
- [P_ZEROES] = "Zeroes",
-
- /* enum drbd_packet, but not commands - obsoleted flags:
- * P_MAY_IGNORE
- * P_MAX_OPT_CMD
- */
- };
-
- /* too big for the array: 0xfffX */
- if (cmd == P_INITIAL_META)
- return "InitialMeta";
- if (cmd == P_INITIAL_DATA)
- return "InitialData";
- if (cmd == P_CONNECTION_FEATURES)
- return "ConnectionFeatures";
- if (cmd >= ARRAY_SIZE(cmdnames))
- return "Unknown";
- return cmdnames[cmd];
-}
-
/**
* drbd_wait_misc - wait for a request to make progress
* @device: device associated with the request
diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c
index 3ebe18535fcf..fa87cbba756b 100644
--- a/drivers/block/drbd/drbd_receiver.c
+++ b/drivers/block/drbd/drbd_receiver.c
@@ -3655,7 +3655,7 @@ static int ignore_remaining_packet(struct drbd_connection *connection, struct pa
static int config_unknown_volume(struct drbd_connection *connection, struct packet_info *pi)
{
drbd_warn(connection, "%s packet received for volume %u, which is not configured locally\n",
- cmdname(pi->cmd), pi->vnr);
+ drbd_packet_name(pi->cmd), pi->vnr);
return ignore_remaining_packet(connection, pi);
}
@@ -4887,7 +4887,7 @@ static void drbdd(struct drbd_connection *connection)
cmd = &drbd_cmd_handler[pi.cmd];
if (unlikely(pi.cmd >= ARRAY_SIZE(drbd_cmd_handler) || !cmd->fn)) {
drbd_err(connection, "Unexpected data packet %s (0x%04x)",
- cmdname(pi.cmd), pi.cmd);
+ drbd_packet_name(pi.cmd), pi.cmd);
goto err_out;
}
@@ -4896,12 +4896,12 @@ static void drbdd(struct drbd_connection *connection)
shs += sizeof(struct o_qlim);
if (pi.size > shs && !cmd->expect_payload) {
drbd_err(connection, "No payload expected %s l:%d\n",
- cmdname(pi.cmd), pi.size);
+ drbd_packet_name(pi.cmd), pi.size);
goto err_out;
}
if (pi.size < shs) {
drbd_err(connection, "%s: unexpected packet size, expected:%d received:%d\n",
- cmdname(pi.cmd), (int)shs, pi.size);
+ drbd_packet_name(pi.cmd), (int)shs, pi.size);
goto err_out;
}
@@ -4917,7 +4917,7 @@ static void drbdd(struct drbd_connection *connection)
err = cmd->fn(connection, &pi);
if (err) {
drbd_err(connection, "error receiving %s, e: %d l: %d!\n",
- cmdname(pi.cmd), err, pi.size);
+ drbd_packet_name(pi.cmd), err, pi.size);
goto err_out;
}
}
@@ -5110,7 +5110,7 @@ static int drbd_do_features(struct drbd_connection *connection)
if (pi.cmd != P_CONNECTION_FEATURES) {
drbd_err(connection, "expected ConnectionFeatures packet, received: %s (0x%04x)\n",
- cmdname(pi.cmd), pi.cmd);
+ drbd_packet_name(pi.cmd), pi.cmd);
return -1;
}
@@ -5233,7 +5233,7 @@ static int drbd_do_auth(struct drbd_connection *connection)
if (pi.cmd != P_AUTH_CHALLENGE) {
drbd_err(connection, "expected AuthChallenge packet, received: %s (0x%04x)\n",
- cmdname(pi.cmd), pi.cmd);
+ drbd_packet_name(pi.cmd), pi.cmd);
rv = -1;
goto fail;
}
@@ -5299,7 +5299,7 @@ static int drbd_do_auth(struct drbd_connection *connection)
if (pi.cmd != P_AUTH_RESPONSE) {
drbd_err(connection, "expected AuthResponse packet, received: %s (0x%04x)\n",
- cmdname(pi.cmd), pi.cmd);
+ drbd_packet_name(pi.cmd), pi.cmd);
rv = 0;
goto fail;
}
@@ -5859,7 +5859,7 @@ int drbd_ack_receiver(struct drbd_thread *thi)
cmd = &ack_receiver_tbl[pi.cmd];
if (pi.cmd >= ARRAY_SIZE(ack_receiver_tbl) || !cmd->fn) {
drbd_err(connection, "Unexpected meta packet %s (0x%04x)\n",
- cmdname(pi.cmd), pi.cmd);
+ drbd_packet_name(pi.cmd), pi.cmd);
goto disconnect;
}
expect = header_size + cmd->pkt_size;
diff --git a/drivers/block/drbd/drbd_strings.c b/drivers/block/drbd/drbd_strings.c
index a35ff87a93b1..f9fde9defedb 100644
--- a/drivers/block/drbd/drbd_strings.c
+++ b/drivers/block/drbd/drbd_strings.c
@@ -3,10 +3,12 @@
* Copyright (C) 2014, LINBIT HA-Solutions GmbH.
*/
+#include <linux/kernel.h>
#include <linux/drbd.h>
#include "drbd_strings.h"
+#include "drbd_protocol.h"
-static const char * const drbd_conn_s_names[] = {
+static const char * const __conn_state_names[] = {
[C_STANDALONE] = "StandAlone",
[C_DISCONNECTING] = "Disconnecting",
[C_UNCONNECTED] = "Unconnected",
@@ -33,13 +35,23 @@ static const char * const drbd_conn_s_names[] = {
[C_BEHIND] = "Behind",
};
-static const char * const drbd_role_s_names[] = {
+struct state_names drbd_conn_state_names = {
+ .names = __conn_state_names,
+ .size = ARRAY_SIZE(__conn_state_names),
+};
+
+static const char * const __role_state_names[] = {
+ [R_UNKNOWN] = "Unknown",
[R_PRIMARY] = "Primary",
[R_SECONDARY] = "Secondary",
- [R_UNKNOWN] = "Unknown"
};
-static const char * const drbd_disk_s_names[] = {
+struct state_names drbd_role_state_names = {
+ .names = __role_state_names,
+ .size = ARRAY_SIZE(__role_state_names),
+};
+
+static const char * const __disk_state_names[] = {
[D_DISKLESS] = "Diskless",
[D_ATTACHING] = "Attaching",
[D_FAILED] = "Failed",
@@ -51,7 +63,12 @@ static const char * const drbd_disk_s_names[] = {
[D_UP_TO_DATE] = "UpToDate",
};
-static const char * const drbd_state_sw_errors[] = {
+struct state_names drbd_disk_state_names = {
+ .names = __disk_state_names,
+ .size = ARRAY_SIZE(__disk_state_names),
+};
+
+static const char * const __error_messages[] = {
[-SS_TWO_PRIMARIES] = "Multiple primaries not allowed by config",
[-SS_NO_UP_TO_DATE_DISK] = "Need access to UpToDate data",
[-SS_NO_LOCAL_DISK] = "Can not resync without local disk",
@@ -74,25 +91,110 @@ static const char * const drbd_state_sw_errors[] = {
[-SS_O_VOL_PEER_PRI] = "Other vol primary on peer not allowed by config",
};
+struct state_names drbd_error_messages = {
+ .names = __error_messages,
+ .size = ARRAY_SIZE(__error_messages),
+};
+
+static const char * const __packet_names[] = {
+ [P_DATA] = "P_DATA",
+ [P_WSAME] = "P_WSAME",
+ [P_TRIM] = "P_TRIM",
+ [P_DATA_REPLY] = "P_DATA_REPLY",
+ [P_RS_DATA_REPLY] = "P_RS_DATA_REPLY",
+ [P_BARRIER] = "P_BARRIER",
+ [P_BITMAP] = "P_BITMAP",
+ [P_BECOME_SYNC_TARGET] = "P_BECOME_SYNC_TARGET",
+ [P_BECOME_SYNC_SOURCE] = "P_BECOME_SYNC_SOURCE",
+ [P_UNPLUG_REMOTE] = "P_UNPLUG_REMOTE",
+ [P_DATA_REQUEST] = "P_DATA_REQUEST",
+ [P_RS_DATA_REQUEST] = "P_RS_DATA_REQUEST",
+ [P_SYNC_PARAM] = "P_SYNC_PARAM",
+ [P_SYNC_PARAM89] = "P_SYNC_PARAM89",
+ [P_PROTOCOL] = "P_PROTOCOL",
+ [P_UUIDS] = "P_UUIDS",
+ [P_SIZES] = "P_SIZES",
+ [P_STATE] = "P_STATE",
+ [P_SYNC_UUID] = "P_SYNC_UUID",
+ [P_AUTH_CHALLENGE] = "P_AUTH_CHALLENGE",
+ [P_AUTH_RESPONSE] = "P_AUTH_RESPONSE",
+ [P_PING] = "P_PING",
+ [P_PING_ACK] = "P_PING_ACK",
+ [P_RECV_ACK] = "P_RECV_ACK",
+ [P_WRITE_ACK] = "P_WRITE_ACK",
+ [P_RS_WRITE_ACK] = "P_RS_WRITE_ACK",
+ [P_SUPERSEDED] = "P_SUPERSEDED",
+ [P_NEG_ACK] = "P_NEG_ACK",
+ [P_NEG_DREPLY] = "P_NEG_DREPLY",
+ [P_NEG_RS_DREPLY] = "P_NEG_RS_DREPLY",
+ [P_BARRIER_ACK] = "P_BARRIER_ACK",
+ [P_STATE_CHG_REQ] = "P_STATE_CHG_REQ",
+ [P_STATE_CHG_REPLY] = "P_STATE_CHG_REPLY",
+ [P_OV_REQUEST] = "P_OV_REQUEST",
+ [P_OV_REPLY] = "P_OV_REPLY",
+ [P_OV_RESULT] = "P_OV_RESULT",
+ [P_CSUM_RS_REQUEST] = "P_CSUM_RS_REQUEST",
+ [P_RS_IS_IN_SYNC] = "P_RS_IS_IN_SYNC",
+ [P_COMPRESSED_BITMAP] = "P_COMPRESSED_BITMAP",
+ [P_DELAY_PROBE] = "P_DELAY_PROBE",
+ [P_OUT_OF_SYNC] = "P_OUT_OF_SYNC",
+ [P_RETRY_WRITE] = "P_RETRY_WRITE",
+ [P_RS_CANCEL] = "P_RS_CANCEL",
+ [P_CONN_ST_CHG_REQ] = "P_CONN_ST_CHG_REQ",
+ [P_CONN_ST_CHG_REPLY] = "P_CONN_ST_CHG_REPLY",
+ [P_PROTOCOL_UPDATE] = "P_PROTOCOL_UPDATE",
+ [P_RS_THIN_REQ] = "P_RS_THIN_REQ",
+ [P_RS_DEALLOCATED] = "P_RS_DEALLOCATED",
+ [P_ZEROES] = "P_ZEROES",
+ /* enum drbd_packet, but not commands - obsoleted flags:
+ * P_MAY_IGNORE
+ * P_MAX_OPT_CMD
+ */
+};
+
+struct state_names drbd_packet_names = {
+ .names = __packet_names,
+ .size = ARRAY_SIZE(__packet_names),
+};
+
const char *drbd_conn_str(enum drbd_conns s)
{
- /* enums are unsigned... */
- return s > C_BEHIND ? "TOO_LARGE" : drbd_conn_s_names[s];
+ return (s < 0 || s >= drbd_conn_state_names.size ||
+ !drbd_conn_state_names.names[s]) ?
+ "?" : drbd_conn_state_names.names[s];
}
const char *drbd_role_str(enum drbd_role s)
{
- return s > R_SECONDARY ? "TOO_LARGE" : drbd_role_s_names[s];
+ return (s < 0 || s >= drbd_role_state_names.size ||
+ !drbd_role_state_names.names[s]) ?
+ "?" : drbd_role_state_names.names[s];
}
const char *drbd_disk_str(enum drbd_disk_state s)
{
- return s > D_UP_TO_DATE ? "TOO_LARGE" : drbd_disk_s_names[s];
+ return (s < 0 || s >= drbd_disk_state_names.size ||
+ !drbd_disk_state_names.names[s]) ?
+ "?" : drbd_disk_state_names.names[s];
}
const char *drbd_set_st_err_str(enum drbd_state_rv err)
{
- return err <= SS_AFTER_LAST_ERROR ? "TOO_SMALL" :
- err > SS_TWO_PRIMARIES ? "TOO_LARGE"
- : drbd_state_sw_errors[-err];
+ return (-err < 0 || -err >= drbd_error_messages.size ||
+ !drbd_error_messages.names[-err]) ?
+ "?" : drbd_error_messages.names[-err];
+}
+
+const char *drbd_packet_name(enum drbd_packet cmd)
+{
+ /* too big for the array: 0xfffX */
+ if (cmd == P_INITIAL_META)
+ return "InitialMeta";
+ if (cmd == P_INITIAL_DATA)
+ return "InitialData";
+ if (cmd == P_CONNECTION_FEATURES)
+ return "ConnectionFeatures";
+ return (cmd < 0 || cmd >= ARRAY_SIZE(__packet_names) ||
+ !__packet_names[cmd]) ?
+ "?" : __packet_names[cmd];
}
diff --git a/drivers/block/drbd/drbd_strings.h b/drivers/block/drbd/drbd_strings.h
index 397c2eb9b666..a66d9f5fe4d5 100644
--- a/drivers/block/drbd/drbd_strings.h
+++ b/drivers/block/drbd/drbd_strings.h
@@ -6,9 +6,24 @@
#ifndef __DRBD_STRINGS_H
#define __DRBD_STRINGS_H
-extern const char *drbd_conn_str(enum drbd_conns);
-extern const char *drbd_role_str(enum drbd_role);
-extern const char *drbd_disk_str(enum drbd_disk_state);
-extern const char *drbd_set_st_err_str(enum drbd_state_rv);
+struct state_names {
+ const char * const *names;
+ unsigned int size;
+};
+
+extern struct state_names drbd_conn_state_names;
+extern struct state_names drbd_role_state_names;
+extern struct state_names drbd_disk_state_names;
+extern struct state_names drbd_error_messages;
+extern struct state_names drbd_packet_names;
+
+enum drbd_packet;
+
+const char *drbd_conn_str(enum drbd_conns s);
+const char *drbd_role_str(enum drbd_role s);
+const char *drbd_disk_str(enum drbd_disk_state s);
+const char *drbd_set_st_err_str(enum drbd_state_rv err);
+const char *drbd_packet_name(enum drbd_packet cmd);
+
#endif /* __DRBD_STRINGS_H */
--
2.55.0
^ permalink raw reply [flat|nested] 11+ messages in thread* [PATCH 7/7] drbd: rate limit log messages per object
2026-09-23 14:06 [PATCH 0/7] drbd: preparation for DRBD 9 Christoph Böhmwalder
` (5 preceding siblings ...)
2026-09-23 14:06 ` [PATCH 6/7] drbd: move the packet name table to drbd_strings.c Christoph Böhmwalder
@ 2026-09-23 14:06 ` Christoph Böhmwalder
2026-11-09 17:22 ` [PATCH 0/7] drbd: preparation for DRBD 9 Christoph Böhmwalder
2026-11-09 17:40 ` Jens Axboe
8 siblings, 0 replies; 11+ messages in thread
From: Christoph Böhmwalder @ 2026-09-23 14:06 UTC (permalink / raw)
To: Jens Axboe
Cc: Philipp Reisner, Lars Ellenberg, drbd-dev, linux-block,
linux-kernel, Christoph Böhmwalder, Lars Ellenberg
drbd_ratelimit() throttles with one static ratelimit state per call
site. A device with a failing backing disk therefore keeps the log
noisy no matter what the other devices do, and a message a single
device produces in a burst suppresses the same message from every
other device on the node.
Give each resource, connection, peer device and device its own
ratelimit states, selected by a class (GENERIC, and for devices also
METADATA and BACKEND), and route every drbd_printk() through them: the
existing drbd_err() & co. take the NOLIMIT class and behave as before,
the new drbd_err_ratelimit() & co. throttle per object, and
drbd_device_ratelimit(device, class) & co. are available for the
sites that need the decision separately. Convert the drbd_ratelimit()
users accordingly, choosing BACKEND for backing device I/O errors and
METADATA for on-disk bitmap access errors.
While the printk macros are being restructured anyway, let them mark
messages from objects that have already been unregistered: a device,
connection or resource that is deleted but still referenced is now
flagged with UNREGISTERED/C_UNREGISTERED/R_UNREGISTERED, and its
messages carry an "/unregistered/" prefix.
This matches the logging infrastructure of DRBD 9.
Signed-off-by: Christoph Böhmwalder <christoph.boehmwalder@linbit.com>
---
drivers/block/drbd/drbd_actlog.c | 3 +-
drivers/block/drbd/drbd_bitmap.c | 6 +-
drivers/block/drbd/drbd_int.h | 43 +++-
drivers/block/drbd/drbd_main.c | 14 +-
drivers/block/drbd/drbd_nl.c | 2 +
drivers/block/drbd/drbd_polymorph_printk.h | 256 +++++++++++++--------
drivers/block/drbd/drbd_receiver.c | 9 +-
drivers/block/drbd/drbd_req.c | 10 +-
drivers/block/drbd/drbd_sender.c | 22 +-
9 files changed, 243 insertions(+), 122 deletions(-)
diff --git a/drivers/block/drbd/drbd_actlog.c b/drivers/block/drbd/drbd_actlog.c
index 04b8d50e4e9e..43345b82daa2 100644
--- a/drivers/block/drbd/drbd_actlog.c
+++ b/drivers/block/drbd/drbd_actlog.c
@@ -1138,8 +1138,7 @@ void drbd_rs_complete_io(struct drbd_device *device, sector_t sector)
bm_ext = e ? lc_entry(e, struct bm_extent, lce) : NULL;
if (!bm_ext) {
spin_unlock_irqrestore(&device->al_lock, flags);
- if (drbd_ratelimit())
- drbd_err(device, "drbd_rs_complete_io() called, but extent not found\n");
+ drbd_err_ratelimit(device, "%s() called, but extent not found\n", __func__);
return;
}
diff --git a/drivers/block/drbd/drbd_bitmap.c b/drivers/block/drbd/drbd_bitmap.c
index 8416c7e8257c..6892a99eb6f0 100644
--- a/drivers/block/drbd/drbd_bitmap.c
+++ b/drivers/block/drbd/drbd_bitmap.c
@@ -109,7 +109,7 @@ struct drbd_bitmap {
static void __bm_print_lock_info(struct drbd_device *device, const char *func)
{
struct drbd_bitmap *b = device->bitmap;
- if (!drbd_ratelimit())
+ if (!drbd_device_ratelimit(device, GENERIC))
return;
drbd_err(device, "FIXME %s[%d] in %s, bitmap locked for '%s' by %s[%d]\n",
current->comm, task_pid_nr(current),
@@ -948,7 +948,7 @@ static void drbd_bm_endio(struct bio *bio)
bm_set_page_io_err(b->bm_pages[idx]);
/* Not identical to on disk version of it.
* Is BM_PAGE_IO_ERROR enough? */
- if (drbd_ratelimit())
+ if (drbd_device_ratelimit(device, BACKEND))
drbd_err(device, "IO ERROR %d on bitmap page idx %u\n",
bio->bi_status, idx);
} else {
@@ -1009,7 +1009,7 @@ static void bm_page_io_async(struct drbd_bm_aio_ctx *ctx, int page_nr) __must_ho
else
len = PAGE_SIZE;
} else {
- if (drbd_ratelimit()) {
+ if (drbd_device_ratelimit(device, METADATA)) {
drbd_err(device, "Invalid offset during on-disk bitmap access: "
"page idx %u, sector %llu\n", page_nr, on_disk_sector);
}
diff --git a/drivers/block/drbd/drbd_int.h b/drivers/block/drbd/drbd_int.h
index 297deac20f7e..40be382b24d2 100644
--- a/drivers/block/drbd/drbd_int.h
+++ b/drivers/block/drbd/drbd_int.h
@@ -449,6 +449,7 @@ enum {
RS_START, /* tell worker to start resync/OV */
RS_PROGRESS, /* tell worker that resync made significant progress */
RS_DONE, /* tell worker that resync is done */
+ UNREGISTERED, /* minor removed, device may still be referenced */
};
struct drbd_bitmap; /* opaque for drbd_device */
@@ -573,10 +574,21 @@ enum {
DISCONNECT_SENT,
DEVICE_WORK_PENDING, /* tell worker that some device has pending work */
+ C_UNREGISTERED, /* removed from the resource, may still be referenced */
};
enum which_state { NOW, OLD = NOW, NEW };
+/* flag bits per resource */
+enum {
+ R_UNREGISTERED, /* removed from the resources list, may still be referenced */
+};
+
+enum drbd_per_resource_ratelimit {
+ D_RL_R_NOLIMIT = -1,
+ D_RL_R_GENERIC,
+};
+
struct drbd_resource {
char *name;
#ifdef CONFIG_DEBUG_FS
@@ -587,6 +599,10 @@ struct drbd_resource {
#endif
struct kref kref;
struct idr devices; /* volume number to device mapping */
+
+ struct ratelimit_state ratelimit[1];
+
+ unsigned long flags;
struct list_head connections;
struct list_head resources;
struct res_opts res_opts;
@@ -612,6 +628,11 @@ struct drbd_thread_timing_details
unsigned int cb_nr;
};
+enum drbd_per_connection_ratelimit {
+ D_RL_C_NOLIMIT = -1,
+ D_RL_C_GENERIC,
+};
+
struct drbd_connection {
struct list_head connections;
struct drbd_resource *resource;
@@ -622,6 +643,9 @@ struct drbd_connection {
#endif
struct kref kref;
struct idr peer_devices; /* volume number to peer device mapping */
+
+ struct ratelimit_state ratelimit[1];
+
enum drbd_conns cstate; /* Only C_STANDALONE to C_WF_REPORT_PARAMS */
struct mutex cstate_mutex; /* Protects graceful disconnects */
unsigned int connect_cnt; /* Inc each time a connection is established */
@@ -730,16 +754,32 @@ struct submit_worker {
struct list_head writes;
};
+enum drbd_per_peer_device_ratelimit {
+ D_RL_PD_NOLIMIT = -1,
+ D_RL_PD_GENERIC,
+};
+
struct drbd_peer_device {
struct list_head peer_devices;
struct drbd_device *device;
struct drbd_connection *connection;
struct work_struct send_acks_work;
+
+ struct ratelimit_state ratelimit[1];
+
#ifdef CONFIG_DEBUG_FS
struct dentry *debugfs_peer_dev;
#endif
};
+enum drbd_per_device_ratelimit {
+ D_RL_D_NOLIMIT = -1,
+ D_RL_D_GENERIC,
+ D_RL_D_METADATA,
+ D_RL_D_BACKEND,
+ __D_RL_D_N
+};
+
struct drbd_device {
struct drbd_resource *resource;
struct list_head peer_devices;
@@ -755,6 +795,7 @@ struct drbd_device {
struct dentry *debugfs_vol_data_gen_id;
struct dentry *debugfs_vol_ed_gen_id;
#endif
+ struct ratelimit_state ratelimit[__D_RL_D_N];
unsigned int vnr; /* volume number within the connection */
unsigned int minor; /* device minor number */
@@ -1622,7 +1663,7 @@ static inline void __drbd_chk_io_error_(struct drbd_device *device,
switch (ep) {
case EP_PASS_ON: /* FIXME would this be better named "Ignore"? */
if (df == DRBD_READ_ERROR || df == DRBD_WRITE_ERROR) {
- if (drbd_ratelimit())
+ if (drbd_device_ratelimit(device, BACKEND))
drbd_err(device, "Local IO failed in %s.\n", where);
if (device->state.disk > D_INCONSISTENT)
_drbd_set_state(_NS(device, disk, D_INCONSISTENT), CS_HARD, NULL);
diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c
index fc674acf8bd4..aa6ddb2bac15 100644
--- a/drivers/block/drbd/drbd_main.c
+++ b/drivers/block/drbd/drbd_main.c
@@ -2288,6 +2288,7 @@ void drbd_free_resource(struct drbd_resource *resource)
struct drbd_connection *connection, *tmp;
for_each_connection_safe(connection, tmp, resource) {
+ set_bit(C_UNREGISTERED, &connection->flags);
list_del(&connection->connections);
drbd_debugfs_connection_cleanup(connection);
kref_put(&connection->kref, drbd_destroy_connection);
@@ -2515,6 +2516,7 @@ struct drbd_resource *drbd_create_resource(const char *name)
if (!zalloc_cpumask_var(&resource->cpu_mask, GFP_KERNEL))
goto fail_free_name;
kref_init(&resource->kref);
+ ratelimit_state_init(&resource->ratelimit[D_RL_R_GENERIC], 5 * HZ, 10);
idr_init(&resource->devices);
INIT_LIST_HEAD(&resource->connections);
resource->write_ordering = WO_BDEV_FLUSH;
@@ -2583,6 +2585,7 @@ struct drbd_connection *conn_create(const char *name, struct res_opts *res_opts)
connection->ack_receiver.connection = connection;
kref_init(&connection->kref);
+ ratelimit_state_init(&connection->ratelimit[D_RL_C_GENERIC], 5 * HZ, /* no burst */ 1);
connection->resource = resource;
@@ -2667,6 +2670,10 @@ enum drbd_ret_code drbd_create_device(struct drbd_config_context *adm_ctx, unsig
return ERR_NOMEM;
kref_init(&device->kref);
+ ratelimit_state_init(&device->ratelimit[D_RL_D_GENERIC], 5 * HZ, /* no burst */ 1);
+ ratelimit_state_init(&device->ratelimit[D_RL_D_METADATA], 5 * HZ, 10);
+ ratelimit_state_init(&device->ratelimit[D_RL_D_BACKEND], 5 * HZ, 10);
+
kref_get(&resource->kref);
device->resource = resource;
device->minor = minor;
@@ -2726,6 +2733,8 @@ enum drbd_ret_code drbd_create_device(struct drbd_config_context *adm_ctx, unsig
goto out_idr_remove_from_resource;
peer_device->connection = connection;
peer_device->device = device;
+ ratelimit_state_init(&peer_device->ratelimit[D_RL_PD_GENERIC],
+ 5 * HZ, /* no burst */ 1);
list_add(&peer_device->peer_devices, &device->peer_devices);
kref_get(&device->kref);
@@ -3677,9 +3686,8 @@ _drbd_insert_fault(struct drbd_device *device, unsigned int type)
if (ret) {
drbd_fault_count++;
- if (drbd_ratelimit())
- drbd_warn(device, "***Simulating %s failure\n",
- _drbd_fault_str(type));
+ drbd_warn_ratelimit(device, "***Simulating %s failure\n",
+ _drbd_fault_str(type));
}
return ret;
diff --git a/drivers/block/drbd/drbd_nl.c b/drivers/block/drbd/drbd_nl.c
index 51ba8e542928..aa7aae9003be 100644
--- a/drivers/block/drbd/drbd_nl.c
+++ b/drivers/block/drbd/drbd_nl.c
@@ -4496,6 +4496,7 @@ static enum drbd_ret_code adm_del_minor(struct drbd_device *device)
notify_device_state(NULL, 0, device, NULL, NOTIFY_DESTROY);
mutex_unlock(¬ification_mutex);
+ set_bit(UNREGISTERED, &device->flags);
drbd_delete_device(device);
return NO_ERROR;
} else
@@ -4540,6 +4541,7 @@ static int adm_del_resource(struct drbd_resource *resource)
mutex_unlock(¬ification_mutex);
mutex_lock(&resources_mutex);
+ set_bit(R_UNREGISTERED, &resource->flags);
list_del_rcu(&resource->resources);
mutex_unlock(&resources_mutex);
/* Make sure all threads have actually stopped: state handling only
diff --git a/drivers/block/drbd/drbd_polymorph_printk.h b/drivers/block/drbd/drbd_polymorph_printk.h
index 8e0082d139ba..71dcdd1f45b9 100644
--- a/drivers/block/drbd/drbd_polymorph_printk.h
+++ b/drivers/block/drbd/drbd_polymorph_printk.h
@@ -11,104 +11,179 @@
#define DYNAMIC_DEBUG_BRANCH(D) false
#endif
+#define __drbd_printk(level, fmt, args...) \
+ printk(level fmt, ## args)
+#define __drbd_dyn_dbg(descriptor, fmt, args...) \
+ __dynamic_pr_debug(descriptor, fmt, ## args)
+
+#define ___drbd_printk_device(prmacro, rlt, device, lvl_or_desc, fmt, args...)\
+({ \
+ const struct drbd_device *__d = \
+ (const struct drbd_device *)(device); \
+ const struct drbd_resource *__r = __d->resource; \
+ const char *__unregistered = ""; \
+ if (test_bit(UNREGISTERED, &__d->flags)) \
+ __unregistered = "/unregistered/"; \
+ if (drbd_device_ratelimit(__d, rlt)) \
+ prmacro(lvl_or_desc, "drbd %s%s/%u drbd%u: " fmt, \
+ __unregistered, __r->name, __d->vnr, __d->minor,\
+ ## args); \
+})
+
+#define ___drbd_printk_resource(prmacro, rlt, resource, lvl_or_desc, fmt, args...)\
+({ \
+ const struct drbd_resource *__r = \
+ (const struct drbd_resource *)(resource); \
+ const char *__unregistered = ""; \
+ if (test_bit(R_UNREGISTERED, &__r->flags)) \
+ __unregistered = "/unregistered/"; \
+ if (drbd_resource_ratelimit(__r, rlt)) \
+ prmacro(lvl_or_desc, "drbd %s%s: " fmt, \
+ __unregistered, __r->name, ## args); \
+})
-#define __drbd_printk_drbd_device_prep(device) \
- const struct drbd_device *__d = (device); \
- const struct drbd_resource *__r = __d->resource
-#define __drbd_printk_drbd_device_fmt(fmt) "drbd %s/%u drbd%u: " fmt
-#define __drbd_printk_drbd_device_args() __r->name, __d->vnr, __d->minor
-#define __drbd_printk_drbd_device_unprep()
-
-#define __drbd_printk_drbd_peer_device_prep(peer_device) \
- const struct drbd_device *__d; \
- const struct drbd_resource *__r; \
- __d = (peer_device)->device; \
- __r = __d->resource
-#define __drbd_printk_drbd_peer_device_fmt(fmt) \
- "drbd %s/%u drbd%u: " fmt
-#define __drbd_printk_drbd_peer_device_args() \
- __r->name, __d->vnr, __d->minor
-#define __drbd_printk_drbd_peer_device_unprep()
-
-#define __drbd_printk_drbd_resource_prep(resource) \
- const struct drbd_resource *__r = resource
-#define __drbd_printk_drbd_resource_fmt(fmt) "drbd %s: " fmt
-#define __drbd_printk_drbd_resource_args() __r->name
-#define __drbd_printk_drbd_resource_unprep(resource)
-
-#define __drbd_printk_drbd_connection_prep(connection) \
- const struct drbd_connection *__c = (connection); \
- const struct drbd_resource *__r = __c->resource
-#define __drbd_printk_drbd_connection_fmt(fmt) \
- "drbd %s: " fmt
-#define __drbd_printk_drbd_connection_args() \
- __r->name
-#define __drbd_printk_drbd_connection_unprep()
+/*
+ * As long as the connection is still "registered", the resource
+ * can not yet be "unregistered", no need to test R_UNREGISTERED
+ */
+#define ___drbd_printk_peer_device(prmacro, rlt, peer_device, lvl_or_desc, fmt, args...)\
+({ \
+ const struct drbd_peer_device *__pd = \
+ (const struct drbd_peer_device *)(peer_device); \
+ const struct drbd_device *__d = __pd->device; \
+ const struct drbd_connection *__c = __pd->connection; \
+ const struct drbd_resource *__r = __d->resource; \
+ const char *__unregistered = ""; \
+ if (test_bit(C_UNREGISTERED, &__c->flags)) \
+ __unregistered = "/unregistered/"; \
+ if (drbd_peer_device_ratelimit(__pd, rlt)) \
+ prmacro(lvl_or_desc, "drbd %s%s/%u drbd%u: " fmt, \
+ __unregistered, __r->name, __d->vnr, __d->minor,\
+ ## args); \
+})
+
+#define ___drbd_printk_connection(prmacro, rlt, connection, lvl_or_desc, fmt, args...) \
+({ \
+ const struct drbd_connection *__c = \
+ (const struct drbd_connection *)(connection); \
+ const struct drbd_resource *__r = __c->resource; \
+ const char *__unregistered = ""; \
+ if (test_bit(C_UNREGISTERED, &__c->flags)) \
+ __unregistered = "/unregistered/"; \
+ if (drbd_connection_ratelimit(__c, rlt)) \
+ prmacro(lvl_or_desc, "drbd %s%s: " fmt, \
+ __unregistered, __r->name, ## args); \
+})
+
+#define __drbd_printk_device(rlt, device, level, fmt, args...)\
+ ___drbd_printk_device(__drbd_printk, rlt, device, level, fmt, ## args)
+#define __drbd_printk_resource(rlt, resource, level, fmt, args...)\
+ ___drbd_printk_resource(__drbd_printk, rlt, resource, level, fmt, ## args)
+#define __drbd_printk_peer_device(rlt, peer_device, level, fmt, args...)\
+ ___drbd_printk_peer_device(__drbd_printk, rlt, peer_device, level, fmt, ## args)
+#define __drbd_printk_connection(rlt, connection, level, fmt, args...)\
+ ___drbd_printk_connection(__drbd_printk, rlt, connection, level, fmt, ## args)
void drbd_printk_with_wrong_object_type(void);
void drbd_dyn_dbg_with_wrong_object_type(void);
#define __drbd_printk_choose_cond(obj, struct_name) \
- (__builtin_types_compatible_p(typeof(obj), struct struct_name *) || \
- __builtin_types_compatible_p(typeof(obj), const struct struct_name *))
-#define __drbd_printk_if_same_type(obj, struct_name, level, fmt, args...) \
- __drbd_printk_choose_cond(obj, struct_name), \
-({ \
- __drbd_printk_ ## struct_name ## _prep((const struct struct_name *)(obj)); \
- printk(level __drbd_printk_ ## struct_name ## _fmt(fmt), \
- __drbd_printk_ ## struct_name ## _args(), ## args); \
- __drbd_printk_ ## struct_name ## _unprep(); \
-})
-
-#define drbd_printk(level, obj, fmt, args...) \
- __builtin_choose_expr( \
- __drbd_printk_if_same_type(obj, drbd_device, level, fmt, ## args), \
- __builtin_choose_expr( \
- __drbd_printk_if_same_type(obj, drbd_resource, level, fmt, ## args), \
- __builtin_choose_expr( \
- __drbd_printk_if_same_type(obj, drbd_connection, level, fmt, ## args), \
- __builtin_choose_expr( \
- __drbd_printk_if_same_type(obj, drbd_peer_device, level, fmt, ## args), \
- drbd_printk_with_wrong_object_type()))))
+ (__builtin_types_compatible_p(typeof(obj), struct drbd_ ## struct_name *) || \
+ __builtin_types_compatible_p(typeof(obj), const struct drbd_ ## struct_name *))
+
+#define __drbd_obj_ratelimit(struct_name, obj, rlt) \
+ ({ \
+ int __rlt = (rlt); \
+ BUILD_BUG_ON(!__drbd_printk_choose_cond(obj, struct_name)); \
+ BUILD_BUG_ON(__rlt < -1); \
+ BUILD_BUG_ON(__rlt >= (int)ARRAY_SIZE(obj->ratelimit)); \
+ __rlt == -1 ? 1 \
+ : __ratelimit(/* unconst cast ratelimit state */ \
+ (struct ratelimit_state *)(unsigned long) \
+ &obj->ratelimit[__rlt]); \
+ })
+
+#define drbd_device_ratelimit(obj, rlt) \
+ __drbd_obj_ratelimit(device, obj, D_RL_D_ ## rlt)
+#define drbd_resource_ratelimit(obj, rlt) \
+ __drbd_obj_ratelimit(resource, obj, D_RL_R_ ## rlt)
+#define drbd_connection_ratelimit(obj, rlt) \
+ __drbd_obj_ratelimit(connection, obj, D_RL_C_ ## rlt)
+#define drbd_peer_device_ratelimit(obj, rlt) \
+ __drbd_obj_ratelimit(peer_device, obj, D_RL_PD_ ## rlt)
+
+#define drbd_printk(ratelimit_type, level, obj, fmt, args...) \
+ __builtin_choose_expr(__drbd_printk_choose_cond(obj, device), \
+ __drbd_printk_device(ratelimit_type, obj, level, fmt, ## args), \
+ \
+ __builtin_choose_expr(__drbd_printk_choose_cond(obj, resource), \
+ __drbd_printk_resource(ratelimit_type, obj, level, fmt, ## args), \
+ \
+ __builtin_choose_expr(__drbd_printk_choose_cond(obj, connection), \
+ __drbd_printk_connection(ratelimit_type, obj, level, fmt, ## args), \
+ \
+ __builtin_choose_expr(__drbd_printk_choose_cond(obj, peer_device), \
+ __drbd_printk_peer_device(ratelimit_type, obj, level, fmt, ## args), \
+ \
+ drbd_printk_with_wrong_object_type() \
+ ))))
#define __drbd_dyn_dbg_if_same_type(obj, struct_name, fmt, args...) \
- __drbd_printk_choose_cond(obj, struct_name), \
({ \
DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt); \
if (DYNAMIC_DEBUG_BRANCH(descriptor)) { \
- __drbd_printk_ ## struct_name ## _prep((const struct struct_name *)(obj)); \
- __dynamic_pr_debug(&descriptor, __drbd_printk_ ## struct_name ## _fmt(fmt), \
- __drbd_printk_ ## struct_name ## _args(), ## args); \
- __drbd_printk_ ## struct_name ## _unprep(); \
+ ___drbd_printk_ ## struct_name( \
+ __drbd_dyn_dbg, \
+ NOLIMIT, obj, \
+ &descriptor, fmt, ## args); \
} \
})
#define dynamic_drbd_dbg(obj, fmt, args...) \
- __builtin_choose_expr( \
- __drbd_dyn_dbg_if_same_type(obj, drbd_device, fmt, ## args), \
- __builtin_choose_expr( \
- __drbd_dyn_dbg_if_same_type(obj, drbd_resource, fmt, ## args), \
- __builtin_choose_expr( \
- __drbd_dyn_dbg_if_same_type(obj, drbd_connection, fmt, ## args), \
- __builtin_choose_expr( \
- __drbd_dyn_dbg_if_same_type(obj, drbd_peer_device, fmt, ## args), \
- drbd_dyn_dbg_with_wrong_object_type()))))
-
-#define drbd_emerg(device, fmt, args...) \
- drbd_printk(KERN_EMERG, device, fmt, ## args)
-#define drbd_alert(device, fmt, args...) \
- drbd_printk(KERN_ALERT, device, fmt, ## args)
-#define drbd_crit(device, fmt, args...) \
- drbd_printk(KERN_CRIT, device, fmt, ## args)
-#define drbd_err(device, fmt, args...) \
- drbd_printk(KERN_ERR, device, fmt, ## args)
-#define drbd_warn(device, fmt, args...) \
- drbd_printk(KERN_WARNING, device, fmt, ## args)
-#define drbd_notice(device, fmt, args...) \
- drbd_printk(KERN_NOTICE, device, fmt, ## args)
-#define drbd_info(device, fmt, args...) \
- drbd_printk(KERN_INFO, device, fmt, ## args)
-
+ __builtin_choose_expr(__drbd_printk_choose_cond(obj, device), \
+ __drbd_dyn_dbg_if_same_type(obj, device, fmt, ## args), \
+ \
+ __builtin_choose_expr(__drbd_printk_choose_cond(obj, resource), \
+ __drbd_dyn_dbg_if_same_type(obj, resource, fmt, ## args), \
+ \
+ __builtin_choose_expr(__drbd_printk_choose_cond(obj, connection), \
+ __drbd_dyn_dbg_if_same_type(obj, connection, fmt, ## args), \
+ \
+ __builtin_choose_expr(__drbd_printk_choose_cond(obj, peer_device), \
+ __drbd_dyn_dbg_if_same_type(obj, peer_device, fmt, ## args), \
+ \
+ drbd_dyn_dbg_with_wrong_object_type() \
+ ))))
+
+#define drbd_emerg_ratelimit(obj, fmt, args...) \
+ drbd_printk(GENERIC, KERN_EMERG, obj, fmt, ## args)
+#define drbd_alert_ratelimit(obj, fmt, args...) \
+ drbd_printk(GENERIC, KERN_ALERT, obj, fmt, ## args)
+#define drbd_crit_ratelimit(obj, fmt, args...) \
+ drbd_printk(GENERIC, KERN_CRIT, obj, fmt, ## args)
+#define drbd_err_ratelimit(obj, fmt, args...) \
+ drbd_printk(GENERIC, KERN_ERR, obj, fmt, ## args)
+#define drbd_warn_ratelimit(obj, fmt, args...) \
+ drbd_printk(GENERIC, KERN_WARNING, obj, fmt, ## args)
+#define drbd_notice_ratelimit(obj, fmt, args...) \
+ drbd_printk(GENERIC, KERN_NOTICE, obj, fmt, ## args)
+#define drbd_info_ratelimit(obj, fmt, args...) \
+ drbd_printk(GENERIC, KERN_INFO, obj, fmt, ## args)
+
+#define drbd_emerg(obj, fmt, args...) \
+ drbd_printk(NOLIMIT, KERN_EMERG, obj, fmt, ## args)
+#define drbd_alert(obj, fmt, args...) \
+ drbd_printk(NOLIMIT, KERN_ALERT, obj, fmt, ## args)
+#define drbd_crit(obj, fmt, args...) \
+ drbd_printk(NOLIMIT, KERN_CRIT, obj, fmt, ## args)
+#define drbd_err(obj, fmt, args...) \
+ drbd_printk(NOLIMIT, KERN_ERR, obj, fmt, ## args)
+#define drbd_warn(obj, fmt, args...) \
+ drbd_printk(NOLIMIT, KERN_WARNING, obj, fmt, ## args)
+#define drbd_notice(obj, fmt, args...) \
+ drbd_printk(NOLIMIT, KERN_NOTICE, obj, fmt, ## args)
+#define drbd_info(obj, fmt, args...) \
+ drbd_printk(NOLIMIT, KERN_INFO, obj, fmt, ## args)
#define drbd_ratelimit() \
({ \
@@ -122,7 +197,7 @@ void drbd_dyn_dbg_with_wrong_object_type(void);
do { \
if (!(exp)) \
drbd_err(x, "ASSERTION %s FAILED in %s\n", \
- #exp, __func__); \
+ #exp, __func__); \
} while (0)
/**
@@ -130,12 +205,13 @@ void drbd_dyn_dbg_with_wrong_object_type(void);
*
* Unlike the assert macro, this macro returns a boolean result.
*/
-#define expect(x, exp) ({ \
- bool _bool = (exp); \
- if (!_bool && drbd_ratelimit()) \
- drbd_err(x, "ASSERTION %s FAILED in %s\n", \
- #exp, __func__); \
- _bool; \
+#define expect(x, exp) ({ \
+ bool _bool = (exp); \
+ if (!_bool) \
+ drbd_err_ratelimit(x, \
+ "ASSERTION %s FAILED in %s\n", \
+ #exp, __func__); \
+ _bool; \
})
#endif
diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c
index fa87cbba756b..d31b05bac2c1 100644
--- a/drivers/block/drbd/drbd_receiver.c
+++ b/drivers/block/drbd/drbd_receiver.c
@@ -1981,8 +1981,7 @@ static int receive_RSDataReply(struct drbd_connection *connection, struct packet
* or in drbd_peer_request_endio. */
err = recv_resync_read(peer_device, sector, pi);
} else {
- if (drbd_ratelimit())
- drbd_err(device, "Can not write resync data to local disk.\n");
+ drbd_err_ratelimit(device, "Can not write resync data to local disk.\n");
err = drbd_drain_block(peer_device, pi->size);
@@ -2669,9 +2668,9 @@ static int receive_DataRequest(struct drbd_connection *connection, struct packet
default:
BUG();
}
- if (verb && drbd_ratelimit())
- drbd_err(device, "Can not satisfy peer's read request, "
- "no local data.\n");
+ if (verb)
+ drbd_err_ratelimit(device,
+ "Can not satisfy peer's read request, no local data.\n");
/* drain possibly payload */
return drbd_drain_block(peer_device, pi->size);
diff --git a/drivers/block/drbd/drbd_req.c b/drivers/block/drbd/drbd_req.c
index f16b925fecc1..1412524e849c 100644
--- a/drivers/block/drbd/drbd_req.c
+++ b/drivers/block/drbd/drbd_req.c
@@ -139,7 +139,7 @@ void drbd_req_destroy(struct kref *kref)
if (get_ldev_if_state(device, D_FAILED)) {
drbd_al_complete_io(device, &req->i);
put_ldev(device);
- } else if (drbd_ratelimit()) {
+ } else if (drbd_device_ratelimit(device, BACKEND)) {
drbd_warn(device, "Should have called drbd_al_complete_io(, %llu, %u), "
"but my Disk seems to have failed :(\n",
(unsigned long long) req->i.sector, req->i.size);
@@ -513,7 +513,7 @@ static void mod_rq_state(struct drbd_request *req, struct bio_and_error *m,
static void drbd_report_io_error(struct drbd_device *device, struct drbd_request *req)
{
- if (!drbd_ratelimit())
+ if (!drbd_device_ratelimit(device, BACKEND))
return;
drbd_warn(device, "local %s IO error sector %llu+%u on %pg\n",
@@ -1403,9 +1403,9 @@ static void drbd_send_and_submit(struct drbd_device *device, struct drbd_request
submit_private_bio = true;
} else if (no_remote) {
nodata:
- if (drbd_ratelimit())
- drbd_err(device, "IO ERROR: neither local nor remote data, sector %llu+%u\n",
- (unsigned long long)req->i.sector, req->i.size >> 9);
+ drbd_err_ratelimit(device,
+ "IO ERROR: neither local nor remote data, sector %llu+%u\n",
+ (unsigned long long)req->i.sector, req->i.size >> 9);
/* A write may have been queued for send_oos, however.
* So we can not simply free it, we must go through drbd_req_put_completion_ref() */
}
diff --git a/drivers/block/drbd/drbd_sender.c b/drivers/block/drbd/drbd_sender.c
index 69b3676961d2..b848adfaf494 100644
--- a/drivers/block/drbd/drbd_sender.c
+++ b/drivers/block/drbd/drbd_sender.c
@@ -171,7 +171,7 @@ void drbd_peer_request_endio(struct bio *bio)
bool is_discard = bio_op(bio) == REQ_OP_WRITE_ZEROES ||
bio_op(bio) == REQ_OP_DISCARD;
- if (bio->bi_status && drbd_ratelimit())
+ if (bio->bi_status && drbd_device_ratelimit(device, BACKEND))
drbd_warn(device, "%s: error=%d s=%llus\n",
is_write ? (is_discard ? "discard" : "write")
: "read", bio->bi_status,
@@ -235,7 +235,7 @@ void drbd_request_endio(struct bio *bio)
* though we still will complain noisily about it.
*/
if (unlikely(req->rq_state & RQ_LOCAL_ABORTED)) {
- if (drbd_ratelimit())
+ if (drbd_device_ratelimit(device, BACKEND))
drbd_emerg(device, "delayed completion of aborted local request; disk-timeout may be too aggressive\n");
if (!bio->bi_status)
@@ -1050,9 +1050,8 @@ int w_e_end_data_req(struct drbd_work *w, int cancel)
if (likely((peer_req->flags & EE_WAS_ERROR) == 0)) {
err = drbd_send_block(peer_device, P_DATA_REPLY, peer_req);
} else {
- if (drbd_ratelimit())
- drbd_err(device, "Sending NegDReply. sector=%llus.\n",
- (unsigned long long)peer_req->i.sector);
+ drbd_err_ratelimit(peer_device, "Sending NegDReply. sector=%llus.\n",
+ (unsigned long long)peer_req->i.sector);
err = drbd_send_ack(peer_device, P_NEG_DREPLY, peer_req);
}
@@ -1122,15 +1121,13 @@ int w_e_end_rsdata_req(struct drbd_work *w, int cancel)
else
err = drbd_send_block(peer_device, P_RS_DATA_REPLY, peer_req);
} else {
- if (drbd_ratelimit())
- drbd_err(device, "Not sending RSDataReply, "
- "partner DISKLESS!\n");
+ drbd_err_ratelimit(peer_device,
+ "Not sending RSDataReply, partner DISKLESS!\n");
err = 0;
}
} else {
- if (drbd_ratelimit())
- drbd_err(device, "Sending NegRSDReply. sector %llus.\n",
- (unsigned long long)peer_req->i.sector);
+ drbd_err_ratelimit(peer_device, "Sending NegRSDReply. sector %llus.\n",
+ (unsigned long long)peer_req->i.sector);
err = drbd_send_ack(peer_device, P_NEG_RS_DREPLY, peer_req);
@@ -1197,8 +1194,7 @@ int w_e_end_csum_rs_req(struct drbd_work *w, int cancel)
}
} else {
err = drbd_send_ack(peer_device, P_NEG_RS_DREPLY, peer_req);
- if (drbd_ratelimit())
- drbd_err(device, "Sending NegDReply. I guess it gets messy.\n");
+ drbd_err_ratelimit(device, "Sending NegDReply. I guess it gets messy.\n");
}
if (unlikely(err))
drbd_err(device, "drbd_send_block/ack() failed\n");
--
2.55.0
^ permalink raw reply [flat|nested] 11+ messages in thread* Re: [PATCH 0/7] drbd: preparation for DRBD 9
2026-09-23 14:06 [PATCH 0/7] drbd: preparation for DRBD 9 Christoph Böhmwalder
` (6 preceding siblings ...)
2026-09-23 14:06 ` [PATCH 7/7] drbd: rate limit log messages per object Christoph Böhmwalder
@ 2026-11-09 17:22 ` Christoph Böhmwalder
2026-11-09 17:40 ` Jens Axboe
2026-11-09 17:40 ` Jens Axboe
8 siblings, 1 reply; 11+ messages in thread
From: Christoph Böhmwalder @ 2026-11-09 17:22 UTC (permalink / raw)
To: Jens Axboe
Cc: Philipp Reisner, Lars Ellenberg, drbd-dev, linux-block,
linux-kernel, Lars Ellenberg
On Wed, Sep 23, 2026 at 04:06:01PM +0200, Christoph Böhmwalder wrote:
>This series contains preparatory changes for bringing DRBD 9 upstream.
>Each patch moves a piece of the in-tree DRBD 8.4 code to the form it
>has in the out-of-tree DRBD 9 code. Doing these steps separately and
>up front keeps them out of the much larger rework that follows, so
>that rework shows only what DRBD 9 actually changes.
>
>The patches are a file rename, comment and internal cleanups, and two
>higher configuration maximums. Defaults are unchanged, all existing
>configurations remain valid, and apart from those limits only the
>wording of some log messages is visible to userspace.
>
>Christoph Böhmwalder (7):
> drbd: rename drbd_worker.c to drbd_sender.c
> drbd: modernize the file header comments
> drbd: raise the socket buffer size limits to 128 MiB
> drbd: raise the maximum resync rate to 8 GiB/s
> drbd: replace the drbd_interval bitfields with a type and flags
> drbd: move the packet name table to drbd_strings.c
> drbd: rate limit log messages per object
>
> drivers/block/drbd/Makefile | 2 +-
> drivers/block/drbd/drbd_actlog.c | 16 +-
> drivers/block/drbd/drbd_bitmap.c | 18 +-
> drivers/block/drbd/drbd_debugfs.c | 4 +
> drivers/block/drbd/drbd_debugfs.h | 4 +
> drivers/block/drbd/drbd_int.h | 59 +++-
> drivers/block/drbd/drbd_interval.c | 4 +
> drivers/block/drbd/drbd_interval.h | 55 +++-
> drivers/block/drbd/drbd_main.c | 106 ++------
> drivers/block/drbd/drbd_nl.c | 15 +-
> drivers/block/drbd/drbd_polymorph_printk.h | 256 ++++++++++++------
> drivers/block/drbd/drbd_proc.c | 10 +-
> drivers/block/drbd/drbd_protocol.h | 4 +
> drivers/block/drbd/drbd_receiver.c | 61 +++--
> drivers/block/drbd/drbd_req.c | 40 ++-
> drivers/block/drbd/drbd_req.h | 12 +-
> .../drbd/{drbd_worker.c => drbd_sender.c} | 42 ++-
> drivers/block/drbd/drbd_state.c | 15 +-
> drivers/block/drbd/drbd_strings.c | 138 ++++++++--
> drivers/block/drbd/drbd_strings.h | 27 +-
> drivers/block/drbd/drbd_vli.h | 12 +-
> include/uapi/linux/drbd.h | 12 +-
> include/uapi/linux/drbd_limits.h | 12 +-
> 23 files changed, 534 insertions(+), 390 deletions(-)
> rename drivers/block/drbd/{drbd_worker.c => drbd_sender.c} (98%)
>
>
>base-commit: 85bffad4d2fea373a72d68bed8012e8cbccb8ee7
>--
>2.55.0
>
Hi Jens,
this never got a reply, and neither did the subsequent v2 drbd rework series
that's based on it [1].
I think this should still apply to 7.5, would you mind queueing it up?
Thanks,
Christoph
[1] https://lore.kernel.org/linux-block/20261006154607.3936501-1-christoph.boehmwalder@linbit.com/
^ permalink raw reply [flat|nested] 11+ messages in thread* Re: [PATCH 0/7] drbd: preparation for DRBD 9
2026-11-09 17:22 ` [PATCH 0/7] drbd: preparation for DRBD 9 Christoph Böhmwalder
@ 2026-11-09 17:40 ` Jens Axboe
0 siblings, 0 replies; 11+ messages in thread
From: Jens Axboe @ 2026-11-09 17:40 UTC (permalink / raw)
To: Philipp Reisner, Lars Ellenberg, drbd-dev, linux-block,
linux-kernel, Lars Ellenberg
On 11/9/26 10:22 AM, Christoph Böhmwalder wrote:
> On Wed, Sep 23, 2026 at 04:06:01PM +0200, Christoph Böhmwalder wrote:
>> This series contains preparatory changes for bringing DRBD 9 upstream.
>> Each patch moves a piece of the in-tree DRBD 8.4 code to the form it
>> has in the out-of-tree DRBD 9 code. Doing these steps separately and
>> up front keeps them out of the much larger rework that follows, so
>> that rework shows only what DRBD 9 actually changes.
>>
>> The patches are a file rename, comment and internal cleanups, and two
>> higher configuration maximums. Defaults are unchanged, all existing
>> configurations remain valid, and apart from those limits only the
>> wording of some log messages is visible to userspace.
>>
>> Christoph Böhmwalder (7):
>> drbd: rename drbd_worker.c to drbd_sender.c
>> drbd: modernize the file header comments
>> drbd: raise the socket buffer size limits to 128 MiB
>> drbd: raise the maximum resync rate to 8 GiB/s
>> drbd: replace the drbd_interval bitfields with a type and flags
>> drbd: move the packet name table to drbd_strings.c
>> drbd: rate limit log messages per object
>>
>> drivers/block/drbd/Makefile | 2 +-
>> drivers/block/drbd/drbd_actlog.c | 16 +-
>> drivers/block/drbd/drbd_bitmap.c | 18 +-
>> drivers/block/drbd/drbd_debugfs.c | 4 +
>> drivers/block/drbd/drbd_debugfs.h | 4 +
>> drivers/block/drbd/drbd_int.h | 59 +++-
>> drivers/block/drbd/drbd_interval.c | 4 +
>> drivers/block/drbd/drbd_interval.h | 55 +++-
>> drivers/block/drbd/drbd_main.c | 106 ++------
>> drivers/block/drbd/drbd_nl.c | 15 +-
>> drivers/block/drbd/drbd_polymorph_printk.h | 256 ++++++++++++------
>> drivers/block/drbd/drbd_proc.c | 10 +-
>> drivers/block/drbd/drbd_protocol.h | 4 +
>> drivers/block/drbd/drbd_receiver.c | 61 +++--
>> drivers/block/drbd/drbd_req.c | 40 ++-
>> drivers/block/drbd/drbd_req.h | 12 +-
>> .../drbd/{drbd_worker.c => drbd_sender.c} | 42 ++-
>> drivers/block/drbd/drbd_state.c | 15 +-
>> drivers/block/drbd/drbd_strings.c | 138 ++++++++--
>> drivers/block/drbd/drbd_strings.h | 27 +-
>> drivers/block/drbd/drbd_vli.h | 12 +-
>> include/uapi/linux/drbd.h | 12 +-
>> include/uapi/linux/drbd_limits.h | 12 +-
>> 23 files changed, 534 insertions(+), 390 deletions(-)
>> rename drivers/block/drbd/{drbd_worker.c => drbd_sender.c} (98%)
>>
>>
>> base-commit: 85bffad4d2fea373a72d68bed8012e8cbccb8ee7
>> --
>> 2.55.0
>>
>
> Hi Jens,
>
> this never got a reply, and neither did the subsequent v2 drbd rework series
> that's based on it [1].
> I think this should still apply to 7.5, would you mind queueing it up?
>
> Thanks,
> Christoph
>
> [1] https://lore.kernel.org/linux-block/20261006154607.3936501-1-christoph.boehmwalder@linbit.com/
Queued up now, v2 doesn't apply anymore fwiw.
--
Jens Axboe
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH 0/7] drbd: preparation for DRBD 9
2026-09-23 14:06 [PATCH 0/7] drbd: preparation for DRBD 9 Christoph Böhmwalder
` (7 preceding siblings ...)
2026-11-09 17:22 ` [PATCH 0/7] drbd: preparation for DRBD 9 Christoph Böhmwalder
@ 2026-11-09 17:40 ` Jens Axboe
8 siblings, 0 replies; 11+ messages in thread
From: Jens Axboe @ 2026-11-09 17:40 UTC (permalink / raw)
To: Christoph Böhmwalder
Cc: Philipp Reisner, Lars Ellenberg, drbd-dev, linux-block,
linux-kernel, Lars Ellenberg
On Wed, 23 Sep 2026 16:06:01 +0200, Christoph Böhmwalder wrote:
> This series contains preparatory changes for bringing DRBD 9 upstream.
> Each patch moves a piece of the in-tree DRBD 8.4 code to the form it
> has in the out-of-tree DRBD 9 code. Doing these steps separately and
> up front keeps them out of the much larger rework that follows, so
> that rework shows only what DRBD 9 actually changes.
>
> The patches are a file rename, comment and internal cleanups, and two
> higher configuration maximums. Defaults are unchanged, all existing
> configurations remain valid, and apart from those limits only the
> wording of some log messages is visible to userspace.
>
> [...]
Applied, thanks!
[1/7] drbd: rename drbd_worker.c to drbd_sender.c
commit: 40059d1813d8834cf4779b8c9c2faa80b4a6a0a5
[2/7] drbd: modernize the file header comments
commit: 4df3cf912f90dedfeee025b1fb34b6ecead7c8bf
[3/7] drbd: raise the socket buffer size limits to 128 MiB
commit: 80869ca32c8969eeb857f4d1a3f959dba952109a
[4/7] drbd: raise the maximum resync rate to 8 GiB/s
commit: ebf0023b636ad47afeb13ece37123507d27e131e
[5/7] drbd: replace the drbd_interval bitfields with a type and flags
commit: 6826d3b194b1e01128fca6e0925a8afe72b7cca9
[6/7] drbd: move the packet name table to drbd_strings.c
commit: b87ef682279fd67600b92eb83d10e70b01eccda5
[7/7] drbd: rate limit log messages per object
commit: dc2ec1327db41fb8c7c0ae5a5e29654b6ca3fe17
Best regards,
--
Jens Axboe
^ permalink raw reply [flat|nested] 11+ messages in thread