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

linux内核md源代码解读 六 先容raid10阵列的运行

发布时间:2016-10-29 18:57:24 所属栏目:Linux 来源:站长网
导读:副标题#e# raid10的run函数与raid5的run函数最大区别在于setup_conf,那就直接深入核心: 3540 static struct r10conf *setup_conf(struct mddev *mddev) 3541 { 3542 struct r10conf *conf = NULL; 3543 int err = -EINVAL; 3544 struct geom geo; 3545 in

3547行,设置raid10布局,这个函数代码很简单,但意义很重要,特别是在处理读写流程里要对这个布局十分清楚。看setup_geo函数:

3498 enum geo_type {geo_new, geo_old, geo_start};  
3499 static int setup_geo(struct geom *geo, struct mddev *mddev, enum geo_type new)  
3500 {  
3501         int nc, fc, fo;  
3502         int layout, chunk, disks;  
3503         switch (new) {  
3504         case geo_old:  
3505                 layout = mddev->layout;  
3506                 chunk = mddev->chunk_sectors;  
3507                 disks = mddev->raid_disks - mddev->delta_disks;  
3508                 break;  
3509         case geo_new:  
3510                 layout = mddev->new_layout;  
3511                 chunk = mddev->new_chunk_sectors;  
3512                 disks = mddev->raid_disks;  
3513                 break;  
3514         default: /* avoid 'may be unused' warnings */
3515         case geo_start: /* new when starting reshape - raid_disks not 
3516                          * updated yet. */
3517                 layout = mddev->new_layout;  
3518                 chunk = mddev->new_chunk_sectors;  
3519                 disks = mddev->raid_disks + mddev->delta_disks;  
3520                 break;  
3521         }  
3522         if (layout >> 18)  
3523                 return -1;  
3524         if (chunk < (PAGE_SIZE >> 9) ||  
3525             !is_power_of_2(chunk))  
3526                 return -2;  
3527         nc = layout & 255;  
3528         fc = (layout >> 8) & 255;  
3529         fo = layout & (1<<16);  
3530         geo->raid_disks = disks;  
3531         geo->near_copies = nc;  
3532         geo->far_copies = fc;  
3533         geo->far_offset = fo;  
3534         geo->far_set_size = (layout & (1<<17)) ? disks / fc : disks;  
3535         geo->chunk_mask = chunk - 1;  
3536         geo->chunk_shift = ffz(~chunk);  
3537         return nc*fc;  
3538 }

raid10有近拷贝和远拷贝的设置,简单地说,近拷贝就是组成raid1的镜像磁盘数,远拷贝就是每个磁盘划分为几部分存镜像数据。

3503行,这里传进来的参数是geo_new,转到3509行。

3510行,raid10的layout,默认是0x102,即near_copies=2, far_copies=1。

3511行,chunk size。

3512行,数据盘个数。

3522-3526行,参数合法性检查。

3527行,计算near_copies。

3528行,计算far_copies。

3529行,计算far_offset。

3537行,返回拷贝数。

从上面的代码可以知道,raid10每一份可以有nc*fc份拷贝,但实际应用中考虑到磁盘的利用率,一般采用nc=2, fc=1。

回到setup_conf函数中,

3563行,申请struct r10conf内存空间。

3568行,申请struct raid10_info内存空间。

3574行,申请一个page页,用于读磁盘的临时空间。

3579行,设置数据拷贝数。

(编辑:济南站长网)

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

热点阅读