📄 12.html
字号:
<a name='L233'> <a href='../S/74.html#L272' title='Defined at 272 in kernel/sched.c.'>wake_up</a> (&inode->i_wait);
<a name='L234'> <b>if</b> (--inode->i_count)
<a name='L235'> <b>return</b>;
<a name='L236'> <a href='../S/94.html#L130' title='Defined at 130 in mm/memory.c.'>free_page</a> (inode->i_size);
<a name='L237'> inode->i_count = 0;
<a name='L238'> inode->i_dirt = 0;
<a name='L239'> inode->i_pipe = 0;
<a name='L240'> <b>return</b>;
<a name='L241'> <font color='red'>}</font>
<a name='L242'><i><font color='green'>// 如果i 节点对应的设备号=0,则将此节点的引用计数递减1,返回。</font></i>
<a name='L243'> <b>if</b> (!inode->i_dev)
<a name='L244'> <font color='red'>{</font>
<a name='L245'> inode->i_count--;
<a name='L246'> <b>return</b>;
<a name='L247'> <font color='red'>}</font>
<a name='L248'><i><font color='green'>// 如果是块设备文件的i 节点,此时逻辑块字段0 中是设备号,则刷新该设备。并等待i 节点解锁。</font></i>
<a name='L249'> <b>if</b> (<a href='../S/43.html#L37' title='Defined at 37 in include/sys/stat.h.'>S_ISBLK</a> (inode->i_mode))
<a name='L250'> <font color='red'>{</font>
<a name='L251'> <a href='../S/6.html#L93' title='Defined at 93 in fs/buffer.c.'>sync_dev</a> (inode->i_zone[0]);
<a name='L252'> <a href='../S/12.html#L24' title='Defined at 24 in fs/inode.c.'>wait_on_inode</a> (inode);
<a name='L253'> <font color='red'>}</font>
<a name='L254'>repeat:
<a name='L255'><i><font color='green'>// 如果i 节点的引用计数大于1,则递减1。</font></i>
<a name='L256'> <b>if</b> (inode->i_count > 1)
<a name='L257'> <font color='red'>{</font>
<a name='L258'> inode->i_count--;
<a name='L259'> <b>return</b>;
<a name='L260'> <font color='red'>}</font>
<a name='L261'><i><font color='green'>// 如果i 节点的链接数为0,则释放该i 节点的所有逻辑块,并释放该i 节点。</font></i>
<a name='L262'> <b>if</b> (!inode->i_nlinks)
<a name='L263'> <font color='red'>{</font>
<a name='L264'> <a href='../S/20.html#L81' title='Defined at 81 in fs/truncate.c.'>truncate</a> (inode);
<a name='L265'> <a href='../S/4.html#L143' title='Defined at 143 in fs/bitmap.c.'>free_inode</a> (inode);
<a name='L266'> <b>return</b>;
<a name='L267'> <font color='red'>}</font>
<a name='L268'><i><font color='green'>// 如果该i 节点已作过修改,则更新该i 节点,并等待该i 节点解锁。</font></i>
<a name='L269'> <b>if</b> (inode->i_dirt)
<a name='L270'> <font color='red'>{</font>
<a name='L271'> <a href='../S/12.html#L452' title='Defined at 452 in fs/inode.c.'>write_inode</a> (inode); <i><font color='green'>/* we can sleep - so do again */</font></i>
<a name='L272'> <a href='../S/12.html#L24' title='Defined at 24 in fs/inode.c.'>wait_on_inode</a> (inode);
<a name='L273'> <b>goto</b> repeat;
<a name='L274'> <font color='red'>}</font>
<a name='L275'><i><font color='green'>// i 节点引用计数递减1。</font></i>
<a name='L276'> inode->i_count--;
<a name='L277'> <b>return</b>;
<a name='L278'><font color='red'>}</font>
<a name='L279'>
<a name='L280'><i><font color='green'>//// 从i 节点表(inode_table)中获取一个空闲i 节点项。</font></i>
<a name='L281'><i><font color='green'>// 寻找引用计数count 为0 的i 节点,并将其写盘后清零,返回其指针。</font></i>
<a name='L282'><b>struct</b> m_inode *
<a name='L283'><a href='../R/475.html' title='Multiple refered from 4 places.'>get_empty_inode</a> (<b>void</b>)
<a name='L284'><font color='red'>{</font>
<a name='L285'> <b>struct</b> m_inode *inode;
<a name='L286'> <b>static</b> <b>struct</b> m_inode *last_inode = inode_table; <i><font color='green'>// last_inode 指向i 节点表第一项。</font></i>
<a name='L287'> <b>int</b> <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>;
<a name='L288'>
<a name='L289'> <b>do</b>
<a name='L290'> <font color='red'>{</font>
<a name='L291'><i><font color='green'>// 扫描i 节点表。</font></i>
<a name='L292'> inode = <a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a>;
<a name='L293'> <b>for</b> (<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> = <a href='../S/31.html#L60' title='Defined at 60 in include/linux/fs.h.'>NR_INODE</a>; <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>; <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>--)
<a name='L294'> <font color='red'>{</font>
<a name='L295'><i><font color='green'>// 如果last_inode 已经指向i 节点表的最后1 项之后,则让其重新指向i 节点表开始处。</font></i>
<a name='L296'> <b>if</b> (++last_inode >= inode_table + <a href='../S/31.html#L60' title='Defined at 60 in include/linux/fs.h.'>NR_INODE</a>)
<a name='L297'> last_inode = inode_table;
<a name='L298'><i><font color='green'>// 如果last_inode 所指向的i 节点的计数值为0,则说明可能找到空闲i 节点项。让inode 指向</font></i>
<a name='L299'><i><font color='green'>// 该i 节点。如果该i 节点的已修改标志和锁定标志均为0,则我们可以使用该i 节点,于是退出循环。</font></i>
<a name='L300'> <b>if</b> (!last_inode->i_count)
<a name='L301'> <font color='red'>{</font>
<a name='L302'> inode = last_inode;
<a name='L303'> <b>if</b> (!inode->i_dirt && !inode->i_lock)
<a name='L304'> <b>break</b>;
<a name='L305'> <font color='red'>}</font>
<a name='L306'> <font color='red'>}</font>
<a name='L307'><i><font color='green'>// 如果没有找到空闲i 节点(inode=NULL),则将整个i 节点表打印出来供调试使用,并死机。</font></i>
<a name='L308'> <b>if</b> (!inode)
<a name='L309'> <font color='red'>{</font>
<a name='L310'> <b>for</b> (<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> = 0; <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> < <a href='../S/31.html#L60' title='Defined at 60 in include/linux/fs.h.'>NR_INODE</a>; <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>++)
<a name='L311'> <a href='../S/73.html#L30' title='Defined at 30 in kernel/printk.c.'>printk</a> ("%04x: %6d\t", inode_table[<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>].i_dev,
<a name='L312'> inode_table[<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>].i_num);
<a name='L313'> <a href='../S/72.html#L24' title='Defined at 24 in kernel/panic.c.'>panic</a> ("No free inodes in mem");
<a name='L314'> <font color='red'>}</font>
<a name='L315'><i><font color='green'>// 等待该i 节点解锁(如果又被上锁的话)。</font></i>
<a name='L316'> <a href='../S/12.html#L24' title='Defined at 24 in fs/inode.c.'>wait_on_inode</a> (inode);
<a name='L317'><i><font color='green'>// 如果该i 节点已修改标志被置位的话,则将该i 节点刷新,并等待该i 节点解锁。</font></i>
<a name='L318'> <b>while</b> (inode->i_dirt)
<a name='L319'> <font color='red'>{</font>
<a name='L320'> <a href='../S/12.html#L452' title='Defined at 452 in fs/inode.c.'>write_inode</a> (inode);
<a name='L321'> <a href='../S/12.html#L24' title='Defined at 24 in fs/inode.c.'>wait_on_inode</a> (inode);
<a name='L322'> <font color='red'>}</font>
<a name='L323'> <font color='red'>}</font>
<a name='L324'> <b>while</b> (inode->i_count); <i><font color='green'>// 如果i 节点又被其它占用的话,则重新寻找空闲i 节点。</font></i>
<a name='L325'><i><font color='green'>// 已找到空闲i 节点项。则将该i 节点项内容清零,并置引用标志为1,返回该i 节点指针。</font></i>
<a name='L326'> <a href='../S/42.html#L495' title='Defined at 495 in include/string.h.'>memset</a> (inode, 0, <b>sizeof</b> (*inode));
<a name='L327'> inode->i_count = 1;
<a name='L328'> <b>return</b> inode;
<a name='L329'><font color='red'>}</font>
<a name='L330'>
<a name='L331'><i><font color='green'>//// 获取管道节点。返回为i 节点指针(如果是NULL 则失败)。</font></i>
<a name='L332'><i><font color='green'>// 首先扫描i 节点表,寻找一个空闲i 节点项,然后取得一页空闲内存供管道使用。</font></i>
<a name='L333'><i><font color='green'>// 然后将得到的i 节点的引用计数置为2(读者和写者),初始化管道头和尾,置i 节点的管道类型表示。</font></i>
<a name='L334'><b>struct</b> m_inode *
<a name='L335'><a href='../R/484.html' title='Multiple refered from 2 places.'>get_pipe_inode</a> (<b>void</b>)
<a name='L336'><font color='red'>{</font>
<a name='L337'> <b>struct</b> m_inode *inode;
<a name='L338'>
<a name='L339'> <b>if</b> (!(inode = <a href='../S/12.html#L283' title='Defined at 283 in fs/inode.c.'>get_empty_inode</a> ())) <i><font color='green'>// 如果找不到空闲i 节点则返回NULL。</font></i>
<a name='L340'> <b>return</b> <a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a>;
<a name='L341'> <b>if</b> (!(inode->i_size = <a href='../S/94.html#L101' title='Defined at 101 in mm/memory.c.'>get_free_page</a> ()))
<a name='L342'> <font color='red'>{</font> <i><font color='green'>// 节点的i_size 字段指向缓冲区。</font></i>
<a name='L343'> inode->i_count = 0; <i><font color='green'>// 如果已没有空闲内存,则</font></i>
<a name='L344'> <b>return</b> <a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a>; <i><font color='green'>// 释放该i 节点,并返回NULL。</font></i>
<a name='L345'> <font color='red'>}</font>
<a name='L346'> inode->i_count = 2; <i><font color='green'>/* sum of readers/writers */</font></i><i><font color='green'>/* 读/写两者总计 */</font></i>
<a name='L347'> <a href='../S/31.html#L77' title='Defined at 77 in include/linux/fs.h.'>PIPE_HEAD</a> (*inode) = <a href='../S/31.html#L78' title='Defined at 78 in include/linux/fs.h.'>PIPE_TAIL</a> (*inode) = 0; <i><font color='green'>// 复位管道头尾指针。</font></i>
<a name='L348'> inode->i_pipe = 1; <i><font color='green'>// 置节点为管道使用的标志。</font></i>
<a name='L349'> <b>return</b> inode; <i><font color='green'>// 返回i 节点指针。</font></i>
<a name='L350'><font color='red'>}</font>
<a name='L351'>
<a name='L352'><i><font color='green'>//// 从设备上读取指定节点号的i 节点。</font></i>
<a name='L353'><i><font color='green'>// nr - i 节点号。</font></i>
<a name='L354'><b>struct</b> m_inode *
<a name='L355'><a href='../R/497.html' title='Multiple refered from 7 places.'>iget</a> (<b>int</b> dev, <b>int</b> nr)
<a name='L356'><font color='red'>{</font>
<a name='L357'> <b>struct</b> m_inode *inode, *empty;
<a name='L358'>
<a name='L359'> <b>if</b> (!<a href='../S/7.html#L136' title='Defined at 136 in fs/char_dev.c.'>dev</a>)
<a name='L360'> <a href='../S/72.html#L24' title='Defined at 24 in kernel/panic.c.'>panic</a> ("iget with dev==0");
<a name='L361'><i><font color='green'>// 从i 节点表中取一个空闲i 节点。</font></i>
<a name='L362'> empty = <a href='../S/12.html#L283' title='Defined at 283 in fs/inode.c.'>get_empty_inode</a> ();
<a name='L363'><i><font color='green'>// 扫描i 节点表。寻找指定节点号的i 节点。并递增该节点的引用次数。</font></i>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -