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

📄 12.html

📁 linux 0.11中文版 有注释
💻 HTML
📖 第 1 页 / 共 4 页
字号:
<a name='L102'>  <b>if</b> (block &lt; 0)
<a name='L103'>    <a href='../S/72.html#L24' title='Defined at 24 in kernel/panic.c.'>panic</a> ("_bmap: block&lt;0");
<a name='L104'><i><font color='green'>// 如果块号大于直接块数 + 间接块数 + 二次间接块数,超出文件系统表示范围,则死机。</font></i>
<a name='L105'>  <b>if</b> (block &gt;= 7 + 512 + 512 * 512)
<a name='L106'>    <a href='../S/72.html#L24' title='Defined at 24 in kernel/panic.c.'>panic</a> ("_bmap: block&gt;big");
<a name='L107'><i><font color='green'>// 如果该块号小于7,则使用直接块表示。</font></i>
<a name='L108'>  <b>if</b> (block &lt; 7)
<a name='L109'>    <font color='red'>{</font>
<a name='L110'><i><font color='green'>// 如果创建标志置位,并且i 节点中对应该块的逻辑块(区段)字段为0,则向相应设备申请一磁盘</font></i>
<a name='L111'><i><font color='green'>// 块(逻辑块,区块),并将盘上逻辑块号(盘块号)填入逻辑块字段中。然后设置i 节点修改时间,</font></i>
<a name='L112'><i><font color='green'>// 置i 节点已修改标志。最后返回逻辑块号。</font></i>
<a name='L113'>      <b>if</b> (create &amp;&amp; !inode-&gt;i_zone[block])
<a name='L114'>        <b>if</b> (inode-&gt;i_zone[block] = <a href='../S/4.html#L99' title='Defined at 99 in fs/bitmap.c.'>new_block</a> (inode-&gt;i_dev))
<a name='L115'>          <font color='red'>{</font>
<a name='L116'>            inode-&gt;i_ctime = <a href='../S/36.html#L234' title='Defined at 234 in include/linux/sched.h.'>CURRENT_TIME</a>;
<a name='L117'>            inode-&gt;i_dirt = 1;
<a name='L118'>          <font color='red'>}</font>
<a name='L119'>      <b>return</b> inode-&gt;i_zone[block];
<a name='L120'>    <font color='red'>}</font>
<a name='L121'><i><font color='green'>// 如果该块号&gt;=7,并且小于7+512,则说明是一次间接块。下面对一次间接块进行处理。</font></i>
<a name='L122'>  block -= 7;
<a name='L123'>  <b>if</b> (block &lt; 512)
<a name='L124'>    <font color='red'>{</font>
<a name='L125'><i><font color='green'>// 如果是创建,并且该i 节点中对应间接块字段为0,表明文件是首次使用间接块,则需申请</font></i>
<a name='L126'><i><font color='green'>// 一磁盘块用于存放间接块信息,并将此实际磁盘块号填入间接块字段中。然后设置i 节点</font></i>
<a name='L127'><i><font color='green'>// 已修改标志和修改时间。</font></i>
<a name='L128'>      <b>if</b> (create &amp;&amp; !inode-&gt;i_zone[7])
<a name='L129'>        <b>if</b> (inode-&gt;i_zone[7] = <a href='../S/4.html#L99' title='Defined at 99 in fs/bitmap.c.'>new_block</a> (inode-&gt;i_dev))
<a name='L130'>          <font color='red'>{</font>
<a name='L131'>            inode-&gt;i_dirt = 1;
<a name='L132'>            inode-&gt;i_ctime = <a href='../S/36.html#L234' title='Defined at 234 in include/linux/sched.h.'>CURRENT_TIME</a>;
<a name='L133'>          <font color='red'>}</font>
<a name='L134'><i><font color='green'>// 若此时i 节点间接块字段中为0,表明申请磁盘块失败,返回0 退出。</font></i>
<a name='L135'>      <b>if</b> (!inode-&gt;i_zone[7])
<a name='L136'>        <b>return</b> 0;
<a name='L137'><i><font color='green'>// 读取设备上的一次间接块。</font></i>
<a name='L138'>      <b>if</b> (!(bh = <a href='../S/6.html#L397' title='Defined at 397 in fs/buffer.c.'>bread</a> (inode-&gt;i_dev, inode-&gt;i_zone[7])))
<a name='L139'>        <b>return</b> 0;
<a name='L140'><i><font color='green'>// 取该间接块上第block 项中的逻辑块号(盘块号)。</font></i>
<a name='L141'>      <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> = ((<b>unsigned</b> <b>short</b> *) (bh-&gt;b_data))[block];
<a name='L142'><i><font color='green'>// 如果是创建并且间接块的第block 项中的逻辑块号为0 的话,则申请一磁盘块(逻辑块),并让</font></i>
<a name='L143'><i><font color='green'>// 间接块中的第block 项等于该新逻辑块块号。然后置位间接块的已修改标志。</font></i>
<a name='L144'>      <b>if</b> (create &amp;&amp; !<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>)
<a name='L145'>        <b>if</b> (<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> = <a href='../S/4.html#L99' title='Defined at 99 in fs/bitmap.c.'>new_block</a> (inode-&gt;i_dev))
<a name='L146'>          <font color='red'>{</font>
<a name='L147'>            ((<b>unsigned</b> <b>short</b> *) (bh-&gt;b_data))[block] = <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>;
<a name='L148'>            bh-&gt;b_dirt = 1;
<a name='L149'>          <font color='red'>}</font>
<a name='L150'><i><font color='green'>// 最后释放该间接块,返回磁盘上新申请的对应block 的逻辑块的块号。</font></i>
<a name='L151'>      <a href='../S/6.html#L377' title='Defined at 377 in fs/buffer.c.'>brelse</a> (bh);
<a name='L152'>      <b>return</b> <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>;
<a name='L153'>    <font color='red'>}</font>
<a name='L154'><i><font color='green'>// 程序运行到此,表明数据块是二次间接块,处理过程与一次间接块类似。下面是对二次间接块的处理。</font></i>
<a name='L155'><i><font color='green'>// 将block 再减去间接块所容纳的块数(512)。</font></i>
<a name='L156'>  block -= 512;
<a name='L157'><i><font color='green'>// 如果是新创建并且i 节点的二次间接块字段为0,则需申请一磁盘块用于存放二次间接块的一级块</font></i>
<a name='L158'><i><font color='green'>// 信息,并将此实际磁盘块号填入二次间接块字段中。之后,置i 节点已修改编制和修改时间。</font></i>
<a name='L159'>  <b>if</b> (create &amp;&amp; !inode-&gt;i_zone[8])
<a name='L160'>    <b>if</b> (inode-&gt;i_zone[8] = <a href='../S/4.html#L99' title='Defined at 99 in fs/bitmap.c.'>new_block</a> (inode-&gt;i_dev))
<a name='L161'>      <font color='red'>{</font>
<a name='L162'>        inode-&gt;i_dirt = 1;
<a name='L163'>        inode-&gt;i_ctime = <a href='../S/36.html#L234' title='Defined at 234 in include/linux/sched.h.'>CURRENT_TIME</a>;
<a name='L164'>      <font color='red'>}</font>
<a name='L165'><i><font color='green'>// 若此时i 节点二次间接块字段为0,表明申请磁盘块失败,返回0 退出。</font></i>
<a name='L166'>  <b>if</b> (!inode-&gt;i_zone[8])
<a name='L167'>    <b>return</b> 0;
<a name='L168'><i><font color='green'>// 读取该二次间接块的一级块。</font></i>
<a name='L169'>  <b>if</b> (!(bh = <a href='../S/6.html#L397' title='Defined at 397 in fs/buffer.c.'>bread</a> (inode-&gt;i_dev, inode-&gt;i_zone[8])))
<a name='L170'>    <b>return</b> 0;
<a name='L171'><i><font color='green'>// 取该二次间接块的一级块上第(block/512)项中的逻辑块号。</font></i>
<a name='L172'>  <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> = ((<b>unsigned</b> <b>short</b> *) bh-&gt;b_data)[block &gt;&gt; 9];
<a name='L173'><i><font color='green'>// 如果是创建并且二次间接块的一级块上第(block/512)项中的逻辑块号为0 的话,则需申请一磁盘</font></i>
<a name='L174'><i><font color='green'>// 块(逻辑块)作为二次间接块的二级块,并让二次间接块的一级块中第(block/512)项等于该二级</font></i>
<a name='L175'><i><font color='green'>// 块的块号。然后置位二次间接块的一级块已修改标志。并释放二次间接块的一级块。</font></i>
<a name='L176'>  <b>if</b> (create &amp;&amp; !<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>)
<a name='L177'>    <b>if</b> (<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> = <a href='../S/4.html#L99' title='Defined at 99 in fs/bitmap.c.'>new_block</a> (inode-&gt;i_dev))
<a name='L178'>      <font color='red'>{</font>
<a name='L179'>        ((<b>unsigned</b> <b>short</b> *) (bh-&gt;b_data))[block &gt;&gt; 9] = <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>;
<a name='L180'>        bh-&gt;b_dirt = 1;
<a name='L181'>      <font color='red'>}</font>
<a name='L182'>  <a href='../S/6.html#L377' title='Defined at 377 in fs/buffer.c.'>brelse</a> (bh);
<a name='L183'><i><font color='green'>// 如果二次间接块的二级块块号为0,表示申请磁盘块失败,返回0 退出。</font></i>
<a name='L184'>  <b>if</b> (!<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>)
<a name='L185'>    <b>return</b> 0;
<a name='L186'><i><font color='green'>// 读取二次间接块的二级块。</font></i>
<a name='L187'>  <b>if</b> (!(bh = <a href='../S/6.html#L397' title='Defined at 397 in fs/buffer.c.'>bread</a> (inode-&gt;i_dev, <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>)))
<a name='L188'>    <b>return</b> 0;
<a name='L189'><i><font color='green'>// 取该二级块上第block 项中的逻辑块号。(与上511 是为了限定block 值不超过511)</font></i>
<a name='L190'>  <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> = ((<b>unsigned</b> <b>short</b> *) bh-&gt;b_data)[block &amp; 511];
<a name='L191'><i><font color='green'>// 如果是创建并且二级块的第block 项中的逻辑块号为0 的话,则申请一磁盘块(逻辑块),作为</font></i>
<a name='L192'><i><font color='green'>// 最终存放数据信息的块。并让二级块中的第block 项等于该新逻辑块块号(i)。然后置位二级块的</font></i>
<a name='L193'><i><font color='green'>// 已修改标志。</font></i>
<a name='L194'>  <b>if</b> (create &amp;&amp; !<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>)
<a name='L195'>    <b>if</b> (<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> = <a href='../S/4.html#L99' title='Defined at 99 in fs/bitmap.c.'>new_block</a> (inode-&gt;i_dev))
<a name='L196'>      <font color='red'>{</font>
<a name='L197'>        ((<b>unsigned</b> <b>short</b> *) (bh-&gt;b_data))[block &amp; 511] = <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>;
<a name='L198'>        bh-&gt;b_dirt = 1;
<a name='L199'>      <font color='red'>}</font>
<a name='L200'><i><font color='green'>// 最后释放该二次间接块的二级块,返回磁盘上新申请的对应block 的逻辑块的块号。</font></i>
<a name='L201'>  <a href='../S/6.html#L377' title='Defined at 377 in fs/buffer.c.'>brelse</a> (bh);
<a name='L202'>  <b>return</b> <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>;
<a name='L203'><font color='red'>}</font>
<a name='L204'>
<a name='L205'><i><font color='green'>//// 根据i 节点信息取文件数据块block 在设备上对应的逻辑块号。</font></i>
<a name='L206'><b>int</b>
<a name='L207'><a href='../R/389.html' title='Multiple refered from 5 places.'>bmap</a> (<b>struct</b> m_inode *inode, <b>int</b> block)
<a name='L208'><font color='red'>{</font>
<a name='L209'>  <b>return</b> <a href='../S/12.html#L96' title='Defined at 96 in fs/inode.c.'>_bmap</a> (inode, block, 0);
<a name='L210'><font color='red'>}</font>
<a name='L211'>
<a name='L212'><i><font color='green'>//// 创建文件数据块block 在设备上对应的逻辑块,并返回设备上对应的逻辑块号。</font></i>
<a name='L213'><b>int</b>
<a name='L214'><a href='../R/417.html' title='Multiple refered from 3 places.'>create_block</a> (<b>struct</b> m_inode *inode, <b>int</b> block)
<a name='L215'><font color='red'>{</font>
<a name='L216'>  <b>return</b> <a href='../S/12.html#L96' title='Defined at 96 in fs/inode.c.'>_bmap</a> (inode, block, 1);
<a name='L217'><font color='red'>}</font>
<a name='L218'>
<a name='L219'><i><font color='green'>//// 释放一个i 节点(回写入设备)。</font></i>
<a name='L220'><b>void</b>
<a name='L221'><a href='../R/511.html' title='Multiple refered from 110 places.'>iput</a> (<b>struct</b> m_inode *inode)
<a name='L222'><font color='red'>{</font>
<a name='L223'>  <b>if</b> (!inode)
<a name='L224'>    <b>return</b>;
<a name='L225'>  <a href='../S/12.html#L24' title='Defined at 24 in fs/inode.c.'>wait_on_inode</a> (inode);        <i><font color='green'>// 等待inode 节点解锁(如果已上锁的话)。</font></i>
<a name='L226'>  <b>if</b> (!inode-&gt;i_count)
<a name='L227'>    <a href='../S/72.html#L24' title='Defined at 24 in kernel/panic.c.'>panic</a> ("iput: trying to free free inode");
<a name='L228'><i><font color='green'>// 如果是管道i 节点,则唤醒等待该管道的进程,引用次数减1,如果还有引用则返回。否则释放</font></i>
<a name='L229'><i><font color='green'>// 管道占用的内存页面,并复位该节点的引用计数值、已修改标志和管道标志,并返回。</font></i>
<a name='L230'><i><font color='green'>// 对于pipe 节点,inode-&gt;i_size 存放着物理内存页地址。参见get_pipe_inode(),228,234 行。</font></i>
<a name='L231'>  <b>if</b> (inode-&gt;i_pipe)
<a name='L232'>    <font color='red'>{</font>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -