14.html
来自「linux 0.11中文版 有注释」· HTML 代码 · 共 693 行 · 第 1/5 页
HTML
693 行
<a name='L110'> "fs ; repe ; cmpsb\n\t" <i><font color='green'>// 用户空间执行循环比较[esi++]和[edi++]操作,</font></i>
<a name='L111'> "setz %%al" <i><font color='green'>// 若比较结果一样(z=0)则设置al=1(same=eax)。</font></i>
<a name='L112'>: "=a" (same): "" (0), "S" ((<b>long</b>) name), "D" ((<b>long</b>) de->name), "c" (len):"cx", "di",
<a name='L113'> "si");
<a name='L114'> <b>return</b> same; <i><font color='green'>// 返回比较结果。</font></i>
<a name='L115'><font color='red'>}</font>
<a name='L116'>
<a name='L117'><i><font color='green'>/*</font></i>
<a name='L118'><i><font color='green'>* find_entry()</font></i>
<a name='L119'><i><font color='green'>*</font></i>
<a name='L120'><i><font color='green'>* finds an entry in the specified directory with the wanted name. It</font></i>
<a name='L121'><i><font color='green'>* returns the cache buffer in which the entry was found, and the entry</font></i>
<a name='L122'><i><font color='green'>* itself (as a parameter - res_dir). It does NOT read the inode of the</font></i>
<a name='L123'><i><font color='green'>* entry - you'll have to do that yourself if you want to.</font></i>
<a name='L124'><i><font color='green'>*</font></i>
<a name='L125'><i><font color='green'>* This also takes care of the few special cases due to '..'-traversal</font></i>
<a name='L126'><i><font color='green'>* over a pseudo-root and a mount point.</font></i>
<a name='L127'><i><font color='green'>*/</font></i>
<a name='L128'><i><font color='green'>/*</font></i>
<a name='L129'><i><font color='green'>* find_entry()</font></i>
<a name='L130'><i><font color='green'>* 在指定的目录中寻找一个与名字匹配的目录项。返回一个含有找到目录项的高速</font></i>
<a name='L131'><i><font color='green'>* 缓冲区以及目录项本身(作为一个参数 - res_dir)。并不读目录项的i 节点 - 如</font></i>
<a name='L132'><i><font color='green'>* 果需要的话需自己操作。</font></i>
<a name='L133'><i><font color='green'>*</font></i>
<a name='L134'><i><font color='green'>* '..'目录项,操作期间也会对几种特殊情况分别处理 - 比如横越一个伪根目录以</font></i>
<a name='L135'><i><font color='green'>* 及安装点。</font></i>
<a name='L136'><i><font color='green'>*/</font></i>
<a name='L137'><i><font color='green'>//// 查找指定目录和文件名的目录项。</font></i>
<a name='L138'><i><font color='green'>// 参数:dir - 指定目录i 节点的指针;name - 文件名;namelen - 文件名长度;</font></i>
<a name='L139'><i><font color='green'>// 返回:高速缓冲区指针;res_dir - 返回的目录项结构指针;</font></i>
<a name='L140'><b>static</b> <b>struct</b> buffer_head *
<a name='L141'><a href='../R/454.html' title='Multiple refered from 8 places.'>find_entry</a> (<b>struct</b> m_inode **dir,
<a name='L142'> <b>const</b> <b>char</b> *name, <b>int</b> namelen, <b>struct</b> dir_entry **res_dir)
<a name='L143'><font color='red'>{</font>
<a name='L144'> <b>int</b> entries;
<a name='L145'> <b>int</b> block, <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>;
<a name='L146'> <b>struct</b> buffer_head *bh;
<a name='L147'> <b>struct</b> dir_entry *de;
<a name='L148'> <b>struct</b> super_block *sb;
<a name='L149'>
<a name='L150'><i><font color='green'>// 如果定义了NO_TRUNCATE,则若文件名长度超过最大长度NAME_LEN,则返回。</font></i>
<a name='L151'><font color='darkred'>#ifdef</font> NO_TRUNCATE
<a name='L152'> <b>if</b> (namelen > <a href='../S/31.html#L52' title='Defined at 52 in include/linux/fs.h.'>NAME_LEN</a>)
<a name='L153'> <b>return</b> <a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a>;
<a name='L154'><i><font color='green'>//如果没有定义NO_TRUNCATE,则若文件名长度超过最大长度NAME_LEN,则截短之。</font></i>
<a name='L155'><font color='darkred'>#else</font>
<a name='L156'> <b>if</b> (namelen > <a href='../S/31.html#L52' title='Defined at 52 in include/linux/fs.h.'>NAME_LEN</a>)
<a name='L157'> namelen = <a href='../S/31.html#L52' title='Defined at 52 in include/linux/fs.h.'>NAME_LEN</a>;
<a name='L158'><font color='darkred'>#endif</font>
<a name='L159'><i><font color='green'>// 计算本目录中目录项项数entries。置空返回目录项结构指针。</font></i>
<a name='L160'> entries = (*dir)->i_size / (<b>sizeof</b> (<b>struct</b> dir_entry));
<a name='L161'> *res_dir = <a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a>;
<a name='L162'><i><font color='green'>// 如果文件名长度等于0,则返回NULL,退出。</font></i>
<a name='L163'> <b>if</b> (!namelen)
<a name='L164'> <b>return</b> <a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a>;
<a name='L165'><i><font color='green'>/* check for '..', as we might have to do some "magic" for it */</font></i>
<a name='L166'><i><font color='green'>/* 检查目录项'..',因为可能需要对其特别处理 */</font></i>
<a name='L167'> <b>if</b> (namelen == 2 && <a href='../D/821.html' title='Multiple defined in 2 places.'>get_fs_byte</a> (name) == '.'
<a name='L168'> && <a href='../D/821.html' title='Multiple defined in 2 places.'>get_fs_byte</a> (name + 1) == '.')
<a name='L169'> <font color='red'>{</font>
<a name='L170'><i><font color='green'>/* '..' in a pseudo-root results in a faked '.' (just change namelen) */</font></i>
<a name='L171'><i><font color='green'>/* 伪根中的'..'如同一个假'.'(只需改变名字长度) */</font></i>
<a name='L172'><i><font color='green'>// 如果当前进程的根节点指针即是指定的目录,则将文件名修改为'.',</font></i>
<a name='L173'> <b>if</b> ((*dir) == current->root)
<a name='L174'> namelen = 1;
<a name='L175'><i><font color='green'>// 否则如果该目录的i 节点号等于ROOT_INO(1)的话,说明是文件系统根节点。则取文件系统的超级块。</font></i>
<a name='L176'> <b>else</b> <b>if</b> ((*dir)->i_num == <a href='../S/31.html#L53' title='Defined at 53 in include/linux/fs.h.'>ROOT_INO</a>)
<a name='L177'> <font color='red'>{</font>
<a name='L178'><i><font color='green'>/* '..' over a mount-point results in 'dir' being exchanged for the mounted</font></i>
<a name='L179'><i><font color='green'>directory-inode. NOTE! We set mounted, so that we can iput the new dir */</font></i>
<a name='L180'><i><font color='green'>/* 在一个安装点上的'..'将导致目录交换到安装到文件系统的目录i 节点。</font></i>
<a name='L181'><i><font color='green'>注意!由于设置了mounted 标志,因而我们能够取出该新目录 */</font></i>
<a name='L182'> sb = <a href='../S/19.html#L76' title='Defined at 76 in fs/super.c.'>get_super</a> ((*dir)->i_dev);
<a name='L183'><i><font color='green'>// 如果被安装到的i 节点存在,则先释放原i 节点,然后对被安装到的i 节点进行处理。</font></i>
<a name='L184'><i><font color='green'>// 让*dir 指向该被安装到的i 节点;该i 节点的引用数加1。</font></i>
<a name='L185'> <b>if</b> (sb->s_imount)
<a name='L186'> <font color='red'>{</font>
<a name='L187'> <a href='../S/12.html#L221' title='Defined at 221 in fs/inode.c.'>iput</a> (*dir);
<a name='L188'> (*dir) = sb->s_imount;
<a name='L189'> (*dir)->i_count++;
<a name='L190'> <font color='red'>}</font>
<a name='L191'> <font color='red'>}</font>
<a name='L192'> <font color='red'>}</font>
<a name='L193'><i><font color='green'>// 如果该i 节点所指向的第一个直接磁盘块号为0,则返回NULL,退出。</font></i>
<a name='L194'> <b>if</b> (!(block = (*dir)->i_zone[0]))
<a name='L195'> <b>return</b> <a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a>;
<a name='L196'><i><font color='green'>// 从节点所在设备读取指定的目录项数据块,如果不成功,则返回NULL,退出。</font></i>
<a name='L197'> <b>if</b> (!(bh = <a href='../S/6.html#L397' title='Defined at 397 in fs/buffer.c.'>bread</a> ((*dir)->i_dev, block)))
<a name='L198'> <b>return</b> <a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a>;
<a name='L199'><i><font color='green'>// 在目录项数据块中搜索匹配指定文件名的目录项,首先让de 指向数据块,并在不超过目录中目录项数</font></i>
<a name='L200'><i><font color='green'>// 的条件下,循环执行搜索。</font></i>
<a name='L201'> <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> = 0;
<a name='L202'> de = (<b>struct</b> dir_entry *) bh->b_data;
<a name='L203'> <b>while</b> (<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> < entries)
<a name='L204'> <font color='red'>{</font>
<a name='L205'><i><font color='green'>// 如果当前目录项数据块已经搜索完,还没有找到匹配的目录项,则释放当前目录项数据块。</font></i>
<a name='L206'> <b>if</b> ((<b>char</b> *) de >= <a href='../D/23.html' title='Multiple defined in 2 places.'>BLOCK_SIZE</a> + bh->b_data)
<a name='L207'> <font color='red'>{</font>
<a name='L208'> <a href='../S/6.html#L377' title='Defined at 377 in fs/buffer.c.'>brelse</a> (bh);
<a name='L209'> bh = <a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a>;
<a name='L210'><i><font color='green'>// 在读入下一目录项数据块。若这块为空,则只要还没有搜索完目录中的所有目录项,就跳过该块,</font></i>
<a name='L211'><i><font color='green'>// 继续读下一目录项数据块。若该块不空,就让de 指向该目录项数据块,继续搜索。</font></i>
<a name='L212'> <b>if</b> (!(block = <a href='../S/12.html#L207' title='Defined at 207 in fs/inode.c.'>bmap</a> (*dir, <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> / <a href='../S/31.html#L74' title='Defined at 74 in include/linux/fs.h.'>DIR_ENTRIES_PER_BLOCK</a>)) ||
<a name='L213'> !(bh = <a href='../S/6.html#L397' title='Defined at 397 in fs/buffer.c.'>bread</a> ((*dir)->i_dev, block)))
<a name='L214'> <font color='red'>{</font>
<a name='L215'> <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> += <a href='../S/31.html#L74' title='Defined at 74 in include/linux/fs.h.'>DIR_ENTRIES_PER_BLOCK</a>;
<a name='L216'> <b>continue</b>;
<a name='L217'> <font color='red'>}</font>
<a name='L218'> de = (<b>struct</b> dir_entry *) bh->b_data;
<a name='L219'> <font color='red'>}</font>
<a name='L220'><i><font color='green'>// 如果找到匹配的目录项的话,则返回该目录项结构指针和该目录项数据块指针,退出。</font></i>
<a name='L221'> <b>if</b> (<a href='../S/14.html#L96' title='Defined at 96 in fs/namei.c.'>match</a> (namelen, name, de))
<a name='L222'> <font color='red'>{</font>
<a name='L223'> *res_dir = de;
<a name='L224'> <b>return</b> bh;
<a name='L225'> <font color='red'>}</font>
<a name='L226'><i><font color='green'>// 否则继续在目录项数据块中比较下一个目录项。</font></i>
<a name='L227'> de++;
<a name='L228'> <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>++;
<a name='L229'> <font color='red'>}</font>
<a name='L230'><i><font color='green'>// 若指定目录中的所有目录项都搜索完还没有找到相应的目录项,则释放目录项数据块,返回NULL。</font></i>
<a name='L231'> <a href='../S/6.html#L377' title='Defined at 377 in fs/buffer.c.'>brelse</a> (bh);
<a name='L232'> <b>return</b> <a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a>;
<a name='L233'><font color='red'>}</font>
<a name='L234'>
<a name='L235'><i><font color='green'>/*</font></i>
<a name='L236'><i><font color='green'>* add_entry()</font></i>
<a name='L237'><i><font color='green'>*</font></i>
<a name='L238'><i><font color='green'>* adds a file entry to the specified directory, using the same</font></i>
<a name='L239'><i><font color='green'>* semantics as find_entry(). It returns NULL if it failed.</font></i>
<a name='L240'><i><font color='green'>*</font></i>
<a name='L241'><i><font color='green'>* NOTE!! The inode part of 'de' is left at 0 - which means you</font></i>
<a name='L242'><i><font color='green'>* may not sleep between calling this and putting something into</font></i>
<a name='L243'><i><font color='green'>* the entry, as someone else might have used it while you slept.</font></i>
<a name='L244'><i><font color='green'>*/</font></i>
<a name='L245'><i><font color='green'>/*</font></i>
<a name='L246'><i><font color='green'>* add_entry()</font></i>
<a name='L247'><i><font color='green'>* 使用与find_entry()同样的方法,往指定目录中添加一文件目录项。</font></i>
<a name='L248'><i><font color='green'>* 如果失败则返回NULL。</font></i>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?