運行陣列意味著陣列經曆從無到有,建立了作為一個raid應有的屬性(如同步重建),並為隨後的讀寫做好的鋪墊。那麼運行陣列的時候到底做了哪些事情,讓原來的磁碟像變形金剛一樣組成一個新的巨無霸。現在就來看陣列運行處理流程:
5158 static int do_md_run(struct mddev *mddev) 5159 { 5160 int err; 5161 5162 err = md_run(mddev); 5163 if (err) 5164 goto out; 5165 err = bitmap_load(mddev); 5166 if (err) { 5167 bitmap_destroy(mddev); 5168 goto out; 5169 } 5170 5171 md_wakeup_thread(mddev->thread); 5172 md_wakeup_thread(mddev->sync_thread); /* possibly kick off a reshape */5173 5174 set_capacity(mddev->gendisk, mddev->array_sectors); 5175 revalidate_disk(mddev->gendisk); 5176 mddev->changed = 1; 5177 kobject_uevent(&disk_to_dev(mddev->gendisk)->kobj, KOBJ_CHANGE); 5178 out: 5179 return err; 5180 }
如果說運行陣列的過程是一本書,那麼這個函數就是這本書的目錄,每一個目錄中都隱含著一個深刻的故事。
5162行,md_run運行陣列,這個函數比較長,我們按一段一段來分析:
4956 int md_run(struct mddev *mddev) 4957 { 4958 int err; 4959 struct md_rdev *rdev; 4960 struct md_personality *pers; 4961 4962 if (list_empty(&mddev->disks)) 4963 /* cannot run an array with no devices.. */4964 return -EINVAL; 4965 4966 if (mddev->pers) 4967 return -EBUSY; 4968 /* Cannot run until previous stop completes properly */4969 if (mddev->sysfs_active) 4970 return -EBUSY; 4971 4972 /* 4973 * Analyze all RAID superblock(s) 4974 */4975 if (!mddev->raid_disks) { 4976 if (!mddev->persistent) 4977 return -EINVAL; 4978 analyze_sbs(mddev); 4979 }