aboutsummaryrefslogtreecommitdiffstats
path: root/Documentation/zh_CN
diff options
context:
space:
mode:
Diffstat (limited to 'Documentation/zh_CN')
-rw-r--r--Documentation/zh_CN/SubmittingPatches416
1 files changed, 416 insertions, 0 deletions
diff --git a/Documentation/zh_CN/SubmittingPatches b/Documentation/zh_CN/SubmittingPatches
new file mode 100644
index 000000000000..985c92e20b73
--- /dev/null
+++ b/Documentation/zh_CN/SubmittingPatches
@@ -0,0 +1,416 @@
1Chinese translated version of Documentation/SubmittingPatches
2
3If you have any comment or update to the content, please contact the
4original document maintainer directly. However, if you have a problem
5communicating in English you can also ask the Chinese maintainer for
6help. Contact the Chinese maintainer if this translation is outdated
7or if there is a problem with the translation.
8
9Chinese maintainer: TripleX Chung <triplex@zh-kernel.org>
10---------------------------------------------------------------------
11Documentation/SubmittingPatches 的中文翻译
12
13如果想评论或更新本文的内容,请直接联系原文档的维护者。如果你使用英文
14交流有困难的话,也可以向中文版维护者求助。如果本翻译更新不及时或者翻
15译存在问题,请联系中文版维护者。
16
17中文版维护者: 钟宇 TripleX Chung <triplex@zh-kernel.org>
18中文版翻译者: 钟宇 TripleX Chung <triplex@zh-kernel.org>
19中文版校译者: 李阳 Li Yang <leo@zh-kernel.org>
20 王聪 Wang Cong <xiyou.wangcong@gmail.com>
21
22以下为正文
23---------------------------------------------------------------------
24
25 如何让你的改动进入内核
26 或者
27 获得亲爱的 Linus Torvalds 的关注和处理
28----------------------------------
29
30对于想要将改动提交到 Linux 内核的个人或者公司来说,如果不熟悉“规矩”,
31提交的流程会让人畏惧。本文档收集了一系列建议,这些建议可以大大的提高你
32的改动被接受的机会。
33阅读 Documentation/SubmitChecklist 来获得在提交代码前需要检查的项目的列
34表。如果你在提交一个驱动程序,那么同时阅读一下
35Documentation/SubmittingDrivers 。
36
37
38--------------------------
39第一节 - 创建并发送你的改动
40--------------------------
41
421) "diff -up"
43-----------
44
45使用 "diff -up" 或者 "diff -uprN" 来创建补丁。
46
47所有内核的改动,都是以补丁的形式呈现的,补丁由 diff(1) 生成。创建补丁的
48时候,要确认它是以 "unified diff" 格式创建的,这种格式由 diff(1) 的 '-u'
49参数生成。而且,请使用 '-p' 参数,那样会显示每个改动所在的C函数,使得
50产生的补丁容易读得多。补丁应该基于内核源代码树的根目录,而不是里边的任
51何子目录。
52为一个单独的文件创建补丁,一般来说这样做就够了:
53
54 SRCTREE= linux-2.6
55 MYFILE= drivers/net/mydriver.c
56
57 cd $SRCTREE
58 cp $MYFILE $MYFILE.orig
59 vi $MYFILE # make your change
60 cd ..
61 diff -up $SRCTREE/$MYFILE{.orig,} > /tmp/patch
62
63为多个文件创建补丁,你可以解开一个没有修改过的内核源代码树,然后和你自
64己的代码树之间做 diff 。例如:
65
66 MYSRC= /devel/linux-2.6
67
68 tar xvfz linux-2.6.12.tar.gz
69 mv linux-2.6.12 linux-2.6.12-vanilla
70 diff -uprN -X linux-2.6.12-vanilla/Documentation/dontdiff \
71 linux-2.6.12-vanilla $MYSRC > /tmp/patch
72
73"dontdiff" 是内核在编译的时候产生的文件的列表,列表中的文件在 diff(1)
74产生的补丁里会被跳过。"dontdiff" 文件被包含在2.6.12和之后版本的内核源代
75码树中。对于更早的内核版本,你可以从
76<http://www.xenotime.net/linux/doc/dontdiff> 获取它。
77确定你的补丁里没有包含任何不属于这次补丁提交的额外文件。记得在用diff(1)
78生成补丁之后,审阅一次补丁,以确保准确。
79如果你的改动很散乱,你应该研究一下如何将补丁分割成独立的部分,将改动分
80割成一系列合乎逻辑的步骤。这样更容易让其他内核开发者审核,如果你想你的
81补丁被接受,这是很重要的。下面这些脚本能够帮助你做这件事情:
82Quilt:
83http://savannah.nongnu.org/projects/quilt
84
85Andrew Morton 的补丁脚本:
86http://www.zip.com.au/~akpm/linux/patches/
87作为这些脚本的替代,quilt 是值得推荐的补丁管理工具(看上面的链接)。
88
892)描述你的改动。
90描述你的改动包含的技术细节。
91
92要多具体就写多具体。最糟糕的描述可能是像下面这些语句:“更新了某驱动程
93序”,“修正了某驱动程序的bug”,或者“这个补丁包含了某子系统的修改,请
94使用。”
95
96如果你的描述开始变长,这表示你也许需要拆分你的补丁了,请看第3小节,
97继续。
98
993)拆分你的改动
100
101将改动拆分,逻辑类似的放到同一个补丁文件里。
102
103例如,如果你的改动里同时有bug修正和性能优化,那么把这些改动才分到两个或
104者更多的补丁文件中。如果你的改动包含对API的修改,并且修改了驱动程序来适
105应这些新的API,那么把这些修改分成两个补丁。
106
107另一方面,如果你将一个单独的改动做成多个补丁文件,那么将它们合并成一个
108单独的补丁文件。这样一个逻辑上单独的改动只被包含在一个补丁文件里。
109
110如果有一个补丁依赖另外一个补丁来完成它的改动,那没问题。简单的在你的补
111丁描述里指出“这个补丁依赖某补丁”就好了。
112
113如果你不能将补丁浓缩成更少的文件,那么每次大约发送出15个,然后等待审查
114和整合。
115
1164)选择 e-mail 的收件人
117
118看一遍 MAINTAINERS 文件和源代码,看看你所的改动所在的内核子系统有没有指
119定的维护者。如果有,给他们发e-mail。
120
121如果没有找到维护者,或者维护者没有反馈,将你的补丁发送到内核开发者主邮
122件列表 linux-kernel@vger.kernel.org。大部分的内核开发者都跟踪这个邮件列
123表,可以评价你的改动。
124
125每次不要发送超过15个补丁到 vger 邮件列表!!!
126
127Linus Torvalds 是决定改动能否进入 Linux 内核的最终裁决者。他的 e-mail
128地址是 <torvalds@linux-foundation.org> 。他收到的 e-mail 很多,所以一般
129的说,最好别给他发 e-mail。
130
131那些修正bug,“显而易见”的修改或者是类似的只需要很少讨论的补丁可以直接
132发送或者CC给Linus。那些需要讨论或者没有很清楚的好处的补丁,一般先发送到
133linux-kernel邮件列表。只有当补丁被讨论得差不多了,才提交给Linus。
134
1355)选择CC( e-mail 抄送)列表
136
137除非你有理由不这样做,否则CC linux-kernel@vger.kernel.org。
138
139除了 Linus 之外,其他内核开发者也需要注意到你的改动,这样他们才能评论你
140的改动并提供代码审查和建议。linux-kernel 是 Linux 内核开发者主邮件列表
141。其它的邮件列表为特定的子系统提供服务,比如 USB,framebuffer 设备,虚
142拟文件系统,SCSI 子系统,等等。查看 MAINTAINERS 文件来获得和你的改动有
143关的邮件列表。
144
145Majordomo lists of VGER.KERNEL.ORG at:
146 <http://vger.kernel.org/vger-lists.html>
147
148如果改动影响了用户空间和内核之间的接口,请给 MAN-PAGES 的维护者(列在
149MAITAINERS 文件里的)发送一个手册页(man-pages)补丁,或者至少通知一下改
150变,让一些信息有途径进入手册页。
151
152即使在第四步的时候,维护者没有作出回应,也要确认在修改他们的代码的时候
153,一直将维护者拷贝到CC列表中。
154
155对于小的补丁,你也许会CC到 Adrian Bunk 管理的搜集琐碎补丁的邮件列表
156(Trivial Patch Monkey)trivial@kernel.org,那里专门收集琐碎的补丁。下面这样
157的补丁会被看作“琐碎的”补丁:
158 文档的拼写修正。
159 修正会影响到 grep(1) 的拼写。
160 警告信息修正(频繁的打印无用的警告是不好的。)
161 编译错误修正(代码逻辑的确是对的,只是编译有问题。)
162 运行时修正(只要真的修正了错误。)
163 移除使用了被废弃的函数/宏的代码(例如 check_region。)
164 联系方式和文档修正。
165 用可移植的代码替换不可移植的代码(即使在体系结构相关的代码中,既然有
166 人拷贝,只要它是琐碎的)
167 任何文件的作者/维护者对该文件的改动(例如 patch monkey 在重传模式下)
168
169URL: <http://www.kernel.org/pub/linux/kernel/people/bunk/trivial/>
170
171(译注,关于“琐碎补丁”的一些说明:因为原文的这一部分写得比较简单,所以不得不
172违例写一下译注。"trivial"这个英文单词的本意是“琐碎的,不重要的。”但是在这里
173有稍微有一些变化,例如对一些明显的NULL指针的修正,属于运行时修正,会被归类
174到琐碎补丁里。虽然NULL指针的修正很重要,但是这样的修正往往很小而且很容易得到
175检验,所以也被归入琐碎补丁。琐碎补丁更精确的归类应该是
176“simple, localized & easy to verify”,也就是说简单的,局部的和易于检验的。
177trivial@kernel.org邮件列表的目的是针对这样的补丁,为提交者提供一个中心,来
178降低提交的门槛。)
179
1806)没有 MIME 编码,没有链接,没有压缩,没有附件,只有纯文本。
181
182Linus 和其他的内核开发者需要阅读和评论你提交的改动。对于内核开发者来说
183,可以“引用”你的改动很重要,使用一般的 e-mail 工具,他们就可以在你的
184代码的任何位置添加评论。
185
186因为这个原因,所有的提交的补丁都是 e-mail 中“内嵌”的。
187警告:如果你使用剪切-粘贴你的补丁,小心你的编辑器的自动换行功能破坏你的
188补丁。
189
190不要将补丁作为 MIME 编码的附件,不管是否压缩。很多流行的 e-mail 软件不
191是任何时候都将 MIME 编码的附件当作纯文本发送的,这会使得别人无法在你的
192代码中加评论。另外,MIME 编码的附件会让 Linus 多花一点时间来处理,这就
193降低了你的改动被接受的可能性。
194
195警告:一些邮件软件,比如 Mozilla 会将你的信息以如下格式发送:
196---- 邮件头 ----
197Content-Type: text/plain; charset=us-ascii; format=flowed
198---- 邮件头 ----
199问题在于 “format=flowed” 会让接收端的某些邮件软件将邮件中的制表符替换
200成空格以及做一些类似的替换。这样,你发送的时候看起来没问题的补丁就被破
201坏了。
202
203要修正这个问题,只需要将你的 mozilla 的 defaults/pref/mailnews.js 文件
204里的
205pref("mailnews.send_plaintext_flowed", false); // RFC 2646=======
206修改成
207pref("mailnews.display.disable_format_flowed_support", true);
208就可以了。
209
2107) e-mail 的大小
211
212给 Linus 发送补丁的时候,永远按照第6小节说的做。
213
214大的改动对邮件列表不合适,对某些维护者也不合适。如果你的补丁,在不压缩
215的情况下,超过了40kB,那么你最好将补丁放在一个能通过 internet 访问的服
216务器上,然后用指向你的补丁的 URL 替代。
217
2188) 指出你的内核版本
219
220在标题和在补丁的描述中,指出补丁对应的内核的版本,是很重要的。
221
222如果补丁不能干净的在最新版本的内核上打上,Linus 是不会接受它的。
223
2249) 不要气馁,继续提交。
225
226当你提交了改动以后,耐心地等待。如果 Linus 喜欢你的改动并且同意它,那么
227它将在下一个内核发布版本中出现。
228
229然而,如果你的改动没有出现在下一个版本的内核中,可能有若干原因。减少那
230些原因,修正错误,重新提交更新后的改动,是你自己的工作。
231
232Linus不给出任何评论就“丢弃”你的补丁是常见的事情。在系统中这样的事情很
233平常。如果他没有接受你的补丁,也许是由于以下原本:
234* 你的补丁不能在最新版本的内核上干净的打上。
235* 你的补丁在 linux-kernel 邮件列表中没有得到充分的讨论。
236* 风格问题(参照第2小节)
237* 邮件格式问题(重读本节)
238* 你的改动有技术问题。
239* 他收到了成吨的 e-mail,而你的在混乱中丢失了。
240* 你让人为难。
241
242有疑问的时候,在 linux-kernel 邮件列表上请求评论。
243
24410) 在标题上加上 PATCH 的字样
245
246Linus 和 linux-kernel 邮件列表的 e-mail 流量都很高,一个通常的约定是标
247题行以 [PATCH] 开头。这样可以让 Linus 和其他内核开发人员可以从 e-mail
248的讨论中很轻易的将补丁分辨出来。
249
25011)为你的工作签名
251
252为了加强对谁做了何事的追踪,尤其是对那些透过好几层的维护者的补丁,我们
253建议在发送出去的补丁上加一个 “sign-off” 的过程。
254
255"sign-off" 是在补丁的注释的最后的简单的一行文字,认证你编写了它或者其他
256人有权力将它作为开放源代码的补丁传递。规则很简单:如果你能认证如下信息
257
258 开发者来源证书 1.1
259 对于本项目的贡献,我认证如下信息:
260 (a)这些贡献是完全或者部分的由我创建,我有权利以文件中指出
261 的开放源代码许可证提交它;或者
262 (b)这些贡献基于以前的工作,据我所知,这些以前的工作受恰当的开放
263 源代码许可证保护,而且,根据许可证,我有权提交修改后的贡献,
264 无论是完全还是部分由我创造,这些贡献都使用同一个开放源代码许可证
265 (除非我被允许用其它的许可证),正如文件中指出的;或者
266 (c)这些贡献由认证(a),(b)或者(c)的人直接提供给我,而
267 且我没有修改它。
268 (d)我理解并同意这个项目和贡献是公开的,贡献的记录(包括我
269 一起提交的个人记录,包括 sign-off )被永久维护并且可以和这个项目
270 或者开放源代码的许可证同步地再发行。
271 那么加入这样一行:
272 Signed-off-by: Random J Developer <random@developer.example.org>
273
274使用你的真名(抱歉,不能使用假名或者匿名。)
275
276有人在最后加上标签。现在这些东西会被忽略,但是你可以这样做,来标记公司
277内部的过程,或者只是指出关于 sign-off 的一些特殊细节。
278
27912)标准补丁格式
280
281标准的补丁,标题行是:
282 Subject: [PATCH 001/123] 子系统:一句话概述
283
284标准补丁的信体存在如下部分:
285
286 - 一个 "from" 行指出补丁作者。
287
288 - 一个空行
289
290 - 说明的主体,这些说明文字会被拷贝到描述该补丁的永久改动记录里。
291
292 - 一个由"---"构成的标记行
293
294 - 不合适放到改动记录里的额外的注解。
295
296 - 补丁本身(diff 输出)
297
298标题行的格式,使得对标题行按字母序排序非常的容易 - 很多 e-mail 客户端都
299可以支持 - 因为序列号是用零填充的,所以按数字排序和按字母排序是一样的。
300
301e-mail 标题中的“子系统”标识哪个内核子系统将被打补丁。
302
303e-mail 标题中的“一句话概述”扼要的描述 e-mail 中的补丁。“一句话概述”
304不应该是一个文件名。对于一个补丁系列(“补丁系列”指一系列的多个相关补
305丁),不要对每个补丁都使用同样的“一句话概述”。
306
307记住 e-mail 的“一句话概述”会成为该补丁的全局唯一标识。它会蔓延到 git
308的改动记录里。然后“一句话概述”会被用在开发者的讨论里,用来指代这个补
309丁。用户将希望通过 google 来搜索"一句话概述"来找到那些讨论这个补丁的文
310章。
311
312一些标题的例子:
313
314 Subject: [patch 2/5] ext2: improve scalability of bitmap searching
315 Subject: [PATCHv2 001/207] x86: fix eflags tracking
316
317"from" 行是信体里的最上面一行,具有如下格式:
318 From: Original Author <author@example.com>
319
320"from" 行指明在永久改动日志里,谁会被确认为作者。如果没有 "from" 行,那
321么邮件头里的 "From: " 行会被用来决定改动日志中的作者。
322
323说明的主题将会被提交到永久的源代码改动日志里,因此对那些早已经不记得和
324这个补丁相关的讨论细节的有能力的读者来说,是有意义的。
325
326"---" 标记行对于补丁处理工具要找到哪里是改动日志信息的结束,是不可缺少
327的。
328
329对于 "---" 标记之后的额外注解,一个好的用途就是用来写 diffstat,用来显
330示修改了什么文件和每个文件都增加和删除了多少行。diffstat 对于比较大的补
331丁特别有用。其余那些只是和时刻或者开发者相关的注解,不合适放到永久的改
332动日志里的,也应该放这里。
333使用 diffstat的选项 "-p 1 -w 70" 这样文件名就会从内核源代码树的目录开始
334,不会占用太宽的空间(很容易适合80列的宽度,也许会有一些缩进。)
335
336在后面的参考资料中能看到适当的补丁格式的更多细节。
337
338-------------------------------
339第二节 提示,建议和诀窍
340-------------------------------
341
342本节包含很多和提交到内核的代码有关的通常的"规则"。事情永远有例外...但是
343你必须真的有好的理由这样做。你可以把本节叫做Linus的计算机科学入门课。
344
3451) 读 Document/CodingStyle
346
347Nuff 说过,如果你的代码和这个偏离太多,那么它有可能会被拒绝,没有更多的
348审查,没有更多的评价。
349
3502) #ifdef 是丑陋的
351混杂了 ifdef 的代码难以阅读和维护。别这样做。作为替代,将你的 ifdef 放
352在头文件里,有条件地定义 "static inline" 函数,或者宏,在代码里用这些东
353西。让编译器把那些"空操作"优化掉。
354
355一个简单的例子,不好的代码:
356
357 dev = alloc_etherdev (sizeof(struct funky_private));
358 if (!dev)
359 return -ENODEV;
360 #ifdef CONFIG_NET_FUNKINESS
361 init_funky_net(dev);
362 #endif
363
364清理后的例子:
365
366(头文件里)
367 #ifndef CONFIG_NET_FUNKINESS
368 static inline void init_funky_net (struct net_device *d) {}
369 #endif
370
371(代码文件里)
372 dev = alloc_etherdev (sizeof(struct funky_private));
373 if (!dev)
374 return -ENODEV;
375 init_funky_net(dev);
376
3773) 'static inline' 比宏好
378
379Static inline 函数相比宏来说,是好得多的选择。Static inline 函数提供了
380类型安全,没有长度限制,没有格式限制,在 gcc 下开销和宏一样小。
381
382宏只在 static inline 函数不是最优的时候[在 fast paths 里有很少的独立的
383案例],或者不可能用 static inline 函数的时候[例如字符串分配]。
384应该用 'static inline' 而不是 'static __inline__', 'extern inline' 和
385'extern __inline__' 。
386
3874) 不要过度设计
388
389不要试图预计模糊的未来事情,这些事情也许有用也许没有用:"让事情尽可能的
390简单,而不是更简单"。
391
392----------------
393第三节 参考文献
394----------------
395
396Andrew Morton, "The perfect patch" (tpp).
397 <http://www.zip.com.au/~akpm/linux/patches/stuff/tpp.txt>
398
399Jeff Garzik, "Linux kernel patch submission format".
400 <http://linux.yyz.us/patch-format.html>
401
402Greg Kroah-Hartman, "How to piss off a kernel subsystem maintainer".
403 <http://www.kroah.com/log/2005/03/31/>
404 <http://www.kroah.com/log/2005/07/08/>
405 <http://www.kroah.com/log/2005/10/19/>
406 <http://www.kroah.com/log/2006/01/11/>
407
408NO!!!! No more huge patch bombs to linux-kernel@vger.kernel.org people!
409 <http://marc.theaimsgroup.com/?l=linux-kernel&m=112112749912944&w=2>
410
411Kernel Documentation/CodingStyle:
412 <http://sosdg.org/~coywolf/lxr/source/Documentation/CodingStyle>
413
414Linus Torvalds's mail on the canonical patch format:
415 <http://lkml.org/lkml/2005/4/7/183>
416--