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

📄 4.html

📁 linux 0.11中文版 有注释
💻 HTML
📖 第 1 页 / 共 2 页
字号:
<a name='L107'>    <a href='../S/72.html#L24' title='Defined at 24 in kernel/panic.c.'>panic</a> ("trying to get new block from nonexistant device");
<a name='L108'><i><font color='green'>// 扫描逻辑块位图,寻找首个0 比特位,寻找空闲逻辑块,获取放置该逻辑块的块号。</font></i>
<a name='L109'>  j = 8192;
<a name='L110'>  <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; 8; <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>++)
<a name='L111'>    <b>if</b> (bh = sb-&gt;s_zmap[<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>])
<a name='L112'>      <b>if</b> ((j = <a href='../S/4.html#L38' title='Defined at 38 in fs/bitmap.c.'>find_first_zero</a> (bh-&gt;b_data)) &lt; 8192)
<a name='L113'>        <b>break</b>;
<a name='L114'><i><font color='green'>// 如果全部扫描完还没找到(i&gt;=8 或j&gt;=8192)或者位图所在的缓冲块无效(bh=NULL)则 返回0,</font></i>
<a name='L115'><i><font color='green'>// 退出(没有空闲逻辑块)。</font></i>
<a name='L116'>  <b>if</b> (<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> &gt;= 8 || !bh || j &gt;= 8192)
<a name='L117'>    <b>return</b> 0;
<a name='L118'><i><font color='green'>// 设置新逻辑块对应逻辑块位图中的比特位,若对应比特位已经置位,则出错,死机。</font></i>
<a name='L119'>  <b>if</b> (<a href='../D/960.html' title='Multiple defined in 2 places.'>set_bit</a> (j, bh-&gt;b_data))
<a name='L120'>    <a href='../S/72.html#L24' title='Defined at 24 in kernel/panic.c.'>panic</a> ("new_block: bit already set");
<a name='L121'><i><font color='green'>// 置对应缓冲区块的已修改标志。如果新逻辑块大于该设备上的总逻辑块数,则说明指定逻辑块在</font></i>
<a name='L122'><i><font color='green'>// 对应设备上不存在。申请失败,返回0,退出。</font></i>
<a name='L123'>  bh-&gt;b_dirt = 1;
<a name='L124'>  j += <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> * 8192 + sb-&gt;s_firstdatazone - 1;
<a name='L125'>  <b>if</b> (j &gt;= sb-&gt;s_nzones)
<a name='L126'>    <b>return</b> 0;
<a name='L127'><i><font color='green'>// 读取设备上的该新逻辑块数据(验证)。如果失败则死机。</font></i>
<a name='L128'>  <b>if</b> (!(bh = <a href='../S/6.html#L301' title='Defined at 301 in fs/buffer.c.'>getblk</a> (<a href='../S/7.html#L136' title='Defined at 136 in fs/char_dev.c.'>dev</a>, j)))
<a name='L129'>    <a href='../S/72.html#L24' title='Defined at 24 in kernel/panic.c.'>panic</a> ("new_block: cannot get block");
<a name='L130'><i><font color='green'>// 新块的引用计数应为1。否则死机。</font></i>
<a name='L131'>  <b>if</b> (bh-&gt;b_count != 1)
<a name='L132'>    <a href='../S/72.html#L24' title='Defined at 24 in kernel/panic.c.'>panic</a> ("new block: count is != 1");
<a name='L133'><i><font color='green'>// 将该新逻辑块清零,并置位更新标志和已修改标志。然后释放对应缓冲区,返回逻辑块号。</font></i>
<a name='L134'>  <a href='../S/4.html#L17' title='Defined at 17 in fs/bitmap.c.'>clear_block</a> (bh-&gt;b_data);
<a name='L135'>  bh-&gt;b_uptodate = 1;
<a name='L136'>  bh-&gt;b_dirt = 1;
<a name='L137'>  <a href='../S/6.html#L377' title='Defined at 377 in fs/buffer.c.'>brelse</a> (bh);
<a name='L138'>  <b>return</b> j;
<a name='L139'><font color='red'>}</font>
<a name='L140'>
<a name='L141'><i><font color='green'>//// 释放指定的i 节点。</font></i>
<a name='L142'><i><font color='green'>// 复位对应i 节点位图比特位。</font></i>
<a name='L143'><b>void</b> <a href='../R/467.html' title='Multiple refered from 2 places.'>free_inode</a> (<b>struct</b> m_inode *inode)
<a name='L144'><font color='red'>{</font>
<a name='L145'>  <b>struct</b> super_block *sb;
<a name='L146'>  <b>struct</b> buffer_head *bh;
<a name='L147'>
<a name='L148'><i><font color='green'>// 如果i 节点指针=NULL,则退出。</font></i>
<a name='L149'>  <b>if</b> (!inode)
<a name='L150'>    <b>return</b>;
<a name='L151'><i><font color='green'>// 如果i 节点上的设备号字段为0,说明该节点无用,则用0 清空对应i 节点所占内存区,并返回。</font></i>
<a name='L152'>  <b>if</b> (!inode-&gt;i_dev)
<a name='L153'>    <font color='red'>{</font>
<a name='L154'>      <a href='../S/42.html#L495' title='Defined at 495 in include/string.h.'>memset</a> (inode, 0, <b>sizeof</b> (*inode));
<a name='L155'>      <b>return</b>;
<a name='L156'>    <font color='red'>}</font>
<a name='L157'><i><font color='green'>// 如果此i 节点还有其它程序引用,则不能释放,说明内核有问题,死机。</font></i>
<a name='L158'>  <b>if</b> (inode-&gt;i_count &gt; 1)
<a name='L159'>    <font color='red'>{</font>
<a name='L160'>      <a href='../S/73.html#L30' title='Defined at 30 in kernel/printk.c.'>printk</a> ("trying to free inode with count=%d\n", inode-&gt;i_count);
<a name='L161'>      <a href='../S/72.html#L24' title='Defined at 24 in kernel/panic.c.'>panic</a> ("free_inode");
<a name='L162'>    <font color='red'>}</font>
<a name='L163'><i><font color='green'>// 如果文件目录项连接数不为0,则表示还有其它文件目录项在使用该节点,不应释放,而应该放回等。</font></i>
<a name='L164'>  <b>if</b> (inode-&gt;i_nlinks)
<a name='L165'>    <a href='../S/72.html#L24' title='Defined at 24 in kernel/panic.c.'>panic</a> ("trying to free inode with links");
<a name='L166'><i><font color='green'>// 取i 节点所在设备的超级块,测试设备是否存在。</font></i>
<a name='L167'>  <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='L168'>    <a href='../S/72.html#L24' title='Defined at 24 in kernel/panic.c.'>panic</a> ("trying to free inode on nonexistent device");
<a name='L169'><i><font color='green'>// 如果i 节点号=0 或大于该设备上i 节点总数,则出错(0 号i 节点保留没有使用)。</font></i>
<a name='L170'>  <b>if</b> (inode-&gt;i_num &lt; 1 || inode-&gt;i_num &gt; sb-&gt;s_ninodes)
<a name='L171'>    <a href='../S/72.html#L24' title='Defined at 24 in kernel/panic.c.'>panic</a> ("trying to free inode 0 or nonexistant inode");
<a name='L172'><i><font color='green'>// 如果该i 节点对应的节点位图不存在,则出错。</font></i>
<a name='L173'>  <b>if</b> (!(bh = sb-&gt;s_imap[inode-&gt;i_num &gt;&gt; 13]))
<a name='L174'>    <a href='../S/72.html#L24' title='Defined at 24 in kernel/panic.c.'>panic</a> ("nonexistent imap in superblock");
<a name='L175'><i><font color='green'>// 复位i 节点对应的节点位图中的比特位,如果该比特位已经等于0,则出错。</font></i>
<a name='L176'>  <b>if</b> (<a href='../S/4.html#L30' title='Defined at 30 in fs/bitmap.c.'>clear_bit</a> (inode-&gt;i_num &amp; 8191, bh-&gt;b_data))
<a name='L177'>    <a href='../S/73.html#L30' title='Defined at 30 in kernel/printk.c.'>printk</a> ("free_inode: bit already cleared.\n\r");
<a name='L178'><i><font color='green'>// 置i 节点位图所在缓冲区已修改标志,并清空该i 节点结构所占内存区。</font></i>
<a name='L179'>  bh-&gt;b_dirt = 1;
<a name='L180'>  <a href='../S/42.html#L495' title='Defined at 495 in include/string.h.'>memset</a> (inode, 0, <b>sizeof</b> (*inode));
<a name='L181'><font color='red'>}</font>
<a name='L182'>
<a name='L183'><i><font color='green'>//// 为设备dev 建立一个新i 节点。返回该新i 节点的指针。</font></i>
<a name='L184'><i><font color='green'>// 在内存i 节点表中获取一个空闲i 节点表项,并从i 节点位图中找一个空闲i 节点。</font></i>
<a name='L185'><b>struct</b> m_inode *<a href='../R/536.html' title='Multiple refered from 4 places.'>new_inode</a> (<b>int</b> dev)
<a name='L186'><font color='red'>{</font>
<a name='L187'>  <b>struct</b> m_inode *inode;
<a name='L188'>  <b>struct</b> super_block *sb;
<a name='L189'>  <b>struct</b> buffer_head *bh;
<a name='L190'>  <b>int</b> <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>, j;
<a name='L191'>
<a name='L192'><i><font color='green'>// 从内存i 节点表(inode_table)中获取一个空闲i 节点项(inode)。</font></i>
<a name='L193'>  <b>if</b> (!(inode = <a href='../S/12.html#L283' title='Defined at 283 in fs/inode.c.'>get_empty_inode</a> ()))
<a name='L194'>    <b>return</b> <a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a>;
<a name='L195'><i><font color='green'>// 读取指定设备的超级块结构。</font></i>
<a name='L196'>  <b>if</b> (!(sb = <a href='../S/19.html#L76' title='Defined at 76 in fs/super.c.'>get_super</a> (<a href='../S/7.html#L136' title='Defined at 136 in fs/char_dev.c.'>dev</a>)))
<a name='L197'>    <a href='../S/72.html#L24' title='Defined at 24 in kernel/panic.c.'>panic</a> ("new_inode with unknown device");
<a name='L198'><i><font color='green'>// 扫描i 节点位图,寻找首个0 比特位,寻找空闲节点,获取放置该i 节点的节点号。</font></i>
<a name='L199'>  j = 8192;
<a name='L200'>  <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; 8; <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>++)
<a name='L201'>    <b>if</b> (bh = sb-&gt;s_imap[<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>])
<a name='L202'>      <b>if</b> ((j = <a href='../S/4.html#L38' title='Defined at 38 in fs/bitmap.c.'>find_first_zero</a> (bh-&gt;b_data)) &lt; 8192)
<a name='L203'>        <b>break</b>;
<a name='L204'><i><font color='green'>// 如果全部扫描完还没找到,或者位图所在的缓冲块无效(bh=NULL)则 返回0,退出(没有空闲i 节点)。</font></i>
<a name='L205'>  <b>if</b> (!bh || j &gt;= 8192 || j + <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> * 8192 &gt; sb-&gt;s_ninodes)
<a name='L206'>    <font color='red'>{</font>
<a name='L207'>      <a href='../S/12.html#L221' title='Defined at 221 in fs/inode.c.'>iput</a> (inode);
<a name='L208'>      <b>return</b> <a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a>;
<a name='L209'>    <font color='red'>}</font>
<a name='L210'><i><font color='green'>// 置位对应新i 节点的i 节点位图相应比特位,如果已经置位,则出错。</font></i>
<a name='L211'>  <b>if</b> (<a href='../D/960.html' title='Multiple defined in 2 places.'>set_bit</a> (j, bh-&gt;b_data))
<a name='L212'>    <a href='../S/72.html#L24' title='Defined at 24 in kernel/panic.c.'>panic</a> ("new_inode: bit already set");
<a name='L213'><i><font color='green'>// 置i 节点位图所在缓冲区已修改标志。</font></i>
<a name='L214'>  bh-&gt;b_dirt = 1;
<a name='L215'><i><font color='green'>// 初始化该i 节点结构。</font></i>
<a name='L216'>  inode-&gt;i_count = 1;           <i><font color='green'>// 引用计数。</font></i>
<a name='L217'>  inode-&gt;i_nlinks = 1;          <i><font color='green'>// 文件目录项链接数。</font></i>
<a name='L218'>  inode-&gt;i_dev = <a href='../S/7.html#L136' title='Defined at 136 in fs/char_dev.c.'>dev</a>;           <i><font color='green'>// i 节点所在的设备号。</font></i>
<a name='L219'>  inode-&gt;i_uid = current-&gt;euid; <i><font color='green'>// i 节点所属用户id。</font></i>
<a name='L220'>  inode-&gt;i_gid = current-&gt;egid; <i><font color='green'>// 组id。</font></i>
<a name='L221'>  inode-&gt;i_dirt = 1;            <i><font color='green'>// 已修改标志置位。</font></i>
<a name='L222'>  inode-&gt;i_num = j + <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> * 8192;  <i><font color='green'>// 对应设备中的i 节点号。</font></i>
<a name='L223'>  inode-&gt;i_mtime = inode-&gt;i_atime = inode-&gt;i_ctime = <a href='../S/36.html#L234' title='Defined at 234 in include/linux/sched.h.'>CURRENT_TIME</a>;      <i><font color='green'>// 设置时间。</font></i>
<a name='L224'>  <b>return</b> inode;                 <i><font color='green'>// 返回该i 节点指针。</font></i>
<a name='L225'><font color='red'>}</font>
</pre>
<hr>
<a name='BOTTOM'>
<i><font color='green'>/* [&lt;][&gt;]<a href='#L59'>[^]</a><a href='#L185'>[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 + -