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.

请求,所以这里就判断abort 请求必然要设置的一个flag 来判断.<br />

400 行,SkipForDisconnect,这也没啥说的,和前面的goto SkipForDisconnect 语句对应,如果要断开<br />

了,或者是一个命令执行完了,或者是abort 了,那么最终就是把us->srb 给置空.剩下两行的两把锁我们已<br />

经说过,会到最后统一来讲.<br />

406行,至此,这个守护进程就算是走了一遍了,for 循环继续,就像彼岸花,开一千年,落一千年,花叶永不相<br />

见.情不为因果,缘注定生死.不仅仅是曼珠和沙华一次次的跌入诅咒的轮回,其实世间万事万物都是轮回的,<br />

包括痛苦.<br />

最后的最后,只剩下422 这一行了,程序执行到这一行意味着for 循环结束了,而从for 循环的代码我们不<br />

难看出,结束for 循环的只有一句话,就是那句break,我们前面说过,它意味着模块要被卸载了.所以这里<br />

complete_and_exit()就是唤醒别人同时结束自己,于是这一刻,usb_stor_control_thread()也就正式<br />

结束了,也许对她来说,结束就是解脱吧.此情可待成追忆,只是当时已惘然.<br />

需要解释一下的是,complete_and_exit()这里唤醒的是谁?是usb_stor_release_resources(),为什<br />

么要唤醒,我们稍候讲到这个函数的时候再来看.而关于这个守护进程,我们也终于讲完了,其中的<br />

proto_handler()这两行,因为其重要性,我们单独挑出来讲.<br />

scsi 命令之我型我秀<br />

usb_stor_control_thread()基本讲完了,但是其中下面这几行,正是高潮中的高潮.所谓的Bulk 传输,<br />

所谓的Bulk-Only 协议.正是在这里体现出来的.<br />

372 /* we've got a command, let's do it! */<br />

373 else {<br />

374 US_DEBUG(usb_stor_show_command(us->srb));<br />

375 us->proto_handler(us->srb, us);<br />

376 }<br />

140<br />

所谓的US_DEBUG, 我们前面已经讲过,无非就是打印条是信息的.而眼下这句话就是执行<br />

usb_stor_show_command(us->srb)这个函数,鉴于这个函数是我们自己写的,而且有点意义,所以也就<br />

列出来.这个函数定义于drivers/usb/storage/debug.c 中,<br />

55 void usb_stor_show_command(struct scsi_cmnd *srb)<br />

56 {<br />

57 char *what = NULL;<br />

58 int i;<br />

59<br />

60 switch (srb->cmnd[0]) {<br />

61 case TEST_UNIT_READY: what = "TEST_UNIT_READY"; break;<br />

62 case REZERO_UNIT: what = "REZERO_UNIT"; break;<br />

63 case REQUEST_SENSE: what = "REQUEST_SENSE"; break;<br />

64 case FORMAT_UNIT: what = "FORMAT_UNIT"; break;<br />

65 case READ_BLOCK_LIMITS: what = "READ_BLOCK_LIMITS"; break;<br />

66 case REASSIGN_BLOCKS: what = "REASSIGN_BLOCKS"; break;<br />

67 case READ_6: what = "READ_6"; break;<br />

68 case WRITE_6: what = "WRITE_6"; break;<br />

69 case SEEK_6: what = "SEEK_6"; break;<br />

70 case READ_REVERSE: what = "READ_REVERSE"; break;

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

Saved successfully!

Ooh no, something went wrong!