📄 4.html
字号:
<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> < 8; <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>++)
<a name='L111'> <b>if</b> (bh = sb->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->b_data)) < 8192)
<a name='L113'> <b>break</b>;
<a name='L114'><i><font color='green'>// 如果全部扫描完还没找到(i>=8 或j>=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> >= 8 || !bh || j >= 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->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->b_dirt = 1;
<a name='L124'> j += <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> * 8192 + sb->s_firstdatazone - 1;
<a name='L125'> <b>if</b> (j >= sb->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->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->b_data);
<a name='L135'> bh->b_uptodate = 1;
<a name='L136'> bh->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->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->i_count > 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->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->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->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->i_num < 1 || inode->i_num > sb->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->s_imap[inode->i_num >> 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->i_num & 8191, bh->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->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> < 8; <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>++)
<a name='L201'> <b>if</b> (bh = sb->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->b_data)) < 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 >= 8192 || j + <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> * 8192 > sb->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->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->b_dirt = 1;
<a name='L215'><i><font color='green'>// 初始化该i 节点结构。</font></i>
<a name='L216'> inode->i_count = 1; <i><font color='green'>// 引用计数。</font></i>
<a name='L217'> inode->i_nlinks = 1; <i><font color='green'>// 文件目录项链接数。</font></i>
<a name='L218'> inode->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->i_uid = current->euid; <i><font color='green'>// i 节点所属用户id。</font></i>
<a name='L220'> inode->i_gid = current->egid; <i><font color='green'>// 组id。</font></i>
<a name='L221'> inode->i_dirt = 1; <i><font color='green'>// 已修改标志置位。</font></i>
<a name='L222'> inode->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->i_mtime = inode->i_atime = inode->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'>/* [<][>]<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 + -