- 论坛徽章:
- 0
|
蠢东西,你不知道为什么下面这个函数是安全的是吗?哈哈...你真TM是一个kernel的newnewbit。没想到我一个封存半年的ID在CU上发的两贴浪费在你身上真TM是耻辱中的耻辱。
你的理解我都不好意思读下去,简直真是太白痴了。口口声声说自己喜欢面向过程的编程,但自己却对什么是过程都TM的不了解。明明自己在读UP的源码,思路却始终受到SMP的影响。
- 问题二
- static inline void sync_one(struct inode *inode, int sync)
- {
- while (inode->i_state & I_LOCK) {
- __iget(inode);
- spin_unlock(&inode_lock);
- __wait_on_inode(inode);
- iput(inode);
- spin_lock(&inode_lock);
- }
- __sync_one(inode, sync);
- }
- iput在i_count==0时会通过write_inode_now调用这个函数,但是在调用这个函数时,并不一定i_count>0,也许i_count=0. 因为调用write_inode_now之前,已经释放了自旋锁,使其他CPU通过hash得到本inode成为可能
- i_count=0时,SMP上另一进程在kupdate的话,会设置这个i_state为I_LOCK,所以本函数再次iget,然后又iput,
- 在这之间__wait_on_inode的时候,也许另一进程iget到这个inode,对其操作,然后把它标记为I_DIRTY
- ,在i_count==2时调用iput,结束对这个inode的使用,这时i_count==1
- 终于轮到__wait_on_inode(inode)被唤醒再次运行,这个函数在i_count==1时马上又iput,在write_inode_now时,并不持有自旋锁,并不排除SMP上运行kupdate进程的可能,因此这个inode又是I_LOCK,而i_count==0,所以又需要再次iget,iput,这样下去,进程不挂掉??????
复制代码
你感觉discard_buffer()会释放掉buffer,而后在try_to_free_buffers()中会再次释放,只能说明你更加白痴。
本来是想发两贴,点回贴的时候点成编辑了,把以前的贴子覆盖了。哈哈...不过没关系。让大家知道你是多么白痴就可以了。
[ 本帖最后由 secworld 于 2006-12-19 16:51 编辑 ] |
|