没有任何问题。在周期性检测中,会设置所有slave的状态:
bond_for_each_slave(bond, slave, i) { link_state = bond_check_dev_link(bond, slave->dev, 0); switch (slave->link) { |
到底哪里出了问题??为何一块物理网卡明明是没有插线的,却没有调到bond_set_carrier最后面的netif_carrier_off,原因很显然了,因为netif_carrier_ok判断没有通过,为何没有通过,原因在于bonding自创建之日,其state根本就没有涉及__LINK_STATE_NOCARRIER这个bit的初始化!什么?这等错误竟然在内核里面出现!改了它便是,在bond_open的最后,return 0之前,加上一句:
netif_carrier_on(bond->dev); |
即可修正这个错误。另外要修改的是bond_set_carrier函数:
if (bond->slave_cnt == 0) goto down; 如果slave_cnt为0,那么就要调用netif_carrier_on将bonding拉起来,以便于后面往其加入新的slave,那么上述语句改为: if (bond->slave_cnt == 0) { netif_carrier_on(bond->dev) goto down; } |
关于这个修改,我只是为了保险起见,实质上并无必要,到底有没有必要进行这个修改,我并没有实测过,话说只要初始状态正确,后面的只是按照既有的逻辑来过,不可能有任何问题,话虽如此,可我还是不信任kernel社区的这帮人,要不然怎么会忘记初始化carrier状态呢?
插曲:
这个问题是我项目中遇到的,因为要赶工期,领导决定先把这个问题放一下,抓紧主要问题解决,我因此也和领导有了一次冲突,因为我觉得做一个产品,真的就需要完美无缺,不能有遗留问题等到用户真的需要的时候再解决,宁可延期也要完美,这是我的逻辑,至于说我为何没有把这事情分发下去,是因为到了产品发布的最后关头,正如领导说的,谁熟悉什么谁做什么,我自认为在项目组对网络,对kernel比较熟悉,因此这个问题只有我能快速解决,如果说我因为解决这个问题而耽误了项目进度,那是我的错,因此我选择在工作时间外加班解决它,这是我回到家里搞定的,也只能这样才能保证产品的按期发布。关键问题是,到底应该以产品发布的时间点为准呢还是应该以产品的完美程度为准。我选择后者,你们呢?