linux内核奇遇记之md源代码解读之六
- 3540 static struct r10conf *setup_conf(struct mddev *mddev)
- 3541 {
- 3542 struct r10conf *conf = NULL;
- 3543 int err = -EINVAL;
- 3544 struct geom geo;
- 3545 int copies;
- 3546
- 3547 copies = setup_geo(&geo, mddev, geo_new);
- 3548
- 3549 if (copies == -2) {
- 3550 printk(KERN_ERR "md/raid10:%s: chunk size must be "
- 3551 "at least PAGE_SIZE(%ld) and be a power of 2.\n",
- 3552 mdname(mddev), PAGE_SIZE);
- 3553 goto out;
- 3554 }
- 3555
- 3556 if (copies < 2 || copies > mddev->raid_disks) {
- 3557 printk(KERN_ERR "md/raid10:%s: unsupported raid10 layout: 0x%8x\n",
- 3558 mdname(mddev), mddev->new_layout);
- 3559 goto out;
- 3560 }
- 3561
- 3562 err = -ENOMEM;
- 3563 conf = kzalloc(sizeof(struct r10conf), GFP_KERNEL);
- 3564 if (!conf)
- 3565 goto out;
- 3566
- 3567 /* FIXME calc properly */
- 3568 conf->mirrors = kzalloc(sizeof(struct raid10_info)*(mddev->raid_disks +
- 3569 max(0,-mddev->delta_disks)),
- 3570 GFP_KERNEL);
- 3571 if (!conf->mirrors)
- 3572 goto out;
- 3573
- 3574 conf->tmppage = alloc_page(GFP_KERNEL);
- 3575 if (!conf->tmppage)
- 3576 goto out;
- 3577
- 3578 conf->geo = geo;
- 3579 conf->copies = copies;
- 3580 conf->r10bio_pool = mempool_create(NR_RAID10_BIOS, r10bio_pool_alloc,
- 3581 r10bio_pool_free, conf);
- 3582 if (!conf->r10bio_pool)
- 3583 goto out;
- 3584
- 3585 calc_sectors(conf, mddev->dev_sectors);
- 3586 if (mddev->reshape_position == MaxSector) {
- 3587 conf->prev = conf->geo;
- 3588 conf->reshape_progress = MaxSector;
- 3589 } else {
- 3590 if (setup_geo(&conf->prev, mddev, geo_old) != conf->copies) {
- 3591 err = -EINVAL;
- 3592 goto out;
- 3593 }
- 3594 conf->reshape_progress = mddev->reshape_position;
- 3595 if (conf->prev.far_offset)
- 3596 conf->prev.stride = 1 << conf->prev.chunk_shift;
- 3597 else
- 3598 /* far_copies must be 1 */
- 3599 conf->prev.stride = conf->dev_sectors;
- 3600 }
- 3601 spin_lock_init(&conf->device_lock);
- 3602 INIT_LIST_HEAD(&conf->retry_list);
- 3603
- 3604 spin_lock_init(&conf->resync_lock);
- 3605 init_waitqueue_head(&conf->wait_barrier);
- 3606
- 3607 conf->thread = md_register_thread(raid10d, mddev, "raid10");
- 3608 if (!conf->thread)
- 3609 goto out;
- 3610
- 3611 conf->mddev = mddev;
- 3612 return conf;
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 }
- 3468 static void calc_sectors(struct r10conf *conf, sector_t size)
- 3469 {
- 3470 /* Calculate the number of sectors-per-device that will
- 3471 * actually be used, and set conf->dev_sectors and
- 3472 * conf->stride
- 3473 */
- 3474
- 3475 size = size >> conf->geo.chunk_shift;
- 3476 sector_div(size, conf->geo.far_copies);
- 3477 size = size * conf->geo.raid_disks;
- 3478 sector_div(size, conf->geo.near_copies);
- 3479 /* 'size' is now the number of chunks in the array */
- 3480 /* calculate "used chunks per device" */
- 3481 size = size * conf->copies;
- 3482
- 3483 /* We need to round up when dividing by raid_disks to
- 3484 * get the stride size.
- 3485 */
- 3486 size = DIV_ROUND_UP_SECTOR_T(size, conf->geo.raid_disks);
- 3487
- 3488 conf->dev_sectors = size << conf->geo.chunk_shift;
- 3489
- 3490 if (conf->geo.far_offset)
- 3491 conf->geo.stride = 1 << conf->geo.chunk_shift;
- 3492 else {
- 3493 sector_div(size, conf->geo.far_copies);
- 3494 conf->geo.stride = size << conf->geo.chunk_shift;
- 3495 }
- 3496 }
linux内核奇遇记之md源代码解读之六相关推荐
- linux内核奇遇记之md源代码解读之八阵列同步二
linux内核奇遇记之md源代码解读之八阵列同步二 转载请注明出处:http://blog.csdn.net/liumangxiong 在上一小节里讲到启动同步线程: 7824 mddev->s ...
- linux内核奇遇记之md源代码解读之十二raid读写
linux内核奇遇记之md源代码解读之十二raid读写 转载请注明出处:http://blog.csdn.net/liumangxiong 我们都知道,对一个linux块设备来说,都有一个对应的请求队 ...
- 复制linux内核,linux内核写时复制机制源代码解读
作者简介 写时复制技术(一下简称COW)是linux内核比较重要的一种机制,我们都知道:父进程fork子进程的时候,子进程会和父进程会以只读的方式共享所有私有的可写页,当有一方将要写的时候会发生COW ...
- 高通linux内核目录,高通 android 源代码以及目标系统目录结构
下面为高通android源代码结构 build/ – Build 环境建立和makefiles生成4 bionic/ – Android C 库 dalvik/ – Android Java 虚拟机 ...
- xilinx linux内核,Xilinx-Zynq Linux内核源码编译过程
本文内容依据http://www.wiki.xilinx.com网址编写,编译所用操作系统为ubuntu 14 1.交叉编译环境的安装配置 2.uboot的编译 1)下载uboot源代码 下载uboo ...
- Linux内核调试方法【转】
转自:http://www.cnblogs.com/shineshqw/articles/2359114.html kdb:只能在汇编代码级进行调试: 优点是不需要两台机器进行调试. gdb:在调试模 ...
- Linux内核移植之一:内核源码结构与Makefile分析
内容来自 韦东山<嵌入式Linux应用开发完全手册> 一.内核介绍 1.版本及其特点 Linux内核的版本号可以从源代码的顶层目录下的Makefile中看到,比如下面几行它们构成了Linu ...
- linux 内核移植和根文件系统的制作【转载】
原文地址:http://www.cnblogs.com/hnrainll/archive/2011/06/09/2076214.html 1.1 Linux内核基础知识 在动手进行Linux内核移植之 ...
- linux内核源码lxr,配置glimpse与LXR读取linux内核源码
配置glimpse与LXR读取linux内核源码 1.安装 源代码编译glimpse sudo apt-get install flex sudo apt-get install lxr 2.设置Ap ...
- zynq linux内核出错,Xilinx Zynq Linux内核源码编译过程
1.交叉编译环境的安装配置 1) +Xilinx+Tools 2.uboot的编译 1)下载uboot源代码 下载uboot源代码,务必要下载tar.gz格式的文件,地址: https://githu ...
最新文章
- 学习Docker容器网络模型 - 搭建分布式Zookeeper集群
- 常见的水平居中布局方式
- v9更新栏目缓存提示PHP has encountered a Stack overflow解决方法
- mvdr波束形成原理_5G的“波束赋形”技术是什么东东?
- 群晖ffmpeg_群晖Video station支持DTS和EAC3
- 华为P50系列即将发布:麒麟9000E/9000处理器有戏?
- 我的 2020 总结:跌宕起伏
- Go语言中的单引号、双引号、反引号
- 百度换肤,表单全选案例
- 必看 | 机器视觉基础入门
- qpython3使用_用qpython3写一个最简单的发送短信的程序
- 模仿元气森林:为什么会是画虎画皮难画骨?
- 计算机学院考研动员大会,青春正当时,奋进当有为——学院顺利举办2018级考研动员大会...
- 概率论由相关性求数学期望和方差的公式_概率论与数理统计(马涛)第4章——数学期望与方差.ppt...
- 要想增加流量需要做的几点,淘宝运营新手必看的免费流量小知识
- 前端展示图片-处理图片拉伸
- 思岚科技Athena打破机器人底盘价格极限
- 图像处理中常用的彩色模型
- Hinton:胶囊网络的专利是我的了
- RISC-V 指令格式