📄 12.html
字号:
<a name='L102'> <b>if</b> (block < 0)
<a name='L103'> <a href='../S/72.html#L24' title='Defined at 24 in kernel/panic.c.'>panic</a> ("_bmap: block<0");
<a name='L104'><i><font color='green'>// 如果块号大于直接块数 + 间接块数 + 二次间接块数,超出文件系统表示范围,则死机。</font></i>
<a name='L105'> <b>if</b> (block >= 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>big");
<a name='L107'><i><font color='green'>// 如果该块号小于7,则使用直接块表示。</font></i>
<a name='L108'> <b>if</b> (block < 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 && !inode->i_zone[block])
<a name='L114'> <b>if</b> (inode->i_zone[block] = <a href='../S/4.html#L99' title='Defined at 99 in fs/bitmap.c.'>new_block</a> (inode->i_dev))
<a name='L115'> <font color='red'>{</font>
<a name='L116'> inode->i_ctime = <a href='../S/36.html#L234' title='Defined at 234 in include/linux/sched.h.'>CURRENT_TIME</a>;
<a name='L117'> inode->i_dirt = 1;
<a name='L118'> <font color='red'>}</font>
<a name='L119'> <b>return</b> inode->i_zone[block];
<a name='L120'> <font color='red'>}</font>
<a name='L121'><i><font color='green'>// 如果该块号>=7,并且小于7+512,则说明是一次间接块。下面对一次间接块进行处理。</font></i>
<a name='L122'> block -= 7;
<a name='L123'> <b>if</b> (block < 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 && !inode->i_zone[7])
<a name='L129'> <b>if</b> (inode->i_zone[7] = <a href='../S/4.html#L99' title='Defined at 99 in fs/bitmap.c.'>new_block</a> (inode->i_dev))
<a name='L130'> <font color='red'>{</font>
<a name='L131'> inode->i_dirt = 1;
<a name='L132'> inode->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->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->i_dev, inode->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->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 && !<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->i_dev))
<a name='L146'> <font color='red'>{</font>
<a name='L147'> ((<b>unsigned</b> <b>short</b> *) (bh->b_data))[block] = <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>;
<a name='L148'> bh->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 && !inode->i_zone[8])
<a name='L160'> <b>if</b> (inode->i_zone[8] = <a href='../S/4.html#L99' title='Defined at 99 in fs/bitmap.c.'>new_block</a> (inode->i_dev))
<a name='L161'> <font color='red'>{</font>
<a name='L162'> inode->i_dirt = 1;
<a name='L163'> inode->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->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->i_dev, inode->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->b_data)[block >> 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 && !<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->i_dev))
<a name='L178'> <font color='red'>{</font>
<a name='L179'> ((<b>unsigned</b> <b>short</b> *) (bh->b_data))[block >> 9] = <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>;
<a name='L180'> bh->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->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->b_data)[block & 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 && !<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->i_dev))
<a name='L196'> <font color='red'>{</font>
<a name='L197'> ((<b>unsigned</b> <b>short</b> *) (bh->b_data))[block & 511] = <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>;
<a name='L198'> bh->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->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->i_size 存放着物理内存页地址。参见get_pipe_inode(),228,234 行。</font></i>
<a name='L231'> <b>if</b> (inode->i_pipe)
<a name='L232'> <font color='red'>{</font>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -