加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

linux内核md源代码解读 三 阵列建设的进程

发布时间:2016-10-31 07:37:35 所属栏目:Linux 来源:站长网
导读:副标题#e# 这一节我们阅读阵列的创建过程。 按照常理出牌,我们到ioctl中找阵列创建命令,md对应的ioctl函数是md_ioctl,当找对应的cmd命令字时,却完全没有类似CREATE_ARRAY的命令,那么就说明md设备并不是通过ioctl函数来创建的。其实如果我们仔细阅读一

这个函数很简单,根据超级块版本从磁盘上读入阵列超级块信息并保存到md_rdev->sb_page中,做一些基本的校验和检查,并将超级块信息保存到struct md_rdev结构中。到这里就返回到add_new_disk函数,5684行返回的rdev就含有从磁盘上加载的超级块信息。

5691行,由于阵列中还没有磁盘,所以list_empty(&mddev->disks)成立,不会进入if分支。

5706行,建立阵列struct mddev和磁盘struct md_rdev结构之间的联系,进函数:

2077 static int bind_rdev_to_array(struct md_rdev * rdev, struct mddev * mddev)  
2078 {  
2079         char b[BDEVNAME_SIZE];  
2080         struct kobject *ko;  
2081         char *s;  
2082         int err;  
2083   
2084         if (rdev->mddev) {  
2085                 MD_BUG();  
2086                 return -EINVAL;  
2087         }  
2088   
2089         /* prevent duplicates */
2090         if (find_rdev(mddev, rdev->bdev->bd_dev))  
2091                 return -EEXIST;  
2092   
2093         /* make sure rdev->sectors exceeds mddev->dev_sectors */
2094         if (rdev->sectors && (mddev->dev_sectors == 0 ||  
2095                         rdev->sectors < mddev->dev_sectors)) {  
2096                 if (mddev->pers) {  
2097                         /* Cannot change size, so fail 
2098                          * If mddev->level <= 0, then we don't care 
2099                          * about aligning sizes (e.g. linear) 
2100                          */
2101                         if (mddev->level > 0)  
2102                                 return -ENOSPC;  
2103                 } else
2104                         mddev->dev_sectors = rdev->sectors;  
2105         }  
2106   
2107         /* Verify rdev->desc_nr is unique. 
2108          * If it is -1, assign a free number, else 
2109          * check number is not in use 
2110          */
2111         if (rdev->desc_nr < 0) {  
2112                 int choice = 0;  
2113                 if (mddev->pers) choice = mddev->raid_disks;  
2114                 while (find_rdev_nr(mddev, choice))  
2115                         choice++;  
2116                 rdev->desc_nr = choice;  
2117         } else {  
2118                 if (find_rdev_nr(mddev, rdev->desc_nr))  
2119                         return -EBUSY;  
2120         }  
2121         if (mddev->max_disks && rdev->desc_nr >= mddev->max_disks) {  
2122                 printk(KERN_WARNING "md: %s: array is limited to %d devicesn",  
2123                        mdname(mddev), mddev->max_disks);  
2124                 return -EBUSY;  
2125         }  
2126         bdevname(rdev->bdev,b);  
2127         while ( (s=strchr(b, '/')) != NULL)  
2128                 *s = '!';  
2129   
2130         rdev->mddev = mddev;  
2131         printk(KERN_INFO "md: bind<%s>n", b);  
2132   
2133         if ((err = kobject_add(&rdev->kobj, &mddev->kobj, "dev-%s", b)))  
2134                 goto fail;  
2135   
2136         ko = &part_to_dev(rdev->bdev->bd_part)->kobj;  
2137         if (sysfs_create_link(&rdev->kobj, ko, "block"))  
2138                 /* failure here is OK */;  
2139         rdev->sysfs_state = sysfs_get_dirent_safe(rdev->kobj.sd, "state");  
2140   
2141         list_add_rcu(&rdev->same_set, &mddev->disks);  
2142         bd_link_disk_holder(rdev->bdev, mddev->gendisk);  
2143   
2144         /* May as well allow recovery to be retried once */
2145         mddev->recovery_disabled++;  
2146   
2147         return 0;  
2148   
2149  fail:  
2150         printk(KERN_WARNING "md: failed to register dev-%s for %sn",  
2151                b, mdname(mddev));  
2152         return err;  
2153 }

2090行,检查是否磁盘已经加入阵列了,加过就不必重复添加。2094-2105行,比较磁盘大小,记录最小的磁盘空间。2111行,desc_nr分配,这个号只描述加入阵列的早晚。2130行,建立struct md_rdev到mddev的关联。2133-2139行,建立sysfs相关状态和链接。2141行,建立mddev到struct md_rdev的关联。add_new_disk就这么快结束了,简单地说就是创建struct md_rdev结构并与struct mddev结构之间创建联系。第三个命令字RUN_ARRAY的处理过程具有重要的意义,并且其过程不是三言两语能够说完的,我们把该命令字处理流程放到下一个小节单独来讲。

出处:http://blog.csdn.net/liumangxiong

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读