本文共 4084 字,大约阅读时间需要 13 分钟。
其实在写提交补丁之前,需要开篇大概讲一下开源社区运作模式和流程,并讲下在开源社区如何参与讨论以及一些注意事项,但是因为内容限制,这里无法展开讲述。但既然提交补丁已经涉及到与其他参与者交流,我还是大概讲下提交补丁需要注意的事情:
嗯,如果还是怕出问题,那么还是多看看邮件列表其他人的邮件交流方式吧。
1.先自己造个bugfix,以testcases/kernel/syscalls/open/open01.c为例
static void setup(void){ SAFE_MKDIR(TEST_DIR, 0755);}static void cleanup(void){ if (fd > 0) SAFE_CLOSE(fd);}
setup()通过mkdir(TEST_DIR)创建了TEST_DIR,那么cleanup()需要rmdir(TEST_DIR) (哎呀,没准真是问题呢)。
2.进行修改,添加SAFE_RMDIR()删除目录
static void cleanup(void){ if (fd > 0) SAFE_CLOSE(fd); SAFE_RMDIR(NULL, TEST_DIR);}
3.提交commit
1) git branch 查看保证在master分支,如果不在执行 git checkout master2) git add testcases/kernel/syscalls/open/open01.c
3) git commit
这里会填写commit信息,格式如下bugfix for open/open01.cAdd SAFE_RMDIR(NULL, TEST_DIR) to cleanup TEST_DIR.Signed-off-by: Bixuan Cui# Please enter the commit message for your changes. Lines starting# with '#' will be ignored, and an empty message aborts the commit.# On branch master# Your branch is up-to-date with 'origin/master'.## Changes to be committed:# modified: testcases/kernel/syscalls/open/open01.c
第一行是commit标题,简练的说明这个commit是干什么的;
第三行是commit内容,标题与内容隔开一行,然后讲述这个commit作用,可以按照之前错误是什么现象、个人对其问题分析、commit作用以及最终效果(因为这个比较简单,所以一句话说明,不要担心表述不清楚,因为maintainer看一行你代码,估计都不需要你说什么就知道你要干什么了) 第五行是commit的作者声明,与内容隔开一行,一般放在最后面,就是自己姓名和邮箱啦(一定要带哦,出了问题找你^_^)。4)保存后可以使用git commit –amend继续修改哦。
5)git format-patch -1 -o .
生成patch,-1表示最近的一个commit,-o指定生成目录。最终生成0001-bugfix-for-open-open01.c.patch6)对patch进行修改:
a.Subject: [PATCH] bugfix for open/open01.c
改成
Subject: [LTP][PATCH] syscalls/open: bugfix for open/open01.c
说明,这两块必须体现,[LTP]表示LTP社区,syscalls/open表示对syscalls的open下面的修改。
b. 如果是自己第二版的修改了,请改成
Subject: [LTP][PATCH v2] syscalls/open: bugfix for open/open01.c
并且
Signed-off-by: Bixuan Cui---这里添加(v2->v1: 修改内容) testcases/kernel/syscalls/open/open01.c | 2 ++ 1 file changed, 2 insertions(+)
c. 如果2个相连的commit(其实初学者估计不会写到多个commit,因为一般是提交用例或者大改时候,那时候你已经不用看这篇文章了),那么git format-patch -2 -o . 或者手动修改 [PATCH v1] [PATCH v2]
7)使用linux的checkpatch.pl检查patch:
请先git下载linux任意版本(既然学ltp,linux代码也得学呀)../linux/scripts/checkpatch.pl -f 0001-bugfix-for-open-open01.c.patchERROR: trailing whitespace#24: FILE: 0001-bugfix-for-open-open01.c.patch:24:+ $ERROR: trailing whitespace#26: FILE: 0001-bugfix-for-open-open01.c.patch:26:+-- $total: 2 errors, 0 warnings, 28 lines checkedNOTE: For some of the reported defects, checkpatch may be able to mechanically convert to the typical style using --fix or --fix-inplace.NOTE: Whitespace errors detected. You may wish to use scripts/cleanpatch or scripts/cleanfile0001-bugfix-for-open-open01.c.patch has style problems, please review.NOTE: If any of the errors are false positives, please report them to the maintainer, see CHECKPATCH in MAINTAINERS.
嗯,patch的第24和26行,多了$,其实就是空格,vim打开patch,把多出的空格删除,一定要保证-f检查不报错。就像这样
../linux/scripts/checkpatch.pl -f 0001-bugfix-for-open-open01.c.patchtotal: 0 errors, 0 warnings, 28 lines checked0001-bugfix-for-open-open01.c.patch has no obvious style problems and is ready for submission.
8)再整体check一遍patch,仔仔细细滴;
9)发送邮件到邮件列表 git send-email –to ltp@lists.linux.it 0001-bugfix-for-open-open01.c.patch至此,可以看下ltp邮件列表有没有自己邮件啦,一般两三天会有回复的。
个人总结的很容易发现的bug,提交补丁的点:
1.下载最新linux发布版本执行ltp测试
个人可以安装个虚拟机,然后替换到最新内核,执行ltp测试。因为linux接口变更或者特性修改,ltp无法及时更新(其实ltp对内核新特性和接口更改的维护一直都是参与者来补充的),这时候会发现新的TFAIL或者TBROK用例,结合linux修改仔细分析下就能发现问题。2.在不同架构下执行LTP
LTP的版本,更多的保证X86平台,对于其他架构也提供兼容性,但是真正去测试使用的很少。个人很多的patch都是修复ltp部分用例对arm(arm64)平台兼容性不够的问题,最近比较火的RISC-V linux逐渐提供支持,ltp也要跟上的,这个平台估计会有问题。3.自己提交用例
个人时常关注下linux社区的changelog,还有lwn社区的最新信息,收集linux的接口变更和新增特性,对这些功能新增用例,很容易被接收的(个人层提交过xattr特性的用例代码)。4.其他
对ltp框架执行感觉麻烦的地方,可以进行优化。个人建议还是先从bugfix提交开始。