linux内核md源代码解读 三 阵列建设的进程
|
这个函数很简单,根据超级块版本从磁盘上读入阵列超级块信息并保存到md_rdev->sb_page中,做一些基本的校验和检查,并将超级块信息保存到struct md_rdev结构中。到这里就返回到add_new_disk函数,5684行返回的rdev就含有从磁盘上加载的超级块信息。 5691行,由于阵列中还没有磁盘,所以list_empty(&mddev->disks)成立,不会进入if分支。 5706行,建立阵列struct mddev和磁盘struct md_rdev结构之间的联系,进函数:
2077 static int bind_rdev_to_array(struct md_rdev * rdev, struct mddev * mddev)
2078 {
2079 char b[BDEVNAME_SIZE];
2080 struct kobject *ko;
2081 char *s;
2082 int err;
2083
2084 if (rdev->mddev) {
2085 MD_BUG();
2086 return -EINVAL;
2087 }
2088
2089 /* prevent duplicates */
2090 if (find_rdev(mddev, rdev->bdev->bd_dev))
2091 return -EEXIST;
2092
2093 /* make sure rdev->sectors exceeds mddev->dev_sectors */
2094 if (rdev->sectors && (mddev->dev_sectors == 0 ||
2095 rdev->sectors < mddev->dev_sectors)) {
2096 if (mddev->pers) {
2097 /* Cannot change size, so fail
2098 * If mddev->level <= 0, then we don't care
2099 * about aligning sizes (e.g. linear)
2100 */
2101 if (mddev->level > 0)
2102 return -ENOSPC;
2103 } else
2104 mddev->dev_sectors = rdev->sectors;
2105 }
2106
2107 /* Verify rdev->desc_nr is unique.
2108 * If it is -1, assign a free number, else
2109 * check number is not in use
2110 */
2111 if (rdev->desc_nr < 0) {
2112 int choice = 0;
2113 if (mddev->pers) choice = mddev->raid_disks;
2114 while (find_rdev_nr(mddev, choice))
2115 choice++;
2116 rdev->desc_nr = choice;
2117 } else {
2118 if (find_rdev_nr(mddev, rdev->desc_nr))
2119 return -EBUSY;
2120 }
2121 if (mddev->max_disks && rdev->desc_nr >= mddev->max_disks) {
2122 printk(KERN_WARNING "md: %s: array is limited to %d devicesn",
2123 mdname(mddev), mddev->max_disks);
2124 return -EBUSY;
2125 }
2126 bdevname(rdev->bdev,b);
2127 while ( (s=strchr(b, '/')) != NULL)
2128 *s = '!';
2129
2130 rdev->mddev = mddev;
2131 printk(KERN_INFO "md: bind<%s>n", b);
2132
2133 if ((err = kobject_add(&rdev->kobj, &mddev->kobj, "dev-%s", b)))
2134 goto fail;
2135
2136 ko = &part_to_dev(rdev->bdev->bd_part)->kobj;
2137 if (sysfs_create_link(&rdev->kobj, ko, "block"))
2138 /* failure here is OK */;
2139 rdev->sysfs_state = sysfs_get_dirent_safe(rdev->kobj.sd, "state");
2140
2141 list_add_rcu(&rdev->same_set, &mddev->disks);
2142 bd_link_disk_holder(rdev->bdev, mddev->gendisk);
2143
2144 /* May as well allow recovery to be retried once */
2145 mddev->recovery_disabled++;
2146
2147 return 0;
2148
2149 fail:
2150 printk(KERN_WARNING "md: failed to register dev-%s for %sn",
2151 b, mdname(mddev));
2152 return err;
2153 }
2090行,检查是否磁盘已经加入阵列了,加过就不必重复添加。2094-2105行,比较磁盘大小,记录最小的磁盘空间。2111行,desc_nr分配,这个号只描述加入阵列的早晚。2130行,建立struct md_rdev到mddev的关联。2133-2139行,建立sysfs相关状态和链接。2141行,建立mddev到struct md_rdev的关联。add_new_disk就这么快结束了,简单地说就是创建struct md_rdev结构并与struct mddev结构之间创建联系。第三个命令字RUN_ARRAY的处理过程具有重要的意义,并且其过程不是三言两语能够说完的,我们把该命令字处理流程放到下一个小节单独来讲。 出处:http://blog.csdn.net/liumangxiong (编辑:宣城站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


