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


