14.html
来自「linux 0.11中文版 有注释」· HTML 代码 · 共 693 行 · 第 1/5 页
HTML
693 行
<a name='L388'> thisname = pathname;
<a name='L389'> <b>if</b> (!<a href='../S/43.html#L35' title='Defined at 35 in include/sys/stat.h.'>S_ISDIR</a> (inode->i_mode) || !<a href='../S/14.html#L58' title='Defined at 58 in fs/namei.c.'>permission</a> (inode, <a href='../S/14.html#L38' title='Defined at 38 in fs/namei.c.'>MAY_EXEC</a>))
<a name='L390'> <font color='red'>{</font>
<a name='L391'> <a href='../S/12.html#L221' title='Defined at 221 in fs/inode.c.'>iput</a> (inode);
<a name='L392'> <b>return</b> <a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a>;
<a name='L393'> <font color='red'>}</font>
<a name='L394'><i><font color='green'>// 从路径名开始起搜索检测字符,直到字符已是结尾符(NULL)或者是'/',此时namelen 正好是当前处理</font></i>
<a name='L395'><i><font color='green'>// 目录名的长度。如果最后也是一个目录名,但其后没有加'/',则不会返回该最后目录的i 节点!</font></i>
<a name='L396'><i><font color='green'>// 比如:/var/log/httpd,将只返回log/目录的i 节点。</font></i>
<a name='L397'> <b>for</b> (namelen = 0; (c = <a href='../D/821.html' title='Multiple defined in 2 places.'>get_fs_byte</a> (pathname++)) && (c != '/');
<a name='L398'> namelen++)
<a name='L399'><i><font color='green'>/* nothing */</font></i> ;
<a name='L400'><i><font color='green'>// 若字符是结尾符NULL,则表明已经到达指定目录,则返回该i 节点指针,退出。</font></i>
<a name='L401'> <b>if</b> (!c)
<a name='L402'> <b>return</b> inode;
<a name='L403'><i><font color='green'>// 调用查找指定目录和文件名的目录项函数,在当前处理目录中寻找子目录项。如果没有找到,则释放</font></i>
<a name='L404'><i><font color='green'>// 该i 节点,并返回NULL,退出。</font></i>
<a name='L405'> <b>if</b> (!(bh = <a href='../S/14.html#L141' title='Defined at 141 in fs/namei.c.'>find_entry</a> (&inode, thisname, namelen, &de)))
<a name='L406'> <font color='red'>{</font>
<a name='L407'> <a href='../S/12.html#L221' title='Defined at 221 in fs/inode.c.'>iput</a> (inode);
<a name='L408'> <b>return</b> <a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a>;
<a name='L409'> <font color='red'>}</font>
<a name='L410'><i><font color='green'>// 取该子目录项的i 节点号inr 和设备号idev,释放包含该目录项的高速缓冲块和该i 节点。</font></i>
<a name='L411'> inr = de->inode;
<a name='L412'> idev = inode->i_dev;
<a name='L413'> <a href='../S/6.html#L377' title='Defined at 377 in fs/buffer.c.'>brelse</a> (bh);
<a name='L414'> <a href='../S/12.html#L221' title='Defined at 221 in fs/inode.c.'>iput</a> (inode);
<a name='L415'><i><font color='green'>// 取节点号inr 的i 节点信息,若失败,则返回NULL,退出。否则继续以该子目录的i 节点进行操作。</font></i>
<a name='L416'> <b>if</b> (!(inode = <a href='../S/12.html#L355' title='Defined at 355 in fs/inode.c.'>iget</a> (idev, inr)))
<a name='L417'> <b>return</b> <a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a>;
<a name='L418'> <font color='red'>}</font>
<a name='L419'><font color='red'>}</font>
<a name='L420'>
<a name='L421'><i><font color='green'>/*</font></i>
<a name='L422'><i><font color='green'>* dir_namei()</font></i>
<a name='L423'><i><font color='green'>*</font></i>
<a name='L424'><i><font color='green'>* dir_namei() returns the inode of the directory of the</font></i>
<a name='L425'><i><font color='green'>* specified name, and the name within that directory.</font></i>
<a name='L426'><i><font color='green'>*/</font></i>
<a name='L427'><i><font color='green'>/*</font></i>
<a name='L428'><i><font color='green'>* dir_namei()</font></i>
<a name='L429'><i><font color='green'>* dir_namei()函数返回指定目录名的i 节点指针,以及在最顶层目录的名称。</font></i>
<a name='L430'><i><font color='green'>*/</font></i>
<a name='L431'><i><font color='green'>// 参数:pathname - 目录路径名;namelen - 路径名长度。</font></i>
<a name='L432'><i><font color='green'>// 返回:指定目录名最顶层目录的i 节点指针和最顶层目录名及其长度。</font></i>
<a name='L433'><b>static</b> <b>struct</b> m_inode *
<a name='L434'><a href='../R/434.html' title='Multiple refered from 7 places.'>dir_namei</a> (<b>const</b> <b>char</b> *pathname, <b>int</b> *namelen, <b>const</b> <b>char</b> **name)
<a name='L435'><font color='red'>{</font>
<a name='L436'> <b>char</b> c;
<a name='L437'> <b>const</b> <b>char</b> *basename;
<a name='L438'> <b>struct</b> m_inode *dir;
<a name='L439'>
<a name='L440'><i><font color='green'>// 取指定路径名最顶层目录的i 节点,若出错则返回NULL,退出。</font></i>
<a name='L441'> <b>if</b> (!(dir = <a href='../S/14.html#L355' title='Defined at 355 in fs/namei.c.'>get_dir</a> (pathname)))
<a name='L442'> <b>return</b> <a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a>;
<a name='L443'><i><font color='green'>// 对路径名pathname 进行搜索检测,查处最后一个'/'后面的名字字符串,计算其长度,并返回最顶</font></i>
<a name='L444'><i><font color='green'>// 层目录的i 节点指针。</font></i>
<a name='L445'> basename = pathname;
<a name='L446'> <b>while</b> (c = <a href='../D/821.html' title='Multiple defined in 2 places.'>get_fs_byte</a> (pathname++))
<a name='L447'> <b>if</b> (c == '/')
<a name='L448'> basename = pathname;
<a name='L449'> *namelen = pathname - basename - 1;
<a name='L450'> *name = basename;
<a name='L451'> <b>return</b> dir;
<a name='L452'><font color='red'>}</font>
<a name='L453'>
<a name='L454'><i><font color='green'>/*</font></i>
<a name='L455'><i><font color='green'>* namei()</font></i>
<a name='L456'><i><font color='green'>*</font></i>
<a name='L457'><i><font color='green'>* is used by most simple commands to get the inode of a specified name.</font></i>
<a name='L458'><i><font color='green'>* Open, link etc use their own routines, but this is enough for things</font></i>
<a name='L459'><i><font color='green'>* like 'chmod' etc.</font></i>
<a name='L460'><i><font color='green'>*/</font></i>
<a name='L461'><i><font color='green'>/*</font></i>
<a name='L462'><i><font color='green'>* namei()</font></i>
<a name='L463'><i><font color='green'>* 该函数被许多简单的命令用于取得指定路径名称的i 节点。open、link 等则使用它们</font></i>
<a name='L464'><i><font color='green'>* 自己的相应函数,但对于象修改模式'chmod'等这样的命令,该函数已足够用了。</font></i>
<a name='L465'><i><font color='green'>*/</font></i>
<a name='L466'><i><font color='green'>//// 取指定路径名的i 节点。</font></i>
<a name='L467'><i><font color='green'>// 参数:pathname - 路径名。</font></i>
<a name='L468'><i><font color='green'>// 返回:对应的i 节点。</font></i>
<a name='L469'><b>struct</b> m_inode *
<a name='L470'><a href='../R/534.html' title='Multiple refered from 14 places.'>namei</a> (<b>const</b> <b>char</b> *pathname)
<a name='L471'><font color='red'>{</font>
<a name='L472'> <b>const</b> <b>char</b> *basename;
<a name='L473'> <b>int</b> inr, <a href='../S/7.html#L136' title='Defined at 136 in fs/char_dev.c.'>dev</a>, namelen;
<a name='L474'> <b>struct</b> m_inode *dir;
<a name='L475'> <b>struct</b> buffer_head *bh;
<a name='L476'> <b>struct</b> dir_entry *de;
<a name='L477'>
<a name='L478'><i><font color='green'>// 首先查找指定路径的最顶层目录的目录名及其i 节点,若不存在,则返回NULL,退出。</font></i>
<a name='L479'> <b>if</b> (!(dir = <a href='../S/14.html#L434' title='Defined at 434 in fs/namei.c.'>dir_namei</a> (pathname, &namelen, &basename)))
<a name='L480'> <b>return</b> <a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a>;
<a name='L481'><i><font color='green'>// 如果返回的最顶层名字的长度是0,则表示该路径名以一个目录名为最后一项。</font></i>
<a name='L482'> <b>if</b> (!namelen) <i><font color='green'>/* special case: '/usr/' etc */</font></i>
<a name='L483'> <b>return</b> dir; <i><font color='green'>/* 对应于'/usr/'等情况 */</font></i>
<a name='L484'><i><font color='green'>// 在返回的顶层目录中寻找指定文件名的目录项的i 节点。因为如果最后也是一个目录名,但其后没</font></i>
<a name='L485'><i><font color='green'>// 有加'/',则不会返回该最后目录的i 节点!比如:/var/log/httpd,将只返回log/目录的i 节点。</font></i>
<a name='L486'><i><font color='green'>// 因此dir_namei()将不以'/'结束的最后一个名字当作一个文件名来看待。因此这里需要单独对这种</font></i>
<a name='L487'><i><font color='green'>// 情况使用寻找目录项i 节点函数find_entry()进行处理。</font></i>
<a name='L488'> bh = <a href='../S/14.html#L141' title='Defined at 141 in fs/namei.c.'>find_entry</a> (&dir, basename, namelen, &de);
<a name='L489'> <b>if</b> (!bh)
<a name='L490'> <font color='red'>{</font>
<a name='L491'> <a href='../S/12.html#L221' title='Defined at 221 in fs/inode.c.'>iput</a> (dir);
<a name='L492'> <b>return</b> <a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a>;
<a name='L493'> <font color='red'>}</font>
<a name='L494'><i><font color='green'>// 取该目录项的i 节点号和目录的设备号,并释放包含该目录项的高速缓冲区以及目录i 节点。</font></i>
<a name='L495'> inr = de->inode;
<a name='L496'> <a href='../S/7.html#L136' title='Defined at 136 in fs/char_dev.c.'>dev</a> = dir->i_dev;
<a name='L497'> <a href='../S/6.html#L377' title='Defined at 377 in fs/buffer.c.'>brelse</a> (bh);
<a name='L498'> <a href='../S/12.html#L221' title='Defined at 221 in fs/inode.c.'>iput</a> (dir);
<a name='L499'><i><font color='green'>// 取对应节号的i 节点,修改其被访问时间为当前时间,并置已修改标志。最后返回该i 节点指针。</font></i>
<a name='L500'> dir = <a href='../S/12.html#L355' title='Defined at 355 in fs/inode.c.'>iget</a> (<a href='../S/7.html#L136' title='Defined at 136 in fs/char_dev.c.'>dev</a>, inr);
<a name='L501'> <b>if</b> (dir)
<a name='L502'> <font color='red'>{</font>
<a name='L503'> dir->i_atime = <a href='../S/36.html#L234' title='Defined at 234 in include/linux/sched.h.'>CURRENT_TIME</a>;
<a name='L504'> dir->i_dirt = 1;
<a name='L505'> <font color='red'>}</font>
<a name='L506'> <b>return</b> dir;
<a name='L507'><font color='red'>}</font>
<a name='L508'>
<a name='L509'><i><font color='green'>/*</font></i>
<a name='L510'><i><font color='green'>* open_namei()</font></i>
<a name='L511'><i><font color='green'>*</font></i>
<a name='L512'><i><font color='green'>* namei for open - this is in fact almost the whole open-routine.</font></i>
<a name='L513'><i><font color='green'>*/</font></i>
<a name='L514'><i><font color='green'>/*</font></i>
<a name='L515'><i><font color='green'>* open_namei()</font></i>
<a name='L516'><i><font color='green'>* open()所使用的namei 函数 - 这其实几乎是完整的打开文件程序。</font></i>
<a name='L517'><i><font color='green'>*/</font></i>
<a name='L518'><i><font color='green'>//// 文件打开namei 函数。</font></i>
<a name='L519'><i><font color='green'>// 参数:pathname - 文件路径名;flag - 文件打开标志;mode - 文件访问许可属性;</font></i>
<a name='L520'><i><font color='green'>// 返回:成功返回0,否则返回出错码;res_inode - 返回的对应文件路径名的的i 节点指针。</font></i>
<a name='L521'><b>int</b>
<a name='L522'><a href='../R/543.html' title='Multiple refered from 2 places.'>open_namei</a> (<b>const</b> <b>char</b> *pathname, <b>int</b> flag, <b>int</b> mode,
<a name='L523'> <b>struct</b> m_inode **res_inode)
<a name='L524'><font color='red'>{</font>
<a name='L525'> <b>const</b> <b>char</b> *basename;
<a name='L526'> <b>int</b> inr, <a href='../S/7.html#L136' title='Defined at 136 in fs/char_dev.c.'>dev</a>, namelen;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?