📄 12.html
字号:
<html>
<head>
<title>fs/inode.c</title>
<meta name='robots' content='noindex,nofollow'>
<meta name='generator' content='GLOBAL-5.4.1'>
</head>
<body text='#191970' bgcolor='#f5f5dc' vlink='gray'>
<a name='TOP'><h2><a href='../mains.html'>root</a>/<a href='../files/98.html'>fs</a>/inode.c</h2>
<i><font color='green'>/* [<][>]<a href='#L24'>[^]</a><a href='#L452'>[v]</a>[top]<a href='#BOTTOM'>[bottom]</a><a href='../mains.html'>[index]</a><a href='../help.html'>[help]</a> */</font></i>
<hr>
<h2>DEFINITIONS</h2>
This source file includes following definitions.
<ol>
<li><a href='#L24' title='Defined at 24.'>wait_on_inode</a>
<li><a href='#L35' title='Defined at 35.'>lock_inode</a>
<li><a href='#L47' title='Defined at 47.'>unlock_inode</a>
<li><a href='#L56' title='Defined at 56.'>invalidate_inodes</a>
<li><a href='#L77' title='Defined at 77.'>sync_inodes</a>
<li><a href='#L96' title='Defined at 96.'>_bmap</a>
<li><a href='#L207' title='Defined at 207.'>bmap</a>
<li><a href='#L214' title='Defined at 214.'>create_block</a>
<li><a href='#L221' title='Defined at 221.'>iput</a>
<li><a href='#L283' title='Defined at 283.'>get_empty_inode</a>
<li><a href='#L335' title='Defined at 335.'>get_pipe_inode</a>
<li><a href='#L355' title='Defined at 355.'>iget</a>
<li><a href='#L426' title='Defined at 426.'>read_inode</a>
<li><a href='#L452' title='Defined at 452.'>write_inode</a>
</ol>
<hr>
<pre>
<a name='L1'><i><font color='green'>/*</font></i>
<a name='L2'><i><font color='green'>* linux/fs/inode.c</font></i>
<a name='L3'><i><font color='green'>*</font></i>
<a name='L4'><i><font color='green'>* (C) 1991 Linus Torvalds</font></i>
<a name='L5'><i><font color='green'>*/</font></i>
<a name='L6'>
<a name='L7'><font color='darkred'>#include</font> <<a href='42.html'>string.h</a>> <i><font color='green'>// 字符串头文件。主要定义了一些有关字符串操作的嵌入函数。</font></i>
<a name='L8'><font color='darkred'>#include</font> <<a href='43.html'>sys/stat.h</a>> <i><font color='green'>// 文件状态头文件。含有文件或文件系统状态结构stat{}和常量。</font></i>
<a name='L9'>
<a name='L10'><font color='darkred'>#include</font> <<a href='36.html'>linux/sched.h</a>> <i><font color='green'>// 调度程序头文件,定义了任务结构task_struct、初始任务0 的数据,</font></i>
<a name='L11'><i><font color='green'>// 还有一些有关描述符参数设置和获取的嵌入式汇编函数宏语句。</font></i>
<a name='L12'><font color='darkred'>#include</font> <<a href='34.html'>linux/kernel.h</a>> <i><font color='green'>// 内核头文件。含有一些内核常用函数的原形定义。</font></i>
<a name='L13'><font color='darkred'>#include</font> <<a href='35.html'>linux/mm.h</a>> <i><font color='green'>// 内存管理头文件。含有页面大小定义和一些页面释放函数原型。</font></i>
<a name='L14'><font color='darkred'>#include</font> <<a href='25.html'>asm/system.h</a>> <i><font color='green'>// 系统头文件。定义了设置或修改描述符/中断门等的嵌入式汇编宏。</font></i>
<a name='L15'>
<a name='L16'><b>struct</b> m_inode inode_table[<a href='../S/31.html#L60' title='Defined at 60 in include/linux/fs.h.'>NR_INODE</a>] = <font color='red'>{</font> <font color='red'>{</font>0,<font color='red'>}</font>, <font color='red'>}</font>; <i><font color='green'>// 内存中i 节点表(NR_INODE=32 项)。</font></i>
<a name='L17'>
<a name='L18'><b>static</b> <b>void</b> <a href='../S/12.html#L426' title='Defined at 426 in fs/inode.c.'>read_inode</a> (<b>struct</b> m_inode *inode);
<a name='L19'><b>static</b> <b>void</b> <a href='../S/12.html#L452' title='Defined at 452 in fs/inode.c.'>write_inode</a> (<b>struct</b> m_inode *inode);
<a name='L20'>
<a name='L21'><i><font color='green'>//// 等待指定的i 节点可用。</font></i>
<a name='L22'><i><font color='green'>// 如果i 节点已被锁定,则将当前任务置为不可中断的等待状态。直到该i 节点解锁。</font></i>
<a name='L23'><b>static</b> <b>inline</b> <b>void</b>
<a name='L24'><a href='../R/730.html' title='Multiple refered from 8 places.'>wait_on_inode</a> (<b>struct</b> m_inode *inode)
<a name='L25'><font color='red'>{</font>
<a name='L26'> <a href='../S/25.html#L15' title='Defined at 15 in include/asm/system.h.'>cli</a> ();
<a name='L27'> <b>while</b> (inode->i_lock)
<a name='L28'> <a href='../S/74.html#L219' title='Defined at 219 in kernel/sched.c.'>sleep_on</a> (&inode->i_wait);
<a name='L29'> <a href='../S/25.html#L14' title='Defined at 14 in include/asm/system.h.'>sti</a> ();
<a name='L30'><font color='red'>}</font>
<a name='L31'>
<a name='L32'><i><font color='green'>//// 对指定的i 节点上锁(锁定指定的i 节点)。</font></i>
<a name='L33'><i><font color='green'>// 如果i 节点已被锁定,则将当前任务置为不可中断的等待状态。直到该i 节点解锁,然后对其上锁。</font></i>
<a name='L34'><b>static</b> <b>inline</b> <b>void</b>
<a name='L35'><a href='../R/521.html' title='Multiple refered from 2 places.'>lock_inode</a> (<b>struct</b> m_inode *inode)
<a name='L36'><font color='red'>{</font>
<a name='L37'> <a href='../S/25.html#L15' title='Defined at 15 in include/asm/system.h.'>cli</a> ();
<a name='L38'> <b>while</b> (inode->i_lock)
<a name='L39'> <a href='../S/74.html#L219' title='Defined at 219 in kernel/sched.c.'>sleep_on</a> (&inode->i_wait);
<a name='L40'> inode->i_lock = 1; <i><font color='green'>// 置锁定标志。</font></i>
<a name='L41'> <a href='../S/25.html#L14' title='Defined at 14 in include/asm/system.h.'>sti</a> ();
<a name='L42'><font color='red'>}</font>
<a name='L43'>
<a name='L44'><i><font color='green'>//// 对指定的i 节点解锁。</font></i>
<a name='L45'><i><font color='green'>// 复位i 节点的锁定标志,并明确地唤醒等待此i 节点的进程。</font></i>
<a name='L46'><b>static</b> <b>inline</b> <b>void</b>
<a name='L47'><a href='../R/720.html' title='Multiple refered from 3 places.'>unlock_inode</a> (<b>struct</b> m_inode *inode)
<a name='L48'><font color='red'>{</font>
<a name='L49'> inode->i_lock = 0;
<a name='L50'> <a href='../S/74.html#L272' title='Defined at 272 in kernel/sched.c.'>wake_up</a> (&inode->i_wait);
<a name='L51'><font color='red'>}</font>
<a name='L52'>
<a name='L53'><i><font color='green'>//// 释放内存中设备dev 的所有i 节点。</font></i>
<a name='L54'><i><font color='green'>// 扫描内存中的i 节点表数组,如果是指定设备使用的i 节点就释放之。</font></i>
<a name='L55'><b>void</b>
<a name='L56'><a href='../S/6.html#L180' title='Refered from 180 in fs/buffer.c.'>invalidate_inodes</a> (<b>int</b> dev)
<a name='L57'><font color='red'>{</font>
<a name='L58'> <b>int</b> <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>;
<a name='L59'> <b>struct</b> m_inode *inode;
<a name='L60'>
<a name='L61'> inode = 0 + inode_table; <i><font color='green'>// 让指针首先指向i 节点表指针数组首项。</font></i>
<a name='L62'> <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> < <a href='../S/31.html#L60' title='Defined at 60 in include/linux/fs.h.'>NR_INODE</a>; <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>++, inode++)
<a name='L63'> <font color='red'>{</font> <i><font color='green'>// 扫描i 节点表指针数组中的所有i 节点。</font></i>
<a name='L64'> <a href='../S/12.html#L24' title='Defined at 24 in fs/inode.c.'>wait_on_inode</a> (inode); <i><font color='green'>// 等待该i 节点可用(解锁)。</font></i>
<a name='L65'> <b>if</b> (inode->i_dev == <a href='../S/7.html#L136' title='Defined at 136 in fs/char_dev.c.'>dev</a>)
<a name='L66'> <font color='red'>{</font> <i><font color='green'>// 如果是指定设备的i 节点,则</font></i>
<a name='L67'> <b>if</b> (inode->i_count) <i><font color='green'>// 如果其引用数不为0,则显示出错警告;</font></i>
<a name='L68'> <a href='../S/73.html#L30' title='Defined at 30 in kernel/printk.c.'>printk</a> ("inode in use on removed disk\n\r");
<a name='L69'> inode->i_dev = inode->i_dirt = 0; <i><font color='green'>// 释放该i 节点(置设备号为0 等)。</font></i>
<a name='L70'> <font color='red'>}</font>
<a name='L71'> <font color='red'>}</font>
<a name='L72'><font color='red'>}</font>
<a name='L73'>
<a name='L74'><i><font color='green'>//// 同步所有i 节点。</font></i>
<a name='L75'><i><font color='green'>// 同步内存与设备上的所有i 节点信息。</font></i>
<a name='L76'><b>void</b>
<a name='L77'><a href='../R/627.html' title='Multiple refered from 3 places.'>sync_inodes</a> (<b>void</b>)
<a name='L78'><font color='red'>{</font>
<a name='L79'> <b>int</b> <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>;
<a name='L80'> <b>struct</b> m_inode *inode;
<a name='L81'>
<a name='L82'> inode = 0 + inode_table; <i><font color='green'>// 让指针首先指向i 节点表指针数组首项。</font></i>
<a name='L83'> <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> < <a href='../S/31.html#L60' title='Defined at 60 in include/linux/fs.h.'>NR_INODE</a>; <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>++, inode++)
<a name='L84'> <font color='red'>{</font> <i><font color='green'>// 扫描i 节点表指针数组。</font></i>
<a name='L85'> <a href='../S/12.html#L24' title='Defined at 24 in fs/inode.c.'>wait_on_inode</a> (inode); <i><font color='green'>// 等待该i 节点可用(解锁)。</font></i>
<a name='L86'> <b>if</b> (inode->i_dirt && !inode->i_pipe) <i><font color='green'>// 如果该i 节点已修改且不是管道节点,</font></i>
<a name='L87'> <a href='../S/12.html#L452' title='Defined at 452 in fs/inode.c.'>write_inode</a> (inode); <i><font color='green'>// 则写盘。</font></i>
<a name='L88'> <font color='red'>}</font>
<a name='L89'><font color='red'>}</font>
<a name='L90'>
<a name='L91'><i><font color='green'>//// 文件数据块映射到盘块的处理操作。(block 位图处理函数,bmap - block map)</font></i>
<a name='L92'><i><font color='green'>// 参数:inode – 文件的i 节点;block – 文件中的数据块号;create - 创建标志。</font></i>
<a name='L93'><i><font color='green'>// 如果创建标志置位,则在对应逻辑块不存在时就申请新磁盘块。</font></i>
<a name='L94'><i><font color='green'>// 返回block 数据块对应在设备上的逻辑块号(盘块号)。</font></i>
<a name='L95'><b>static</b> <b>int</b>
<a name='L96'><a href='../R/369.html' title='Multiple refered from 2 places.'>_bmap</a> (<b>struct</b> m_inode *inode, <b>int</b> block, <b>int</b> create)
<a name='L97'><font color='red'>{</font>
<a name='L98'> <b>struct</b> buffer_head *bh;
<a name='L99'> <b>int</b> <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>;
<a name='L100'>
<a name='L101'><i><font color='green'>// 如果块号小于0,则死机。</font></i>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -