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