07.06.2013 Views

Scsi - Index of

Scsi - Index of

Scsi - Index of

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

如<br />

321 /* has the command timed out *already* ? */<br />

322 if (test_bit(US_FLIDX_TIMED_OUT, &us->flags)) {<br />

323 us->srb->result = DID_ABORT scsi_lock(host);<br />

324 goto SkipForAbort;<br />

这样改动代码也可以,显得更加严谨,不过改不改意义并不大.<br />

当然,这一段测试超时的代码本身被使用上的可能性也不大,因为这里命令还没有开始执行呢,试想,一个<br />

命令还没有开始就超时,这种情况论几率,和中国国家男足杀进世界杯差不多吧.<br />

再来看第二组,关于us->dev_semaphore,它更多的体现出来是一种进程间的同步机制.2.6.10 的内核<br />

代码中一共有6 处使用了这个信号量.分别是在device_reset()中,bus_reset()<br />

中,usb_stor_control_thread()中,usb_stor_acquire_resources()<br />

中,usb_stor_release_resources()中,storage_disconnect()中.这几样东西之间是存在一种相互制约<br />

的关系.<br />

201<br />

比如,一种情景是,在device_reset()或者bus_reset()中上了锁,所以usb_stor_control_thread()这<br />

边就不可以在这个时候执行命令,usb_stor_acquire_resources()中的GET_MAX_LUN 也不能执行,因<br />

为很显然,正在reset 呢,就好比你的电脑正在重起你当然不可能执行一个打开浏览器的操作.<br />

而另一种情景,当usb_stor_control_thread()正在执行命令,那么当然<br />

usb_stor_release_resources()函数就不能释放资源了,甚至storage_disconnect()也得等待,得等你<br />

当前这个命令执行完了,它才会去执行断开的代码.就好比你正在考场上战战兢兢的答题,老师却强行把你的<br />

试卷收上去,你说你会不会很愤怒?(当然,如果是因为你作弊被发现,那就另当别论了.)<br />

总之,这种关系都是相互的,相互制约,同时也保证了整个系统正常运转,如果谁违规了,那么伤害的是大家<br />

的利益.这就是Linux 内核的同步机制.<br />

好了.我的故事讲完了.蓦然回首, 发现, 其实, 我一直在寻觅, 寻觅这个故事的结局, 寻觅自己灵魂的出<br />

路, 最终, 追寻到了前者, 却一直没有找到后者.<br />

__

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!