加入收藏 | 设为首页 | 会员中心 | 我要投稿 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函数来创建的。其实如果我们仔细阅读一

这个函数只截取了一部分,因为这一次添加磁盘流程只会走到这一部分代码,首先注意到函数的参数:第一个参数是struct mddev结构体,这个结构体域比较多,我们会在后面用到具体域时再讲,第二个参数是表示一个要加入阵列的磁盘,这里用到了该结构体的两个域,major和minor,表示磁盘主设备号和次设备号。

5676行,根据主设备号和次设备号算出dev_t。

5678行,这里为什么还要再检查一下呢?返回的错误码叫溢出,意思是说很久很久以前linux中设备还不是很多的时候dev_t只要用16位来表示就可以了,然而随着linux服务器单一种类外设数量越来越多,dev_t扩展到32位,所以这里检查保证输入major,minor的正确。

5681行,这里还未添加磁盘,所以进入这个if分支。

5684行,创建磁盘struct md_rdev结构,继续跟入到函数中:

3236 /* 
3237  * Import a device. If 'super_format' >= 0, then sanity check the superblock 
3238  * 
3239  * mark the device faulty if: 
3240  * 
3241  *   - the device is nonexistent (zero size) 
3242  *   - the device has no valid superblock 
3243  * 
3244  * a faulty rdev _never_ has rdev->sb set. 
3245  */
3246 static struct md_rdev *md_import_device(dev_t newdev, int super_format, int super_minor)  
3247 {  
3248         char b[BDEVNAME_SIZE];  
3249         int err;  
3250         struct md_rdev *rdev;  
3251         sector_t size;  
3252   
3253         rdev = kzalloc(sizeof(*rdev), GFP_KERNEL);  
3254         if (!rdev) {  
3255                 printk(KERN_ERR "md: could not alloc mem for new device!n");  
3256                 return ERR_PTR(-ENOMEM);  
3257         }  
3258   
3259         err = md_rdev_init(rdev);  
3260         if (err)  
3261                 goto abort_free;  
3262         err = alloc_disk_sb(rdev);  
3263         if (err)  
3264                 goto abort_free;  
3265   
3266         err = lock_rdev(rdev, newdev, super_format == -2);  
3267         if (err)  
3268                 goto abort_free;  
3269   
3270         kobject_init(&rdev->kobj, &rdev_ktype);  
3271   
3272         size = i_size_read(rdev->bdev->bd_inode) >> BLOCK_SIZE_BITS;  
3273         if (!size) {  
3274                 printk(KERN_WARNING   
3275                         "md: %s has zero or unknown size, marking faulty!n",  
3276                         bdevname(rdev->bdev,b));  
3277                 err = -EINVAL;  
3278                 goto abort_free;  
3279         }  
3280   
3281         if (super_format >= 0) {  
3282                 err = super_types[super_format].  
3283                         load_super(rdev, NULL, super_minor);  
3284                 if (err == -EINVAL) {  
3285                         printk(KERN_WARNING  
3286                                 "md: %s does not have a valid v%d.%d "
3287                                "superblock, not importing!n",  
3288                                 bdevname(rdev->bdev,b),  
3289                                super_format, super_minor);  
3290                         goto abort_free;  
3291                 }  
3292                 if (err < 0) {  
3293                         printk(KERN_WARNING   
3294                                 "md: could not read %s's sb, not importing!n",  
3295                                 bdevname(rdev->bdev,b));  
3296                         goto abort_free;  
3297                 }  
3298         }  
3299         if (super_format == -1)  
3300                 /* hot-add for 0.90, or non-persistent: so no badblocks */
3301                 rdev->badblocks.shift = -1;  
3302   
3303         return rdev;  
3304   
3305 abort_free:  
3306         if (rdev->bdev)  
3307                 unlock_rdev(rdev);  
3308         md_rdev_clear(rdev);  
3309         kfree(rdev);  
3310         return ERR_PTR(err);  
3311 }

查看本栏目更多精彩内容:http://www.bianceng.cn/OS/Linux/

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

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

热点阅读