linux内核md源代码解读 六 先容raid10阵列的运行
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行,设置数据拷贝数。 (编辑:源码网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |