今天一直被一个问题所困扰,我在发bio的时候,打印了bi_sector,然后在bio的结束回调函数里面将bi_sector打印出来,发现它们始终不一样。还以为我们使用的结构有问题,最后查看内核代码,发现在bio_endio里面确实会改变bi_sector.
bio->bi_size -= bytes_done;
bio->bi_sector += (bytes_done >> 9);
其实仔细想想确实是有道理的,因为一个bio一次可能没有下发完成。那么第二次就要从新的位置(bi_sector改变),下发新的数量(bi_size改变)。
浪费一上午时间啊