📄 12.html
字号:
<a name='L364'> inode = inode_table;
<a name='L365'> <b>while</b> (inode < <a href='../S/31.html#L60' title='Defined at 60 in include/linux/fs.h.'>NR_INODE</a> + inode_table)
<a name='L366'> <font color='red'>{</font>
<a name='L367'><i><font color='green'>// 如果当前扫描的i 节点的设备号不等于指定的设备号或者节点号不等于指定的节点号,则继续扫描。</font></i>
<a name='L368'> <b>if</b> (inode->i_dev != <a href='../S/7.html#L136' title='Defined at 136 in fs/char_dev.c.'>dev</a> || inode->i_num != nr)
<a name='L369'> <font color='red'>{</font>
<a name='L370'> inode++;
<a name='L371'> <b>continue</b>;
<a name='L372'> <font color='red'>}</font>
<a name='L373'><i><font color='green'>// 找到指定设备号和节点号的i 节点,等待该节点解锁(如果已上锁的话)。</font></i>
<a name='L374'> <a href='../S/12.html#L24' title='Defined at 24 in fs/inode.c.'>wait_on_inode</a> (inode);
<a name='L375'><i><font color='green'>// 在等待该节点解锁的阶段,节点表可能会发生变化,所以再次判断,如果发生了变化,则再次重新</font></i>
<a name='L376'><i><font color='green'>// 扫描整个i 节点表。</font></i>
<a name='L377'> <b>if</b> (inode->i_dev != <a href='../S/7.html#L136' title='Defined at 136 in fs/char_dev.c.'>dev</a> || inode->i_num != nr)
<a name='L378'> <font color='red'>{</font>
<a name='L379'> inode = inode_table;
<a name='L380'> <b>continue</b>;
<a name='L381'> <font color='red'>}</font>
<a name='L382'><i><font color='green'>// 将该i 节点引用计数增1。</font></i>
<a name='L383'> inode->i_count++;
<a name='L384'> <b>if</b> (inode->i_mount)
<a name='L385'> <font color='red'>{</font>
<a name='L386'> <b>int</b> <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>;
<a name='L387'>
<a name='L388'><i><font color='green'>// 如果该i 节点是其它文件系统的安装点,则在超级块表中搜寻安装在此i 节点的超级块。如果没有</font></i>
<a name='L389'><i><font color='green'>// 找到,则显示出错信息,并释放函数开始获取的空闲节点,返回该i 节点指针。</font></i>
<a name='L390'> <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#L62' title='Defined at 62 in include/linux/fs.h.'>NR_SUPER</a>; <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>++)
<a name='L391'> <b>if</b> (super_block[<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>].s_imount == inode)
<a name='L392'> <b>break</b>;
<a name='L393'> <b>if</b> (<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> >= <a href='../S/31.html#L62' title='Defined at 62 in include/linux/fs.h.'>NR_SUPER</a>)
<a name='L394'> <font color='red'>{</font>
<a name='L395'> <a href='../S/73.html#L30' title='Defined at 30 in kernel/printk.c.'>printk</a> ("Mounted inode hasn't got sb\n");
<a name='L396'> <b>if</b> (empty)
<a name='L397'> <a href='../S/12.html#L221' title='Defined at 221 in fs/inode.c.'>iput</a> (empty);
<a name='L398'> <b>return</b> inode;
<a name='L399'> <font color='red'>}</font>
<a name='L400'><i><font color='green'>// 将该i 节点写盘。从安装在此i 节点文件系统的超级块上取设备号,并令i 节点号为1。然后重新</font></i>
<a name='L401'><i><font color='green'>// 扫描整个i 节点表,取该被安装文件系统的根节点。</font></i>
<a name='L402'> <a href='../S/12.html#L221' title='Defined at 221 in fs/inode.c.'>iput</a> (inode);
<a name='L403'> <a href='../S/7.html#L136' title='Defined at 136 in fs/char_dev.c.'>dev</a> = super_block[<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>].s_dev;
<a name='L404'> nr = <a href='../S/31.html#L53' title='Defined at 53 in include/linux/fs.h.'>ROOT_INO</a>;
<a name='L405'> inode = inode_table;
<a name='L406'> <b>continue</b>;
<a name='L407'> <font color='red'>}</font>
<a name='L408'><i><font color='green'>// 已经找到相应的i 节点,因此放弃临时申请的空闲节点,返回该找到的i 节点。</font></i>
<a name='L409'> <b>if</b> (empty)
<a name='L410'> <a href='../S/12.html#L221' title='Defined at 221 in fs/inode.c.'>iput</a> (empty);
<a name='L411'> <b>return</b> inode;
<a name='L412'> <font color='red'>}</font>
<a name='L413'><i><font color='green'>// 如果在i 节点表中没有找到指定的i 节点,则利用前面申请的空闲i 节点在i 节点表中建立该节点。</font></i>
<a name='L414'><i><font color='green'>// 并从相应设备上读取该i 节点信息。返回该i 节点。</font></i>
<a name='L415'> <b>if</b> (!empty)
<a name='L416'> <b>return</b> (<a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a>);
<a name='L417'> inode = empty;
<a name='L418'> inode->i_dev = <a href='../S/7.html#L136' title='Defined at 136 in fs/char_dev.c.'>dev</a>;
<a name='L419'> inode->i_num = nr;
<a name='L420'> <a href='../S/12.html#L426' title='Defined at 426 in fs/inode.c.'>read_inode</a> (inode);
<a name='L421'> <b>return</b> inode;
<a name='L422'><font color='red'>}</font>
<a name='L423'>
<a name='L424'><i><font color='green'>//// 从设备上读取指定i 节点的信息到内存中(缓冲区中)。</font></i>
<a name='L425'><b>static</b> <b>void</b>
<a name='L426'><a href='../R/562.html' title='Multiple refered from 2 places.'>read_inode</a> (<b>struct</b> m_inode *inode)
<a name='L427'><font color='red'>{</font>
<a name='L428'> <b>struct</b> super_block *sb;
<a name='L429'> <b>struct</b> buffer_head *bh;
<a name='L430'> <b>int</b> block;
<a name='L431'>
<a name='L432'><i><font color='green'>// 首先锁定该i 节点,取该节点所在设备的超级块。</font></i>
<a name='L433'> <a href='../S/12.html#L35' title='Defined at 35 in fs/inode.c.'>lock_inode</a> (inode);
<a name='L434'> <b>if</b> (!(sb = <a href='../S/19.html#L76' title='Defined at 76 in fs/super.c.'>get_super</a> (inode->i_dev)))
<a name='L435'> <a href='../S/72.html#L24' title='Defined at 24 in kernel/panic.c.'>panic</a> ("trying to read inode without dev");
<a name='L436'><i><font color='green'>// 该i 节点所在的逻辑块号 = (启动块+超级块) + i 节点位图占用的块数 + 逻辑块位图占用的块数 +</font></i>
<a name='L437'><i><font color='green'>// (i 节点号-1)/每块含有的i 节点数。</font></i>
<a name='L438'> block = 2 + sb->s_imap_blocks + sb->s_zmap_blocks +
<a name='L439'> (inode->i_num - 1) / <a href='../S/31.html#L72' title='Defined at 72 in include/linux/fs.h.'>INODES_PER_BLOCK</a>;
<a name='L440'><i><font color='green'>// 从设备上读取该i 节点所在的逻辑块,并将该inode 指针指向对应i 节点信息。</font></i>
<a name='L441'> <b>if</b> (!(bh = <a href='../S/6.html#L397' title='Defined at 397 in fs/buffer.c.'>bread</a> (inode->i_dev, block)))
<a name='L442'> <a href='../S/72.html#L24' title='Defined at 24 in kernel/panic.c.'>panic</a> ("unable to read i-node block");
<a name='L443'> *(<b>struct</b> d_inode *) inode =
<a name='L444'> ((<b>struct</b> d_inode *) bh->b_data)[(inode->i_num - 1) % <a href='../S/31.html#L72' title='Defined at 72 in include/linux/fs.h.'>INODES_PER_BLOCK</a>];
<a name='L445'><i><font color='green'>// 最后释放读入的缓冲区,并解锁该i 节点。</font></i>
<a name='L446'> <a href='../S/6.html#L377' title='Defined at 377 in fs/buffer.c.'>brelse</a> (bh);
<a name='L447'> <a href='../S/12.html#L47' title='Defined at 47 in fs/inode.c.'>unlock_inode</a> (inode);
<a name='L448'><font color='red'>}</font>
<a name='L449'>
<a name='L450'><i><font color='green'>//// 将指定i 节点信息写入设备(写入缓冲区相应的缓冲块中,待缓冲区刷新时会写入盘中)。</font></i>
<a name='L451'><b>static</b> <b>void</b>
<a name='L452'><a href='../R/735.html' title='Multiple refered from 4 places.'>write_inode</a> (<b>struct</b> m_inode *inode)
<a name='L453'><font color='red'>{</font>
<a name='L454'> <b>struct</b> super_block *sb;
<a name='L455'> <b>struct</b> buffer_head *bh;
<a name='L456'> <b>int</b> block;
<a name='L457'>
<a name='L458'><i><font color='green'>// 首先锁定该i 节点,如果该i 节点没有被修改过或者该i 节点的设备号等于零,则解锁该i 节点,</font></i>
<a name='L459'><i><font color='green'>// 并退出。</font></i>
<a name='L460'> <a href='../S/12.html#L35' title='Defined at 35 in fs/inode.c.'>lock_inode</a> (inode);
<a name='L461'> <b>if</b> (!inode->i_dirt || !inode->i_dev)
<a name='L462'> <font color='red'>{</font>
<a name='L463'> <a href='../S/12.html#L47' title='Defined at 47 in fs/inode.c.'>unlock_inode</a> (inode);
<a name='L464'> <b>return</b>;
<a name='L465'> <font color='red'>}</font>
<a name='L466'><i><font color='green'>// 获取该i 节点的超级块。</font></i>
<a name='L467'> <b>if</b> (!(sb = <a href='../S/19.html#L76' title='Defined at 76 in fs/super.c.'>get_super</a> (inode->i_dev)))
<a name='L468'> <a href='../S/72.html#L24' title='Defined at 24 in kernel/panic.c.'>panic</a> ("trying to write inode without device");
<a name='L469'><i><font color='green'>// 该i 节点所在的逻辑块号 = (启动块+超级块) + i 节点位图占用的块数 + 逻辑块位图占用的块数 +</font></i>
<a name='L470'><i><font color='green'>// (i 节点号-1)/每块含有的i 节点数。</font></i>
<a name='L471'> block = 2 + sb->s_imap_blocks + sb->s_zmap_blocks +
<a name='L472'> (inode->i_num - 1) / <a href='../S/31.html#L72' title='Defined at 72 in include/linux/fs.h.'>INODES_PER_BLOCK</a>;
<a name='L473'><i><font color='green'>// 从设备上读取该i 节点所在的逻辑块。</font></i>
<a name='L474'> <b>if</b> (!(bh = <a href='../S/6.html#L397' title='Defined at 397 in fs/buffer.c.'>bread</a> (inode->i_dev, block)))
<a name='L475'> <a href='../S/72.html#L24' title='Defined at 24 in kernel/panic.c.'>panic</a> ("unable to read i-node block");
<a name='L476'><i><font color='green'>// 将该i 节点信息复制到逻辑块对应该i 节点的项中。</font></i>
<a name='L477'> ((<b>struct</b> d_inode *) bh->b_data)
<a name='L478'> [(inode->i_num - 1) % <a href='../S/31.html#L72' title='Defined at 72 in include/linux/fs.h.'>INODES_PER_BLOCK</a>] = *(<b>struct</b> d_inode *) inode;
<a name='L479'><i><font color='green'>// 置缓冲区已修改标志,而i 节点修改标志置零。然后释放该含有i 节点的缓冲区,并解锁该i 节点。</font></i>
<a name='L480'> bh->b_dirt = 1;
<a name='L481'> inode->i_dirt = 0;
<a name='L482'> <a href='../S/6.html#L377' title='Defined at 377 in fs/buffer.c.'>brelse</a> (bh);
<a name='L483'> <a href='../S/12.html#L47' title='Defined at 47 in fs/inode.c.'>unlock_inode</a> (inode);
<a name='L484'><font color='red'>}</font>
</pre>
<hr>
<a name='BOTTOM'>
<i><font color='green'>/* [<][>]<a href='#L24'>[^]</a><a href='#L452'>[v]</a><a href='#TOP'>[top]</a>[bottom]<a href='../mains.html'>[index]</a><a href='../help.html'>[help]</a> */</font></i>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -