加入收藏 | 设为首页 | 会员中心 | 我要投稿 温州站长网 (https://www.0577zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

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

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

那这里的raid_disk到底是多少呢?注释里又有这样的一句话,如果raid_disk>0,那么直接创建0.90阵列超级块,很显然,我们要创建的阵列超级块是1.2的,所以6037-6080只是用于兼容老版本的阵列的,需要阅读的代码只有6016行if语句中的那几行代码。

6027-6029行,设置阵列超级块版本号。

6030行,设置persistent属性,就是说超级块是保存在磁盘上还是只放在内存中啊,这里我们都是保存在磁盘上,以后看到这个属性就永远为true。

6034行,设置阵列创建时间。

那么是在什么时候才开始设置阵列属性呢?比如说阵列级别?别急,好戏还在后头。

接着看ADD_NEW_DISK对应的处理函数:

5672 static int add_new_disk(struct mddev * mddev, mdu_disk_info_t *info)  
5673 {  
5674         char b[BDEVNAME_SIZE], b2[BDEVNAME_SIZE];  
5675         struct md_rdev *rdev;  
5676         dev_t dev = MKDEV(info->major,info->minor);  
5677  
5678         if (info->major != MAJOR(dev) || info->minor != MINOR(dev))  
5679                 return -EOVERFLOW;  
5680  
5681         if (!mddev->raid_disks) {  
5682                 int err;  
5683                 /* expecting a device which has a superblock */
5684                 rdev = md_import_device(dev, mddev->major_version, mddev->minor_version);  
5685                 if (IS_ERR(rdev)) {  
5686                         printk(KERN_WARNING  
5687                                 "md: md_import_device returned %ldn",  
5688                                 PTR_ERR(rdev));  
5689                         return PTR_ERR(rdev);  
5690                 }  
5691                 if (!list_empty(&mddev->disks)) {  
5692                         struct md_rdev *rdev0  
5693                                 = list_entry(mddev->disks.next,  
5694                                              struct md_rdev, same_set);  
5695                         err = super_types[mddev->major_version]  
5696                                 .load_super(rdev, rdev0, mddev->minor_version);  
5697                         if (err < 0) {  
5698                                 printk(KERN_WARNING  
5699                                         "md: %s has different UUID to %sn",  
5700                                         bdevname(rdev->bdev,b),  
5701                                         bdevname(rdev0->bdev,b2));  
5702                                 export_rdev(rdev);  
5703                                 return -EINVAL;  
5704                         }  
5705                 }  
5706                 err = bind_rdev_to_array(rdev, mddev);  
5707                 if (err)  
5708                         export_rdev(rdev);  
5709                 return err;  
5710         }

(编辑:温州站长网)

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

热点阅读