---
# System prepended metadata

title: Linux Kernel Typo Patch
tags: [linux]

---

# Linux Kernel Typo Patch

> 寫下一點小小的心得 希望幫到後面有興趣的人
> 如有錯 還請不吝賜教

一開始也是在和大佬聊天，然後聊到了這個錯字，然後想試著向Linux kernel發了人生第一個patch，然後就有了今天這篇

:::spoiler 點我看大綱
[toc]
:::



## 參考資料

基本上我是按著份大佬的hackmd做的 他寫的其實已經很詳細了
- [第一次給Linux Kernel發patch](https://hackmd.io/@rhythm/BkjJeugOv)

下列羅列的article也有讀過一遍，雖然是在發patch但是我覺得讀了算是讓我更了解linux和git
- [repo issue](https://github.com/torvalds/linux/pull/774)
- [git send-email](https://git-scm.com/docs/git-send-email)
- [紀念第一次向linux內核發patch](https://zhuanlan.zhihu.com/p/87530337)

官方的修改文件
- [submit your kernel patch](https://kernel.org/doc/html/latest/process/submitting-patches.html)

解釋為甚麼要用工人智慧修錯字 而非人工智慧
[Spellchecking Comments in the Linux Kernel](http://www.kegel.com/kerspell/)


## 前言

> 前言有講解一些小知識 想看的可以直接跳過__(:3」 ㄥ)__

你在github上看到的linux kernel實際上只是一個mirror，實際上真正的版本都在[這裡](https://kernel.org/)，這也是為了防止有人在repo上亂來或亂提交一些奇怪的PR，所以不要說甚麼我要去linux的github repo上發PR，你只會得到機器人回復而已，真正發repo的方式是通過git寄信。

linux kernel的維護和開發流程其實是由一批人在執行的，而不是只有Linus Torvalds，，這群人會遵守一個週期的更新(大概是一個禮拜)，當新的週期開始的時候，他們會去審核上一版的patch是不是stable的，是的話就merge。所以當你提交完一個patch並且成功的時候，通常不會馬上更新，他會告訴你你被排在一個更新queue裡面

- 大致上流程

``` mermaid
graph TD;
找到錯誤-->clone一份repo;
clone一份repo-->開一個新的branch改錯;
開一個新的branch改錯-->透過git生成和撰寫patch檔;
透過git生成和撰寫patch檔-->跑腳本檢查patch檔格式;
跑腳本檢查patch檔格式-->跑腳本找負責維護人員的mail;
跑腳本找負責維護人員的mail-->寄信送出;

```

## 事前準備

>建議別用windows clone Linux Kernel
>我當初clone的時候跑出一堆奇奇怪怪的error
>後來用WSL
### clone repo
```bash=
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
```
### 開個新分支
```bash=
# 建一個叫develop的分支
git branch develop

# 切到develop分支
git checkout develop
```
### Git Config
- 到你的~/.gitconfig下新增這些東西，WSL有可能沒有config檔，要自己新增
- 順便下載send-mail，預設是沒有的
- [send email introduce](https://git-scm.com/docs/git-send-email)
```bash=
# 如果你沒用過git 那請先這麼做
git config --global user.email "youremail@gmail.com"
git config --name user.name "Your Name"

# install git send-mail
sudo apt install git-email

# 增加在 .gitconfig
[sendemail]
	smtpEncryption = tls
	smtpServer = smtp.gmail.com
	smtpUser = youremail@gmail.com(你要用的email)
	smtpServerPort = 587
```

### Fix kernel

> 要修改linux kernel最麻煩的應該就是寫commit 因為格式要求的非常嚴謹
- 修改完錯誤之後 執行下面的指令
```bash=
# 將修改丟到 staged
git add .

# signed your commit
# -s 是為了幫你的commit 簽名，類似Signed-off-by: Name <youremail@gmail.com>
# -v 是在下方顯示你改了啥 方便維護人員閱讀 類似下面的圖
git commit -s -v
```
- 加了-v 的參數會跑出來的東東
![](https://i.imgur.com/FDGrWDw.png =600x)

- 打了git commit 指令後 因為我們沒有加 -m的參數 所以會進入nano或是vim介面

:::info
溫馨小提示 假如你跟我一樣是vim的使用者
nano對你來說可能不太直覺 
所以在這邊幫寫一些你可能會用到的nano的基本操作:heart:
或是你可以把預設編輯器改成vim
```
進到nano可以直接編輯
Crtl + O 會問你要不要儲存當前檔案
直接按Enter會儲存 或者你想要存到其他檔案裏面就打其他檔案的名稱
Crtl + X 會退出nano的編輯
```
:::
## 寫你的commit

- 這裡開始會比較重要 因為會需要告訴維護者妳做了啥以及你怎麼修改掉她的
- 在官方文件裡有寫說每一個原因前都要空一行
- 這裡是格式範例
:::warning
:warning: 他一行有75個字元限制 所以注意別超過 不然後面腳本檢查會過不了
:::

```bash=
subsystemName: short description
# 空一行
patch content description
# 空一行
Signed-off-by: "Name" <email>
```
- subsystem 要替換成你修改的地方 如果以memmep.c為例就是driver
    - short description 大概講一下你修了甚麼錯，可以寫說在哪裡修了甚麼錯誤
- patch content: 寫你做了甚麼修改，以及為甚麼要做這個修改
- Signed-off-by
    - 這東西是簽名，剛剛 -s 參數生成的

```bash=
#我自己提交時的內容
Subject: [PATCH] drivers: fix typo in firmware/efi/memmap.c

This patch fixes the spelling error in firmware/efi/memmap.c, changing
it to the correct word.

Signed-off-by: Zheng Zhi Yuan <kevinjone25@g.ncu.edu.tw>
```

## 生成patch file 

- 寫完之後 執行format-patch 他會跟master比較有甚麼地方有修改 並生出一份patch在當前資料夾下
```bash=
git format-patch master
```
- 檔名大致上會長得跟你的Subject一樣

```
像我的就是
0001-drivers-fix-typo-in-firmware-efi-memmap.c.patch
```

## 跑腳本檢查

- 他們把腳本放在/script的資料夾下
- 接下要做的事情有兩件
    1. 檢查你的commit有沒有符合他們的格式
    2. 找出你要修改的檔案是那些人負責maintain得

### checkpatch


```bash=
# 指令格式
./scripts/checkpatch.pl 你剛剛生出來的patch file名稱

#拿我的當範例
./scripts/checkpatch.pl 0001-drivers-fix-typo-in-firmware-efi-memmap.c.patch
```

- 如果是好的 結果應該會長的跟這個差不多

![](https://i.imgur.com/ndNXOQG.png)

- 假如有錯會長這樣，盡量把她修到好，因為維護者沒有時間去挑你的錯(拿75個字元當舉例
    - 你可以直接對patch檔做修改或是再重產生一份都沒關西

![](https://i.imgur.com/sbvn7Ov.png)


### 找負責的maintainer

```bash=
#指令格式
./scripts/get_maintainer.pl -f 你修改的檔案相對路徑

# 拿我當範例
./scripts/get_maintainer.pl -f drivers/firmware/efi/memmap.c
```

- 那結果會長這樣(維護的人數不一定 有可能多 也有可能兩三個人而已)
![](https://i.imgur.com/MCXIIXX.png)



## 測試寄信

- 接下來都會用到``git send-email`` 所以沒有裝的趕快去裝

- 我會怕 所以我先寄給自己看一下有沒有對 順便測一下git之類的設定有沒有對或是send-email有沒有裝成功
```bash=
git send-email --to 我的信箱 0001-drivers-fix-typo-in-firmware-efi-memmap.c.patch
```
- 然後會跑出這個確認一下是寄給自己後 打給Y 然後開心的輸入我的密碼
![](https://i.imgur.com/HL1mDIz.png)



## 然後關於我踩到坑的那一回事?

- 對 然後我就踩到坑了 可能是我沒加smtppass(? 也有可能是我沒弄清楚?
- Google在2022/5/30的時候要求所有服務進行安全性升級 所以順帶SMTP也給生了個級?
- 你可以去讀他給你[連結](https://support.google.com/mail/answer/7126229?visit_id=637949725359104888-1416135232&p=BadCredentials&rd=2#cantsignin&zippy=%2Ci-cant-sign-in-to-my-email-client) ~~硬著頭皮讀完了~~
- 所以密碼不是你google帳戶的密碼 也不是Google Authenticator App產生的2FA密碼
- 打錯就會吃到下面的error

![](https://i.imgur.com/jvACkJZ.png)

### 解法

- 因為它裡面有些解法 我大部分都用不了
- 我不知道有沒有其他解法 有的話歡迎分享XD


#### 去Google帳戶的設定
![](https://i.imgur.com/jPkdlHZ.png)

------

#### 左邊點到**安全性設定**
![](https://i.imgur.com/OGMAOmG.png)

------

#### 裡面有一個**登入google**
![](https://i.imgur.com/buVxiLC.png)

------

#### 點**應用程式密碼** 

![](https://i.imgur.com/7QBNAr0.png)

------

#### UI介面

- 如果沒改裡面應該會長這樣
![](https://i.imgur.com/wf1Oomo.png)

------

#### 選應用程式和裝置

- 因為我們要用郵件服務 所以應用程式就選郵件
- 我是在Windows 上面的WSL操作 所以我就選Windows電腦
![](https://i.imgur.com/y3sLSl5.png)

------

#### 應用程式密碼

- 他會跳出一個視窗跟你講你的密碼 右上角黑色的地方會是你的應用程式密碼
- 把她COPY起來後 按完成(別刪掉喔
![](https://i.imgur.com/iia8KlM.png)


#### 檢查一下

- 去你的信箱收信一下 看有沒有確實收到

### 繼續剛剛的測試

- 在剛剛輸入密碼的地方輸入你剛剛複製的應用程式密碼
- 成功的話大概會長這樣
![](https://i.imgur.com/HdBqn2Y.png)

## 正式寄信

- 把你剛剛從腳本得到的維護者 寫到command裡
- 寄給主維護人 然後cc給其他人
    - 主維護人會在你跑腳本的時候列出來 可以回去看上面的圖
```bash=
git send-email --to ardb@kernel.org 
--cc linux-efi@vger.kernel.org 
--cc linux-kernel@vger.kernel.org 
0001-drivers-fix-typo-in-firmware-efi-memmap.c.patch
```

## 維護人員的回覆和一些心得感想

- 過了三天 我就收到了回覆 被告知被排進wait queue裡了
    - 如果沒收到不要急 因為他們有些維護人員通常只是幫忙的而已 實際上還有其他正職要做
    - 所以讓子彈飛一下吧
![](https://i.imgur.com/YVFasCp.png)

- 雖然從上面看下來可能沒多少字，但這東西我弄了整整一天，寫的時候也挺緊張的，因為流程非常的嚴謹，怕自己有甚麼地方漏掉，所以也去翻了蠻多LKML上面各路大佬是如何寫文件的
- 這次弄完主要是對git mail這塊多了一些新的認知，不然我自己平常在用git都不會碰到mail這一塊，還有對linux整套OS維護流程的認識，翻了蠻多官方doc，他們寫的很詳細也對新手很友善，主要是希望對這套系統不熟悉的人也可以按照他們的教學去達到提交patch到Linux kernal的目的和增加被accepted的機會


#### 關於Local端要不要進行Unit test
- 這部分我沒有碰很多，所以不確定Kernel File裡面有沒有寫好的Unit test，基本上如果提交的patch有關聯到主要系統運作像是driver或是network這部分的話，應該要在Local端先用LTP或是Autotest這些工具先測試一遍或是直接重新編譯一遍然後跑跑看戳戳看，確認可執行後再交給maintainer去做review的動作


- 一些可能會幫到你的
[官方的submit patch文件](https://www.kernel.org/doc/html/latest/process/submitting-patches.html)
[LKML 2022的紀錄](https://lkml.org/lkml/2022/)


:::success
感謝看完的你 如果有找到錯的地方或是寫錯的地方 歡迎留言指正<(_ _)>
:::


## 我在LKML上的紀錄
[我提交的patch](https://lkml.org/lkml/2022/6/26/207)
[Ard Biesheuvel的回覆](https://lkml.org/lkml/2022/6/28/1208)




















