Linux 内核社区靠邮件列表议事。但新手第一次打开 lore.kernel.org,往往被满屏的 Re:、[PATCH v3 2/7]、Signed-off-by 吓到。其实一封正式邮件的结构非常固定,看懂之后,阅读门槛会陡降。
📧 邮件头部:谁在跟谁说话
/ section邮件头部(Header)是邮件的「身份证」,包含路由、身份、主题等元信息。Linux 社区常用的字段有这些:
下面是一封完整补丁邮件的头部示例:
From: Alice Chen <alice@example.com>
To: linux-media@vger.kernel.org
Cc: Hans Verkuil <hverkuil@xs4all.nl>,
Mauro Carvalho Chehab <mchehab@kernel.org>,
linux-kernel@vger.kernel.org
Subject: [PATCH v2 3/5] media: dvb: fix race condition in streaming start
Date: Sat, 19 Sep 2026 10:00:00 +0800
Message-Id: <20260919020000.1234-1-alice@example.com>
In-Reply-To: <20260918010000.5678-1-alice@example.com>
References: <20260918010000.5678-1-alice@example.com> 对照上面这封邮件,每个字段的含义就清晰了。
🔖 Subject:密码一样的主题行
/ columnSubject 是新手最容易懵的地方。因为它不只是标题,还承载了大量结构化信息。
Subject: [PATCH v2 3/5] media: dvb: fix race condition in streaming start 拆解一下:
其他常见标签也有固定含义:
如果是回复,Subject 前面会加 Re:;如果是转发,会加 Fw:。
Subject: Re: [PATCH v2 3/5] media: dvb: fix race condition in streaming start ✍️ 正文与 Signed-off-by
/ column正文是邮件的沟通主体。补丁邮件的正文通常分三段:
一个典型的正文示例:
When the frontend is started concurrently with a tuning request,
the state lock is not held long enough, leading to a use-after-free
in dvb_frontend_stop().
Hold fe->lock across the entire start sequence and move the state
check before any resource is allocated.
Tested on a USB DVB-T2 stick with dvb-usb-rtl28xxu.
Signed-off-by: Alice Chen <alice@example.com> 正文末尾通常有一行或多行 Signed-off-by:
Signed-off-by: Alice Chen <alice@example.com> 这行不是签名装饰,而是 开发者原创声明(DCO)。它表示:这段代码是我写的,或者我有权以开源许可证提交它。没有 Signed-off-by 的补丁,维护者通常不会合入。
🧩 补丁邮件的特殊结构
/ column补丁邮件的正文之后,会跟着一段 --- 分隔线和 diff 内容。
---
drivers/media/dvb-core/dvb_frontend.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/drivers/media/dvb-core/dvb_frontend.c b/drivers/media/dvb-core/dvb_frontend.c
index 1a2b3c4..5d6e7f8 100644
--- a/drivers/media/dvb-core/dvb_frontend.c
+++ b/drivers/media/dvb-core/dvb_frontend.c
@@ -1456,7 +1456,8 @@ static int dvb_frontend_start(struct dvb_frontend *fe)
mutex_lock(&fe->lock);
if (fe->state != DVB_FE_IDLE) {
mutex_unlock(&fe->lock);
- return -EBUSY;
+ ret = -EBUSY;
+ goto err;
}
fe->state = DVB_FE_STARTING;
mutex_unlock(&fe->lock); --- 上面是变更统计(diffstat),下面是具体的代码差异。红色行带 - 是删除,绿色行带 + 是新增。看 diff 时,重点看上下文是否完整、逻辑是否自洽。
🧵 回复与线程
/ column社区讨论不是单封邮件,而是一棵树。同一个补丁可能被多个人从不同角度回复,作者也会根据评审意见重发 v2、v3。树能立起来,靠的是三个字段:
References 的推导规则只有一条:发回复时,References = 父邮件的 References + 父邮件的 Message-Id。每一层都继承上一层,链路因此完整。
下面用一组具体消息 ID 走一遍。场景:Alice 在 9 月 18 日发了 [PATCH 0/2] 封面信和两封补丁,Hans 评审了补丁 1/2,Mauro 评审了补丁 2/2,Alice 据此在 9 月 19 日重发 v2。线程树如下(尖括号里就是 Message-Id):
<20260918000000.1000-1-alice@example.com>
[PATCH 0/2] media: dvb: fix streaming race
├─ <20260918000001.1000-2-alice@example.com>
│ [PATCH 1/2] media: dvb: hold fe->lock in start
│ └─ <20260918120000.2000-1-hans@xs4all.nl>
│ Re: [PATCH 1/2] media: dvb: hold fe->lock in start
└─ <20260918000002.1000-3-alice@example.com>
[PATCH 2/2] media: dvb: check state before alloc
└─ <20260918150000.3000-1-mauro@kernel.org>
Re: [PATCH 2/2] media: dvb: check state before alloc
└─ <20260919020000.4000-1-alice@example.com>
[PATCH v2 0/2] media: dvb: fix streaming race
├─ <20260919020001.4000-2-alice@example.com>
│ [PATCH v2 1/2] media: dvb: hold fe->lock in start
└─ <20260919020002.4000-3-alice@example.com>
[PATCH v2 2/2] media: dvb: check state before alloc 把树上的每条边翻译成真实头部字段:
# 1) Alice 的 [PATCH 1/2],父节点是封面信
Message-Id: <20260918000001.1000-2-alice@example.com>
In-Reply-To: <20260918000000.1000-1-alice@example.com>
References: <20260918000000.1000-1-alice@example.com>
# 2) Hans 评审补丁 1/2:In-Reply-To 指向补丁,不是封面信
Message-Id: <20260918120000.2000-1-hans@xs4all.nl>
In-Reply-To: <20260918000001.1000-2-alice@example.com>
References: <20260918000000.1000-1-alice@example.com>
<20260918000001.1000-2-alice@example.com>
# 3) Mauro 评审补丁 2/2
Message-Id: <20260918150000.3000-1-mauro@kernel.org>
In-Reply-To: <20260918000002.1000-3-alice@example.com>
References: <20260918000000.1000-1-alice@example.com>
<20260918000002.1000-3-alice@example.com>
# 4) Alice 的 v2 封面信:In-Reply-To 指向最后一轮评审,不是自己的 v1 封面信
Message-Id: <20260919020000.4000-1-alice@example.com>
In-Reply-To: <20260918150000.3000-1-mauro@kernel.org>
References: <20260918000000.1000-1-alice@example.com>
<20260918000002.1000-3-alice@example.com>
<20260918150000.3000-1-mauro@kernel.org>
# 5) v2 的第一封补丁:References 重新从 v2 封面信起算
Message-Id: <20260919020001.4000-2-alice@example.com>
In-Reply-To: <20260919020000.4000-1-alice@example.com>
References: <20260919020000.4000-1-alice@example.com> 对照这五段头部,几个新手最容易踩的点就清楚了:
lore.kernel.org 和邮件客户端就是靠这些 ID 把讨论折叠成可展开的树:点开一个评审节点,能一路向上追到它评论的是哪一版补丁,再横向跳到作者有没有发 v2,不必一封一封翻。
回复时,客户端还会在正文顶部用 > 缩进引用原邮件,方便跨时区、异步阅读时不用翻历史就看得到上下文:
> On Sat, Sep 19, 2026 at 10:00:00 +0800, Alice Chen wrote:
> > This patch holds fe->lock across the start sequence.
>
> Looks good, but can we also add a comment explaining why? 维护者回复里常见的黑话:
📌 新手建议
/ column看懂邮件结构,是进入 Linux 开源世界的第一步。
Linux 内核玩家 · kernelplayer.cn