07.06.2013 Views

Scsi - Index of

Scsi - Index of

Scsi - Index of

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

一下子进程,稍候马上去看父进程.<br />

301 行,一个for 语句死循环,尽管外面的世界很精彩,但是咱们去看看for 里面的世界也不妨.<br />

303 行,down_interruptible()函数,事实上302 行的注释已经告诉咱们,thread 将进入睡眠了...,也许<br />

她累了.down_interruptible 的参数是&us->sema,不陌生吧,我们之前讲信号量讲互斥锁的时候就已经<br />

提过了us->sema.所以这里很简单,就是想获得这把锁,但是别忘了,我们当初就介绍过,这把锁一开始就被<br />

初始化为0 了,也就是说它属于那种指腹为婚的情形,一到这个世界来就告诉别人自己已经是名花有主了.<br />

因<br />

114<br />

此,这里只能进入睡眠,等待一个up()函数去释放锁.谁会调用up()函数呢?暂时先不管它,我们先关注一下<br />

父进程,毕竟我们自己进入了睡眠,而之前我们把父进程唤醒了.<br />

彼岸花的传说(三)<br />

遥想公瑾当年,小乔出嫁了,雄姿英发.<br />

羽扇纶巾,谈笑间,樯橹灰飞烟灭.<br />

故国神游,多情应笑我,早生华发,<br />

人生如梦,一樽还酹江月.<br />

的确,人生如梦,设计Linux 代码的人想必非常认可这种观点,因为他们已然把这种思想融入到了代码中去,<br />

所以在代码里我们常看到睡眠,唤醒,睡眠,唤醒...而作为当年的大学生,Linus 想必也很认同大学生活的现<br />

状,即大学生活就是睡觉,只是有的人两个人睡,有的人一个人睡.<br />

前面已经说了,父进程在函数usb_stor_acquire_resources()里边,810<br />

行,wait_for_completion(&(us->notify)),进入睡眠,而刚才咱们在子进程里已经看<br />

到,complete(&(us->notify))被调用,于是父进程被唤醒,回到usb_stor_acquire_resources()函数中,<br />

往下走,812 行,无它,唯返回耳.返回了0.于是咱们终于回到了storage_probe()函数中来.<br />

1001 行,scsi_add_host()函数被执行,之前申请的us->host 被作为参数传递给她,同时,intf->dev 也<br />

被传递给她,这个冬冬是被用来注册sysfs 的.在scsi_host_alloc 之后,必须执行scsi_add_host(),这<br />

样,scsi 核心层才能够知道有这么一个host 存在.scsi_add_host()成功则返回0,否则返回出错代码.如果<br />

一切顺利,咱们将走到1009 行,别急,先把代码贴出来,这就是storage_probe()函数的最后一小段了:<br />

1007<br />

1008 /* Start up the thread for delayed SCSI-device scanning */<br />

1009 result = kernel_thread(usb_stor_scan_thread, us, CLONE_VM);<br />

1010 if (result < 0) {<br />

1011 printk(KERN_WARNING USB_STORAGE<br />

1012 "Unable to start the device-scanning thread\n");<br />

1013 scsi_remove_host(us->host);<br />

1014 goto BadDevice;<br />

1015 }<br />

1016<br />

1017 return 0;<br />

1018<br />

1019 /* We come here if there are any problems */<br />

1020 BadDevice:<br />

1021 US_DEBUGP("storage_probe() failed\n");<br />

1022 usb_stor_release_resources(us);

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

Saved successfully!

Ooh no, something went wrong!