Chinese translated version of Documentation/SubmittingPatches If you have any comment or update to the content, please contact the original document maintainer directly. However, if you have a problem communicating in English you can also ask the Chinese maintainer for help. Contact the Chinese maintainer if this translation is outdated or if there is a problem with the translation. Chinese maintainer: TripleX Chung <triplex@zh-kernel.org> --------------------------------------------------------------------- Documentation/SubmittingPatches çš„ä¸æ–‡ç¿»è¯‘ 如果想评论或更新本文的内容,请直接è”ç³»åŽŸæ–‡æ¡£çš„ç»´æŠ¤è€…ã€‚å¦‚æžœä½ ä½¿ç”¨è‹±æ–‡ 交æµæœ‰å›°éš¾çš„è¯ï¼Œä¹Ÿå¯ä»¥å‘ä¸æ–‡ç‰ˆç»´æŠ¤è€…求助。如果本翻译更新ä¸åŠæ—¶æˆ–者翻 译å˜åœ¨é—®é¢˜ï¼Œè¯·è”ç³»ä¸æ–‡ç‰ˆç»´æŠ¤è€…。 ä¸æ–‡ç‰ˆç»´æŠ¤è€…: 钟宇 TripleX Chung <triplex@zh-kernel.org> ä¸æ–‡ç‰ˆç¿»è¯‘者: 钟宇 TripleX Chung <triplex@zh-kernel.org> ä¸æ–‡ç‰ˆæ ¡è¯‘者: æŽé˜³ Li Yang <leo@zh-kernel.org> çŽ‹èª Wang Cong <xiyou.wangcong@gmail.com> 以下为æ£æ–‡ --------------------------------------------------------------------- å¦‚ä½•è®©ä½ çš„æ”¹åŠ¨è¿›å…¥å†…æ ¸ 或者 获得亲爱的 Linus Torvalds çš„å…³æ³¨å’Œå¤„ç† ---------------------------------- 对于想è¦å°†æ”¹åŠ¨æ交到 Linux å†…æ ¸çš„ä¸ªäººæˆ–è€…å…¬å¸æ¥è¯´ï¼Œå¦‚æžœä¸ç†Ÿæ‚‰â€œè§„矩â€ï¼Œ æ交的æµç¨‹ä¼šè®©äººç•æƒ§ã€‚本文档收集了一系列建议,这些建议å¯ä»¥å¤§å¤§çš„æé«˜ä½ çš„æ”¹åŠ¨è¢«æŽ¥å—的机会。 阅读 Documentation/SubmitChecklist æ¥èŽ·å¾—在æ交代ç å‰éœ€è¦æ£€æŸ¥çš„项目的列 è¡¨ã€‚å¦‚æžœä½ åœ¨æ交一个驱动程åºï¼Œé‚£ä¹ˆåŒæ—¶é˜…读一下 Documentation/SubmittingDrivers 。 -------------------------- 第一节 - 创建并å‘é€ä½ 的改动 -------------------------- 1) "diff -up" ----------- 使用 "diff -up" 或者 "diff -uprN" æ¥åˆ›å»ºè¡¥ä¸ã€‚ æ‰€æœ‰å†…æ ¸çš„æ”¹åŠ¨ï¼Œéƒ½æ˜¯ä»¥è¡¥ä¸çš„å½¢å¼å‘ˆçŽ°çš„,补ä¸ç”± diff(1) 生æˆã€‚创建补ä¸çš„ 时候,è¦ç¡®è®¤å®ƒæ˜¯ä»¥ "unified diff" æ ¼å¼åˆ›å»ºçš„,这ç§æ ¼å¼ç”± diff(1) çš„ '-u' å‚数生æˆã€‚而且,请使用 '-p' å‚æ•°ï¼Œé‚£æ ·ä¼šæ˜¾ç¤ºæ¯ä¸ªæ”¹åŠ¨æ‰€åœ¨çš„C函数,使得 产生的补ä¸å®¹æ˜“读得多。补ä¸åº”è¯¥åŸºäºŽå†…æ ¸æºä»£ç æ ‘çš„æ ¹ç›®å½•ï¼Œè€Œä¸æ˜¯é‡Œè¾¹çš„ä»» 何å目录。 为一个å•ç‹¬çš„文件创建补ä¸ï¼Œä¸€èˆ¬æ¥è¯´è¿™æ ·åšå°±å¤Ÿäº†ï¼š SRCTREE= linux-2.6 MYFILE= drivers/net/mydriver.c cd $SRCTREE cp $MYFILE $MYFILE.orig vi $MYFILE # make your change cd .. diff -up $SRCTREE/$MYFILE{.orig,} > /tmp/patch 为多个文件创建补ä¸ï¼Œä½ å¯ä»¥è§£å¼€ä¸€ä¸ªæ²¡æœ‰ä¿®æ”¹è¿‡çš„å†…æ ¸æºä»£ç æ ‘ï¼Œç„¶åŽå’Œä½ 自 己的代ç æ ‘ä¹‹é—´åš diff 。例如: MYSRC= /devel/linux-2.6 tar xvfz linux-2.6.12.tar.gz mv linux-2.6.12 linux-2.6.12-vanilla diff -uprN -X linux-2.6.12-vanilla/Documentation/dontdiff \ linux-2.6.12-vanilla $MYSRC > /tmp/patch "dontdiff" æ˜¯å†…æ ¸åœ¨ç¼–è¯‘çš„æ—¶å€™äº§ç”Ÿçš„æ–‡ä»¶çš„åˆ—è¡¨ï¼Œåˆ—è¡¨ä¸çš„文件在 diff(1) 产生的补ä¸é‡Œä¼šè¢«è·³è¿‡ã€‚"dontdiff" 文件被包å«åœ¨2.6.12和之åŽç‰ˆæœ¬çš„å†…æ ¸æºä»£ ç æ ‘ä¸ã€‚å¯¹äºŽæ›´æ—©çš„å†…æ ¸ç‰ˆæœ¬ï¼Œä½ å¯ä»¥ä»Ž <http://www.xenotime.net/linux/doc/dontdiff> 获å–它。 ç¡®å®šä½ çš„è¡¥ä¸é‡Œæ²¡æœ‰åŒ…å«ä»»ä½•ä¸å±žäºŽè¿™æ¬¡è¡¥ä¸æ交的é¢å¤–文件。记得在用diff(1) 生æˆè¡¥ä¸ä¹‹åŽï¼Œå®¡é˜…一次补ä¸ï¼Œä»¥ç¡®ä¿å‡†ç¡®ã€‚ å¦‚æžœä½ çš„æ”¹åŠ¨å¾ˆæ•£ä¹±ï¼Œä½ åº”è¯¥ç ”ç©¶ä¸€ä¸‹å¦‚ä½•å°†è¡¥ä¸åˆ†å‰²æˆç‹¬ç«‹çš„部分,将改动分 割æˆä¸€ç³»åˆ—åˆä¹Žé€»è¾‘çš„æ¥éª¤ã€‚è¿™æ ·æ›´å®¹æ˜“è®©å…¶ä»–å†…æ ¸å¼€å‘è€…å®¡æ ¸ï¼Œå¦‚æžœä½ æƒ³ä½ çš„ è¡¥ä¸è¢«æŽ¥å—,这是很é‡è¦çš„。下é¢è¿™äº›è„šæœ¬èƒ½å¤Ÿå¸®åŠ©ä½ åšè¿™ä»¶äº‹æƒ…: Quilt: http://savannah.nongnu.org/projects/quilt Andrew Morton çš„è¡¥ä¸è„šæœ¬: http://userweb.kernel.org/~akpm/stuff/patch-scripts.tar.gz 作为这些脚本的替代,quilt 是值得推èçš„è¡¥ä¸ç®¡ç†å·¥å…·(看上é¢çš„链接)。 2)æè¿°ä½ çš„æ”¹åŠ¨ã€‚ æè¿°ä½ çš„æ”¹åŠ¨åŒ…å«çš„技术细节。 è¦å¤šå…·ä½“就写多具体。最糟糕的æè¿°å¯èƒ½æ˜¯åƒä¸‹é¢è¿™äº›è¯å¥ï¼šâ€œæ›´æ–°äº†æŸé©±åŠ¨ç¨‹ åºâ€ï¼Œâ€œä¿®æ£äº†æŸé©±åŠ¨ç¨‹åºçš„bugâ€ï¼Œæˆ–者“这个补ä¸åŒ…å«äº†æŸå系统的修改,请 ä½¿ç”¨ã€‚â€ å¦‚æžœä½ çš„æ述开始å˜é•¿ï¼Œè¿™è¡¨ç¤ºä½ 也许需è¦æ‹†åˆ†ä½ çš„è¡¥ä¸äº†ï¼Œè¯·çœ‹ç¬¬3å°èŠ‚, 继ç»ã€‚ 3)æ‹†åˆ†ä½ çš„æ”¹åŠ¨ 将改动拆分,逻辑类似的放到åŒä¸€ä¸ªè¡¥ä¸æ–‡ä»¶é‡Œã€‚ ä¾‹å¦‚ï¼Œå¦‚æžœä½ çš„æ”¹åŠ¨é‡ŒåŒæ—¶æœ‰bugä¿®æ£å’Œæ€§èƒ½ä¼˜åŒ–,那么把这些改动拆分到两个或 者更多的补ä¸æ–‡ä»¶ä¸ã€‚å¦‚æžœä½ çš„æ”¹åŠ¨åŒ…å«å¯¹API的修改,并且修改了驱动程åºæ¥é€‚ 应这些新的API,那么把这些修改分æˆä¸¤ä¸ªè¡¥ä¸ã€‚ å¦ä¸€æ–¹é¢ï¼Œå¦‚æžœä½ å°†ä¸€ä¸ªå•ç‹¬çš„改动åšæˆå¤šä¸ªè¡¥ä¸æ–‡ä»¶ï¼Œé‚£ä¹ˆå°†å®ƒä»¬åˆå¹¶æˆä¸€ä¸ª å•ç‹¬çš„è¡¥ä¸æ–‡ä»¶ã€‚è¿™æ ·ä¸€ä¸ªé€»è¾‘ä¸Šå•ç‹¬çš„改动åªè¢«åŒ…å«åœ¨ä¸€ä¸ªè¡¥ä¸æ–‡ä»¶é‡Œã€‚ 如果有一个补ä¸ä¾èµ–å¦å¤–一个补ä¸æ¥å®Œæˆå®ƒçš„改动,那没问题。简å•çš„åœ¨ä½ çš„è¡¥ ä¸æ述里指出“这个补ä¸ä¾èµ–æŸè¡¥ä¸â€å°±å¥½äº†ã€‚ å¦‚æžœä½ ä¸èƒ½å°†è¡¥ä¸æµ“缩æˆæ›´å°‘的文件,那么æ¯æ¬¡å¤§çº¦å‘é€å‡º15个,然åŽç‰å¾…审查 和整åˆã€‚ 4)选择 e-mail 的收件人 看一é MAINTAINERS 文件和æºä»£ç ï¼Œçœ‹çœ‹ä½ æ‰€çš„æ”¹åŠ¨æ‰€åœ¨çš„å†…æ ¸å系统有没有指 定的维护者。如果有,给他们å‘e-mail。 如果没有找到维护者,或者维护者没有åé¦ˆï¼Œå°†ä½ çš„è¡¥ä¸å‘é€åˆ°å†…æ ¸å¼€å‘者主邮 件列表 linux-kernel@vger.kernel.orgã€‚å¤§éƒ¨åˆ†çš„å†…æ ¸å¼€å‘者都跟踪这个邮件列 表,å¯ä»¥è¯„ä»·ä½ çš„æ”¹åŠ¨ã€‚ æ¯æ¬¡ä¸è¦å‘é€è¶…过15个补ä¸åˆ° vger 邮件列表ï¼ï¼ï¼ Linus Torvalds 是决定改动能å¦è¿›å…¥ Linux å†…æ ¸çš„æœ€ç»ˆè£å†³è€…。他的 e-mail 地å€æ˜¯ <torvalds@linux-foundation.org> 。他收到的 e-mail 很多,所以一般 çš„è¯´ï¼Œæœ€å¥½åˆ«ç»™ä»–å‘ e-mail。 那些修æ£bug,“显而易è§â€çš„修改或者是类似的åªéœ€è¦å¾ˆå°‘讨论的补ä¸å¯ä»¥ç›´æŽ¥ å‘é€æˆ–者CCç»™Linus。那些需è¦è®¨è®ºæˆ–者没有很清楚的好处的补ä¸ï¼Œä¸€èˆ¬å…ˆå‘é€åˆ° linux-kernel邮件列表。åªæœ‰å½“è¡¥ä¸è¢«è®¨è®ºå¾—å·®ä¸å¤šäº†ï¼Œæ‰æ交给Linus。 5)选择CC( e-mail 抄é€)列表 除éžä½ 有ç†ç”±ä¸è¿™æ ·åšï¼Œå¦åˆ™CC linux-kernel@vger.kernel.org。 除了 Linus ä¹‹å¤–ï¼Œå…¶ä»–å†…æ ¸å¼€å‘者也需è¦æ³¨æ„åˆ°ä½ çš„æ”¹åŠ¨ï¼Œè¿™æ ·ä»–ä»¬æ‰èƒ½è¯„è®ºä½ çš„æ”¹åŠ¨å¹¶æ供代ç 审查和建议。linux-kernel 是 Linux å†…æ ¸å¼€å‘者主邮件列表 。其它的邮件列表为特定的å系统æä¾›æœåŠ¡ï¼Œæ¯”如 USB,framebuffer 设备,虚 拟文件系统,SCSI å系统,ç‰ç‰ã€‚查看 MAINTAINERS 文件æ¥èŽ·å¾—å’Œä½ çš„æ”¹åŠ¨æœ‰ 关的邮件列表。 Majordomo lists of VGER.KERNEL.ORG at: <http://vger.kernel.org/vger-lists.html> 如果改动影å“äº†ç”¨æˆ·ç©ºé—´å’Œå†…æ ¸ä¹‹é—´çš„æŽ¥å£ï¼Œè¯·ç»™ MAN-PAGES 的维护者(列在 MAITAINERS 文件里的)å‘é€ä¸€ä¸ªæ‰‹å†Œé¡µï¼ˆman-pages)补ä¸ï¼Œæˆ–者至少通知一下改 å˜ï¼Œè®©ä¸€äº›ä¿¡æ¯æœ‰é€”径进入手册页。 å³ä½¿åœ¨ç¬¬å››æ¥çš„时候,维护者没有作出回应,也è¦ç¡®è®¤åœ¨ä¿®æ”¹ä»–们的代ç 的时候 ,一直将维护者拷è´åˆ°CC列表ä¸ã€‚ 对于å°çš„è¡¥ä¸ï¼Œä½ 也许会CC到 Adrian Bunk 管ç†çš„æœé›†ç碎补ä¸çš„邮件列表 (Trivial Patch Monkey)trivial@kernel.org,那里专门收集ç碎的补ä¸ã€‚下é¢è¿™æ · çš„è¡¥ä¸ä¼šè¢«çœ‹ä½œâ€œç碎的â€è¡¥ä¸ï¼š 文档的拼写修æ£ã€‚ ä¿®æ£ä¼šå½±å“到 grep(1) 的拼写。 è¦å‘Šä¿¡æ¯ä¿®æ£(频ç¹çš„打å°æ— 用的è¦å‘Šæ˜¯ä¸å¥½çš„。) 编译错误修æ£ï¼ˆä»£ç 逻辑的确是对的,åªæ˜¯ç¼–译有问题。) è¿è¡Œæ—¶ä¿®æ£ï¼ˆåªè¦çœŸçš„ä¿®æ£äº†é”™è¯¯ã€‚) 移除使用了被废弃的函数/å®çš„代ç (例如 check_region。) è”系方å¼å’Œæ–‡æ¡£ä¿®æ£ã€‚ 用å¯ç§»æ¤çš„代ç 替æ¢ä¸å¯ç§»æ¤çš„代ç (å³ä½¿åœ¨ä½“系结构相关的代ç ä¸ï¼Œæ—¢ç„¶æœ‰ 人拷è´ï¼Œåªè¦å®ƒæ˜¯ç碎的) 任何文件的作者/维护者对该文件的改动(例如 patch monkey 在é‡ä¼ 模å¼ä¸‹ï¼‰ EMAIL: trivial@kernel.org (译注,关于“ç碎补ä¸â€çš„ä¸€äº›è¯´æ˜Žï¼šå› ä¸ºåŽŸæ–‡çš„è¿™ä¸€éƒ¨åˆ†å†™å¾—æ¯”è¾ƒç®€å•ï¼Œæ‰€ä»¥ä¸å¾—ä¸ è¿ä¾‹å†™ä¸€ä¸‹è¯‘注。"trivial"这个英文å•è¯çš„本æ„是“ç碎的,ä¸é‡è¦çš„。â€ä½†æ˜¯åœ¨è¿™é‡Œ 有ç¨å¾®æœ‰ä¸€äº›å˜åŒ–,例如对一些明显的NULL指针的修æ£ï¼Œå±žäºŽè¿è¡Œæ—¶ä¿®æ£ï¼Œä¼šè¢«å½’ç±» 到ç碎补ä¸é‡Œã€‚虽然NULL指针的修æ£å¾ˆé‡è¦ï¼Œä½†æ˜¯è¿™æ ·çš„ä¿®æ£å¾€å¾€å¾ˆå°è€Œä¸”很容易得到 检验,所以也被归入ç碎补ä¸ã€‚ç碎补ä¸æ›´ç²¾ç¡®çš„归类应该是 “simple, localized & easy to verifyâ€ï¼Œä¹Ÿå°±æ˜¯è¯´ç®€å•çš„,局部的和易于检验的。 trivial@kernel.orgé‚®ä»¶åˆ—è¡¨çš„ç›®çš„æ˜¯é’ˆå¯¹è¿™æ ·çš„è¡¥ä¸ï¼Œä¸ºæ交者æ供一个ä¸å¿ƒï¼Œæ¥ é™ä½Žæ交的门槛。) 6)没有 MIME ç¼–ç ,没有链接,没有压缩,没有附件,åªæœ‰çº¯æ–‡æœ¬ã€‚ Linus å’Œå…¶ä»–çš„å†…æ ¸å¼€å‘者需è¦é˜…è¯»å’Œè¯„è®ºä½ æäº¤çš„æ”¹åŠ¨ã€‚å¯¹äºŽå†…æ ¸å¼€å‘者æ¥è¯´ ,å¯ä»¥â€œå¼•ç”¨â€ä½ 的改动很é‡è¦ï¼Œä½¿ç”¨ä¸€èˆ¬çš„ e-mail 工具,他们就å¯ä»¥åœ¨ä½ çš„ 代ç 的任何ä½ç½®æ·»åŠ 评论。 å› ä¸ºè¿™ä¸ªåŽŸå› ï¼Œæ‰€æœ‰çš„æ交的补ä¸éƒ½æ˜¯ e-mail ä¸â€œå†…嵌â€çš„。 è¦å‘Šï¼šå¦‚æžœä½ ä½¿ç”¨å‰ªåˆ‡-ç²˜è´´ä½ çš„è¡¥ä¸ï¼Œå°å¿ƒä½ 的编辑器的自动æ¢è¡ŒåŠŸèƒ½ç ´åä½ çš„ è¡¥ä¸ã€‚ ä¸è¦å°†è¡¥ä¸ä½œä¸º MIME ç¼–ç 的附件,ä¸ç®¡æ˜¯å¦åŽ‹ç¼©ã€‚很多æµè¡Œçš„ e-mail è½¯ä»¶ä¸ æ˜¯ä»»ä½•æ—¶å€™éƒ½å°† MIME ç¼–ç 的附件当作纯文本å‘é€çš„ï¼Œè¿™ä¼šä½¿å¾—åˆ«äººæ— æ³•åœ¨ä½ çš„ 代ç ä¸åŠ 评论。å¦å¤–,MIME ç¼–ç 的附件会让 Linus 多花一点时间æ¥å¤„ç†ï¼Œè¿™å°± é™ä½Žäº†ä½ 的改动被接å—çš„å¯èƒ½æ€§ã€‚ è¦å‘Šï¼šä¸€äº›é‚®ä»¶è½¯ä»¶ï¼Œæ¯”如 Mozilla ä¼šå°†ä½ çš„ä¿¡æ¯ä»¥å¦‚ä¸‹æ ¼å¼å‘é€ï¼š ---- 邮件头 ---- Content-Type: text/plain; charset=us-ascii; format=flowed ---- 邮件头 ---- 问题在于 “format=flowed†会让接收端的æŸäº›é‚®ä»¶è½¯ä»¶å°†é‚®ä»¶ä¸çš„åˆ¶è¡¨ç¬¦æ›¿æ¢ æˆç©ºæ ¼ä»¥åŠåšä¸€äº›ç±»ä¼¼çš„替æ¢ã€‚è¿™æ ·ï¼Œä½ å‘é€çš„时候看起æ¥æ²¡é—®é¢˜çš„è¡¥ä¸å°±è¢«ç ´ å了。 è¦ä¿®æ£è¿™ä¸ªé—®é¢˜ï¼Œåªéœ€è¦å°†ä½ çš„ mozilla çš„ defaults/pref/mailnews.js 文件 里的 pref("mailnews.send_plaintext_flowed", false); // RFC 2646======= ä¿®æ”¹æˆ pref("mailnews.display.disable_format_flowed_support", true); å°±å¯ä»¥äº†ã€‚ 7) e-mail çš„å¤§å° ç»™ Linus å‘é€è¡¥ä¸çš„时候,永远按照第6å°èŠ‚说的åšã€‚ 大的改动对邮件列表ä¸åˆé€‚,对æŸäº›ç»´æŠ¤è€…也ä¸åˆé€‚ã€‚å¦‚æžœä½ çš„è¡¥ä¸ï¼Œåœ¨ä¸åŽ‹ç¼© 的情况下,超过了40kBï¼Œé‚£ä¹ˆä½ æœ€å¥½å°†è¡¥ä¸æ”¾åœ¨ä¸€ä¸ªèƒ½é€šè¿‡ internet è®¿é—®çš„æœ åŠ¡å™¨ä¸Šï¼Œç„¶åŽç”¨æŒ‡å‘ä½ çš„è¡¥ä¸çš„ URL 替代。 8) æŒ‡å‡ºä½ çš„å†…æ ¸ç‰ˆæœ¬ åœ¨æ ‡é¢˜å’Œåœ¨è¡¥ä¸çš„æè¿°ä¸ï¼ŒæŒ‡å‡ºè¡¥ä¸å¯¹åº”çš„å†…æ ¸çš„ç‰ˆæœ¬ï¼Œæ˜¯å¾ˆé‡è¦çš„。 如果补ä¸ä¸èƒ½å¹²å‡€çš„åœ¨æœ€æ–°ç‰ˆæœ¬çš„å†…æ ¸ä¸Šæ‰“ä¸Šï¼ŒLinus 是ä¸ä¼šæŽ¥å—它的。 9) ä¸è¦æ°”é¦ï¼Œç»§ç»æ交。 å½“ä½ æ交了改动以åŽï¼Œè€å¿ƒåœ°ç‰å¾…。如果 Linus å–œæ¬¢ä½ çš„æ”¹åŠ¨å¹¶ä¸”åŒæ„它,那么 å®ƒå°†åœ¨ä¸‹ä¸€ä¸ªå†…æ ¸å‘布版本ä¸å‡ºçŽ°ã€‚ ç„¶è€Œï¼Œå¦‚æžœä½ çš„æ”¹åŠ¨æ²¡æœ‰å‡ºçŽ°åœ¨ä¸‹ä¸€ä¸ªç‰ˆæœ¬çš„å†…æ ¸ä¸ï¼Œå¯èƒ½æœ‰è‹¥å¹²åŽŸå› 。å‡å°‘é‚£ äº›åŽŸå› ï¼Œä¿®æ£é”™è¯¯ï¼Œé‡æ–°æ交更新åŽçš„æ”¹åŠ¨ï¼Œæ˜¯ä½ è‡ªå·±çš„å·¥ä½œã€‚ Linusä¸ç»™å‡ºä»»ä½•è¯„论就“丢弃â€ä½ çš„è¡¥ä¸æ˜¯å¸¸è§çš„事情。在系统ä¸è¿™æ ·çš„事情很 平常。如果他没有接å—ä½ çš„è¡¥ä¸ï¼Œä¹Ÿè®¸æ˜¯ç”±äºŽä»¥ä¸‹åŽŸå› : * ä½ çš„è¡¥ä¸ä¸èƒ½åœ¨æœ€æ–°ç‰ˆæœ¬çš„å†…æ ¸ä¸Šå¹²å‡€çš„æ‰“ä¸Šã€‚ * ä½ çš„è¡¥ä¸åœ¨ linux-kernel 邮件列表ä¸æ²¡æœ‰å¾—到充分的讨论。 * é£Žæ ¼é—®é¢˜ï¼ˆå‚照第2å°èŠ‚) * é‚®ä»¶æ ¼å¼é—®é¢˜ï¼ˆé‡è¯»æœ¬èŠ‚) * ä½ çš„æ”¹åŠ¨æœ‰æŠ€æœ¯é—®é¢˜ã€‚ * 他收到了æˆå¨çš„ e-mailï¼Œè€Œä½ çš„åœ¨æ··ä¹±ä¸ä¸¢å¤±äº†ã€‚ * ä½ è®©äººä¸ºéš¾ã€‚ 有疑问的时候,在 linux-kernel 邮件列表上请求评论。 10) åœ¨æ ‡é¢˜ä¸ŠåŠ ä¸Š PATCH çš„å—æ · Linus å’Œ linux-kernel 邮件列表的 e-mail æµé‡éƒ½å¾ˆé«˜ï¼Œä¸€ä¸ªé€šå¸¸çš„çº¦å®šæ˜¯æ ‡ 题行以 [PATCH] å¼€å¤´ã€‚è¿™æ ·å¯ä»¥è®© Linus å’Œå…¶ä»–å†…æ ¸å¼€å‘人员å¯ä»¥ä»Ž e-mail 的讨论ä¸å¾ˆè½»æ˜“的将补ä¸åˆ†è¾¨å‡ºæ¥ã€‚ 11ï¼‰ä¸ºä½ çš„å·¥ä½œç¾å ä¸ºäº†åŠ å¼ºå¯¹è°åšäº†ä½•äº‹çš„追踪,尤其是对那些é€è¿‡å¥½å‡ 层的维护者的补ä¸ï¼Œæˆ‘们 建议在å‘é€å‡ºåŽ»çš„è¡¥ä¸ä¸ŠåŠ 一个 “sign-off†的过程。 "sign-off" 是在补ä¸çš„注释的最åŽçš„简å•çš„一行文å—,认è¯ä½ 编写了它或者其他 人有æƒåŠ›å°†å®ƒä½œä¸ºå¼€æ”¾æºä»£ç çš„è¡¥ä¸ä¼ 递。规则很简å•ï¼šå¦‚æžœä½ èƒ½è®¤è¯å¦‚ä¸‹ä¿¡æ¯ ï¼š å¼€å‘者æ¥æºè¯ä¹¦ 1.1 对于本项目的贡献,我认è¯å¦‚下信æ¯ï¼š (a)这些贡献是完全或者部分的由我创建,我有æƒåˆ©ä»¥æ–‡ä»¶ä¸æŒ‡å‡º 的开放æºä»£ç 许å¯è¯æ交它;或者 (b)这些贡献基于以å‰çš„工作,æ®æˆ‘所知,这些以å‰çš„工作å—æ°å½“的开放 æºä»£ç 许å¯è¯ä¿æŠ¤ï¼Œè€Œä¸”ï¼Œæ ¹æ®è®¸å¯è¯ï¼Œæˆ‘有æƒæ交修改åŽçš„贡献, æ— è®ºæ˜¯å®Œå…¨è¿˜æ˜¯éƒ¨åˆ†ç”±æˆ‘åˆ›é€ ï¼Œè¿™äº›è´¡çŒ®éƒ½ä½¿ç”¨åŒä¸€ä¸ªå¼€æ”¾æºä»£ç 许å¯è¯ (除éžæˆ‘被å…许用其它的许å¯è¯ï¼‰ï¼Œæ£å¦‚文件ä¸æŒ‡å‡ºçš„;或者 (c)这些贡献由认è¯ï¼ˆa),(b)或者(c)的人直接æ供给我,而 且我没有修改它。 (d)我ç†è§£å¹¶åŒæ„这个项目和贡献是公开的,贡献的记录(包括我 一起æ交的个人记录,包括 sign-off )被永久维护并且å¯ä»¥å’Œè¿™ä¸ªé¡¹ç›® 或者开放æºä»£ç 的许å¯è¯åŒæ¥åœ°å†å‘行。 é‚£ä¹ˆåŠ å…¥è¿™æ ·ä¸€è¡Œï¼š Signed-off-by: Random J Developer <random@developer.example.org> ä½¿ç”¨ä½ çš„çœŸå(抱æ‰ï¼Œä¸èƒ½ä½¿ç”¨å‡å或者匿å。) 有人在最åŽåŠ ä¸Šæ ‡ç¾ã€‚çŽ°åœ¨è¿™äº›ä¸œè¥¿ä¼šè¢«å¿½ç•¥ï¼Œä½†æ˜¯ä½ å¯ä»¥è¿™æ ·åšï¼Œæ¥æ ‡è®°å…¬å¸ 内部的过程,或者åªæ˜¯æŒ‡å‡ºå…³äºŽ sign-off 的一些特殊细节。 12ï¼‰æ ‡å‡†è¡¥ä¸æ ¼å¼ æ ‡å‡†çš„è¡¥ä¸ï¼Œæ ‡é¢˜è¡Œæ˜¯ï¼š Subject: [PATCH 001/123] å系统:一å¥è¯æ¦‚è¿° æ ‡å‡†è¡¥ä¸çš„信体å˜åœ¨å¦‚下部分: - 一个 "from" 行指出补ä¸ä½œè€…。 - 一个空行 - 说明的主体,这些说明文å—会被拷è´åˆ°æ述该补ä¸çš„永久改动记录里。 - 一个由"---"æž„æˆçš„æ ‡è®°è¡Œ - ä¸åˆé€‚放到改动记录里的é¢å¤–的注解。 - è¡¥ä¸æœ¬èº«ï¼ˆdiff 输出) æ ‡é¢˜è¡Œçš„æ ¼å¼ï¼Œä½¿å¾—å¯¹æ ‡é¢˜è¡ŒæŒ‰å—æ¯åºæŽ’åºéžå¸¸çš„容易 - 很多 e-mail 客户端都 å¯ä»¥æ”¯æŒ - å› ä¸ºåºåˆ—å·æ˜¯ç”¨é›¶å¡«å……的,所以按数å—排åºå’ŒæŒ‰å—æ¯æŽ’åºæ˜¯ä¸€æ ·çš„。 e-mail æ ‡é¢˜ä¸çš„“å系统â€æ ‡è¯†å“ªä¸ªå†…æ ¸å系统将被打补ä¸ã€‚ e-mail æ ‡é¢˜ä¸çš„“一å¥è¯æ¦‚è¿°â€æ‰¼è¦çš„æè¿° e-mail ä¸çš„è¡¥ä¸ã€‚“一å¥è¯æ¦‚述†ä¸åº”该是一个文件å。对于一个补ä¸ç³»åˆ—(“补ä¸ç³»åˆ—â€æŒ‡ä¸€ç³»åˆ—的多个相关补 ä¸ï¼‰ï¼Œä¸è¦å¯¹æ¯ä¸ªè¡¥ä¸éƒ½ä½¿ç”¨åŒæ ·çš„“一å¥è¯æ¦‚è¿°â€ã€‚ è®°ä½ e-mail 的“一å¥è¯æ¦‚è¿°â€ä¼šæˆä¸ºè¯¥è¡¥ä¸çš„å…¨å±€å”¯ä¸€æ ‡è¯†ã€‚å®ƒä¼šè”“å»¶åˆ° git 的改动记录里。然åŽâ€œä¸€å¥è¯æ¦‚è¿°â€ä¼šè¢«ç”¨åœ¨å¼€å‘者的讨论里,用æ¥æŒ‡ä»£è¿™ä¸ªè¡¥ ä¸ã€‚用户将希望通过 google æ¥æœç´¢"一å¥è¯æ¦‚è¿°"æ¥æ‰¾åˆ°é‚£äº›è®¨è®ºè¿™ä¸ªè¡¥ä¸çš„æ–‡ ç« ã€‚ ä¸€äº›æ ‡é¢˜çš„ä¾‹å: Subject: [patch 2/5] ext2: improve scalability of bitmap searching Subject: [PATCHv2 001/207] x86: fix eflags tracking "from" 行是信体里的最上é¢ä¸€è¡Œï¼Œå…·æœ‰å¦‚ä¸‹æ ¼å¼ï¼š From: Original Author <author@example.com> "from" 行指明在永久改动日志里,è°ä¼šè¢«ç¡®è®¤ä¸ºä½œè€…。如果没有 "from" 行,那 么邮件头里的 "From: " 行会被用æ¥å†³å®šæ”¹åŠ¨æ—¥å¿—ä¸çš„作者。 说明的主题将会被æ交到永久的æºä»£ç æ”¹åŠ¨æ—¥å¿—é‡Œï¼Œå› æ¤å¯¹é‚£äº›æ—©å·²ç»ä¸è®°å¾—å’Œ 这个补ä¸ç›¸å…³çš„讨论细节的有能力的读者æ¥è¯´ï¼Œæ˜¯æœ‰æ„义的。 "---" æ ‡è®°è¡Œå¯¹äºŽè¡¥ä¸å¤„ç†å·¥å…·è¦æ‰¾åˆ°å“ªé‡Œæ˜¯æ”¹åŠ¨æ—¥å¿—ä¿¡æ¯çš„结æŸï¼Œæ˜¯ä¸å¯ç¼ºå°‘ 的。 对于 "---" æ ‡è®°ä¹‹åŽçš„é¢å¤–注解,一个好的用途就是用æ¥å†™ diffstat,用æ¥æ˜¾ 示修改了什么文件和æ¯ä¸ªæ–‡ä»¶éƒ½å¢žåŠ å’Œåˆ é™¤äº†å¤šå°‘è¡Œã€‚diffstat 对于比较大的补 ä¸ç‰¹åˆ«æœ‰ç”¨ã€‚其余那些åªæ˜¯å’Œæ—¶åˆ»æˆ–者开å‘者相关的注解,ä¸åˆé€‚放到永久的改 动日志里的,也应该放这里。 使用 diffstat的选项 "-p 1 -w 70" è¿™æ ·æ–‡ä»¶åå°±ä¼šä»Žå†…æ ¸æºä»£ç æ ‘çš„ç›®å½•å¼€å§‹ ,ä¸ä¼šå 用太宽的空间(很容易适åˆ80列的宽度,也许会有一些缩进。) 在åŽé¢çš„å‚考资料ä¸èƒ½çœ‹åˆ°é€‚当的补ä¸æ ¼å¼çš„更多细节。 ------------------------------- 第二节 æç¤ºï¼Œå»ºè®®å’Œè¯€çª ------------------------------- 本节包å«å¾ˆå¤šå’Œæäº¤åˆ°å†…æ ¸çš„ä»£ç 有关的通常的"规则"。事情永远有例外...但是 ä½ å¿…é¡»çœŸçš„æœ‰å¥½çš„ç†ç”±è¿™æ ·åšã€‚ä½ å¯ä»¥æŠŠæœ¬èŠ‚å«åšLinus的计算机科å¦å…¥é—¨è¯¾ã€‚ 1) 读 Document/CodingStyle Nuff è¯´è¿‡ï¼Œå¦‚æžœä½ çš„ä»£ç 和这个å离太多,那么它有å¯èƒ½ä¼šè¢«æ‹’ç»ï¼Œæ²¡æœ‰æ›´å¤šçš„ 审查,没有更多的评价。 2) #ifdef 是丑陋的 æ··æ‚了 ifdef 的代ç éš¾ä»¥é˜…è¯»å’Œç»´æŠ¤ã€‚åˆ«è¿™æ ·åšã€‚ä½œä¸ºæ›¿ä»£ï¼Œå°†ä½ çš„ ifdef 放 在头文件里,有æ¡ä»¶åœ°å®šä¹‰ "static inline" 函数,或者å®ï¼Œåœ¨ä»£ç 里用这些东 西。让编译器把那些"空æ“作"优化掉。 一个简å•çš„例å,ä¸å¥½çš„代ç : dev = alloc_etherdev (sizeof(struct funky_private)); if (!dev) return -ENODEV; #ifdef CONFIG_NET_FUNKINESS init_funky_net(dev); #endif 清ç†åŽçš„例å: (头文件里) #ifndef CONFIG_NET_FUNKINESS static inline void init_funky_net (struct net_device *d) {} #endif (代ç 文件里) dev = alloc_etherdev (sizeof(struct funky_private)); if (!dev) return -ENODEV; init_funky_net(dev); 3) 'static inline' 比å®å¥½ Static inline 函数相比å®æ¥è¯´ï¼Œæ˜¯å¥½å¾—多的选择。Static inline 函数æ供了 类型安全,没有长度é™åˆ¶ï¼Œæ²¡æœ‰æ ¼å¼é™åˆ¶ï¼Œåœ¨ gcc 下开销和å®ä¸€æ ·å°ã€‚ å®åªåœ¨ static inline 函数ä¸æ˜¯æœ€ä¼˜çš„时候[在 fast paths 里有很少的独立的 案例],或者ä¸å¯èƒ½ç”¨ static inline 函数的时候[例如å—符串分é…]。 应该用 'static inline' 而ä¸æ˜¯ 'static __inline__', 'extern inline' å’Œ 'extern __inline__' 。 4) ä¸è¦è¿‡åº¦è®¾è®¡ ä¸è¦è¯•å›¾é¢„计模糊的未æ¥äº‹æƒ…,这些事情也许有用也许没有用:"让事情尽å¯èƒ½çš„ 简å•ï¼Œè€Œä¸æ˜¯æ›´ç®€å•"。 ---------------- 第三节 å‚考文献 ---------------- Andrew Morton, "The perfect patch" (tpp). <http://userweb.kernel.org/~akpm/stuff/tpp.txt> Jeff Garzik, "Linux kernel patch submission format". <http://linux.yyz.us/patch-format.html> Greg Kroah-Hartman, "How to piss off a kernel subsystem maintainer". <http://www.kroah.com/log/2005/03/31/> <http://www.kroah.com/log/2005/07/08/> <http://www.kroah.com/log/2005/10/19/> <http://www.kroah.com/log/2006/01/11/> NO!!!! No more huge patch bombs to linux-kernel@vger.kernel.org people! <http://marc.theaimsgroup.com/?l=linux-kernel&m=112112749912944&w=2> Kernel Documentation/CodingStyle: <http://sosdg.org/~coywolf/lxr/source/Documentation/CodingStyle> Linus Torvalds's mail on the canonical patch format: <http://lkml.org/lkml/2005/4/7/183> --