⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 12.html

📁 linux 0.11中文版 有注释
💻 HTML
📖 第 1 页 / 共 4 页
字号:
<a name='L364'>  inode = inode_table;
<a name='L365'>  <b>while</b> (inode &lt; <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-&gt;i_dev != <a href='../S/7.html#L136' title='Defined at 136 in fs/char_dev.c.'>dev</a> || inode-&gt;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-&gt;i_dev != <a href='../S/7.html#L136' title='Defined at 136 in fs/char_dev.c.'>dev</a> || inode-&gt;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-&gt;i_count++;
<a name='L384'>      <b>if</b> (inode-&gt;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> &lt; <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> &gt;= <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-&gt;i_dev = <a href='../S/7.html#L136' title='Defined at 136 in fs/char_dev.c.'>dev</a>;
<a name='L419'>  inode-&gt;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-&gt;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-&gt;s_imap_blocks + sb-&gt;s_zmap_blocks +
<a name='L439'>    (inode-&gt;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-&gt;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-&gt;b_data)[(inode-&gt;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-&gt;i_dirt || !inode-&gt;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-&gt;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-&gt;s_imap_blocks + sb-&gt;s_zmap_blocks +
<a name='L472'>    (inode-&gt;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-&gt;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-&gt;b_data)
<a name='L478'>    [(inode-&gt;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-&gt;b_dirt = 1;
<a name='L481'>  inode-&gt;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'>/* [&lt;][&gt;]<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 + -