標籤:style blog http 使用 strong os
初始化流程代碼量比較少,也比較簡單。主要是run函數。(我閱讀的代碼的linux核心版本是2.6.32.61)
四、初始化流程分析
run函數顧名思義,很簡單這就是在RAID1開始運行時調用,進行一些初始化的操作。主要是對RAID1中的conf進行初始化。run函數在md.c的do_md_run中被調用。
run函數的具體流程
0.傳入參數mddev就是指RAID1所處的MD裝置。
1. 定義相關變數。
1.1 定義conf指標,類型為raid1_private_data_s,是raid1中的重要私人資料結構。
1.2 定義rdev指標為組成該MD裝置的disk指標,其類型為mdk_rdev_t。
2. 檢查mddev->level是否為1。如果為1,則是使用的disk mirror技術,也就是raid1,繼續下面的流程。
3. 檢查reshape_position是否為MaxSector。如果相等,其實也就是不需要reshape的意思,繼續下面的流程。
4. 申請raid1私人資料區conf,並且把conf結構掛接到mddev->private上,私人資料區中還申請了一個mempool,為磁陣讀寫緩衝使用。把mddev的結構掛接在conf->poolinfo->mddev上。把conf->device_lock的結構內容掛接在mddev->queue->queue_lock。
5. 初始化私人資料區,包括:
5.1 使用MD資訊對磁陣中的磁碟rdev賦值。
其中conf->mirrors為mirror_info類型的指標構成的數組的首地址。
根據conf->mirrors = kzalloc (sizeof(struct mirror_info) *mddev->raid_disks, GFP_KERNEL);可以看出,申請了raid_disks個mirror_info結構的空間,每個mirror_info結構可以對應到一個磁碟rdev。
5.2 關聯MD和raid1私人資料區。即conf->raid_disks = mddev->raid_disks;和conf->mddev = mddev;
5.3 私人資料區的鎖和隊列的初始化。
6. 檢查磁陣中磁碟狀態,如果有磁碟不存在或者磁碟和磁陣中有磁碟不處於一致狀態(In_sync),則處於降級狀態。如果某個磁碟不是In_syn狀態,該磁碟就需要全同步(conf->fullsync = 1)。
mddev->degraded就是管理raid下所有磁碟是否降級的“累計賬本”,某磁碟降級則加1。
6.1 如果所有磁碟都不正常(都為降級狀態),則啟動失敗。
6.2 如果只有一個盤可正常工作,則設定標誌禁止同步。因為只有一個就沒有可參照的同步磁碟,不存在同步說法。(mddev->recovery_cp = MaxSector;)
7. 找到第一個可用的磁碟記錄在conf->last_used 中。(讀均衡的時候會用到)
8. 註冊守護進程。
9. 註冊unplug回調。
10.註冊擁塞處理函數。
如果說run有點建構函式的意思,那麼stop函數就有解構函式的味道了。看看這個函數,都是所有的資源一一釋放。stop是在md.c的do_md_stop中調用。
參考資料:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=22311165&id=390818
本文來自fangpei的部落格,轉載請標明出處:http://www.cnblogs.com/fangpei/