📄 10.html
字号:
<a name='L67'> inode->i_atime = <a href='../S/36.html#L234' title='Defined at 234 in include/linux/sched.h.'>CURRENT_TIME</a>;
<a name='L68'> <b>return</b> (<a href='../D/738.html' title='Multiple defined in 17 places.'>count</a> - left) ? (<a href='../D/738.html' title='Multiple defined in 17 places.'>count</a> - left) : -<a href='../S/28.html#L29' title='Defined at 29 in include/errno.h.'>ERROR</a>;
<a name='L69'><font color='red'>}</font>
<a name='L70'>
<a name='L71'><i><font color='green'>//// 文件写函数 - 根据i 节点和文件结构信息,将用户数据写入指定设备。</font></i>
<a name='L72'><i><font color='green'>// 由i 节点可以知道设备号,由filp 结构可以知道文件中当前读写指针位置。buf 指定用户态中</font></i>
<a name='L73'><i><font color='green'>// 缓冲区的位置,count 为需要写入的字节数。返回值是实际写入的字节数,或出错号(小于0)。</font></i>
<a name='L74'><b>int</b>
<a name='L75'><a href='../R/451.html' title='Multiple refered from 2 places.'>file_write</a> (<b>struct</b> m_inode *inode, <b>struct</b> file *filp, <b>char</b> *buf, <b>int</b> count)
<a name='L76'><font color='red'>{</font>
<a name='L77'> <a href='../S/45.html#L32' title='Defined at 32 in include/sys/types.h.'>off_t</a> <a href='../D/915.html' title='Multiple defined in 9 places.'>pos</a>;
<a name='L78'> <b>int</b> block, c;
<a name='L79'> <b>struct</b> buffer_head *bh;
<a name='L80'> <b>char</b> *p;
<a name='L81'> <b>int</b> <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> = 0;
<a name='L82'>
<a name='L83'><i><font color='green'>/*</font></i>
<a name='L84'><i><font color='green'>* ok, append may not work when many processes are writing at the same time</font></i>
<a name='L85'><i><font color='green'>* but so what. That way leads to madness anyway.</font></i>
<a name='L86'><i><font color='green'>*/</font></i>
<a name='L87'><i><font color='green'>/*</font></i>
<a name='L88'><i><font color='green'>* ok,当许多进程同时写时,append 操作可能不行,但那又怎样。不管怎样那样做会</font></i>
<a name='L89'><i><font color='green'>* 导致混乱一团。</font></i>
<a name='L90'><i><font color='green'>*/</font></i>
<a name='L91'><i><font color='green'>// 如果是要向文件后添加数据,则将文件读写指针移到文件尾部。否则就将在文件读写指针处写入。</font></i>
<a name='L92'> <b>if</b> (filp->f_flags & <a href='../S/29.html#L18' title='Defined at 18 in include/fcntl.h.'>O_APPEND</a>)
<a name='L93'> <a href='../D/915.html' title='Multiple defined in 9 places.'>pos</a> = inode->i_size;
<a name='L94'> <b>else</b>
<a name='L95'> <a href='../D/915.html' title='Multiple defined in 9 places.'>pos</a> = filp->f_pos;
<a name='L96'><i><font color='green'>// 若已写入字节数i 小于需要写入的字节数count,则循环执行以下操作。</font></i>
<a name='L97'> <b>while</b> (<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> < <a href='../D/738.html' title='Multiple defined in 17 places.'>count</a>)
<a name='L98'> <font color='red'>{</font>
<a name='L99'><i><font color='green'>// 创建数据块号(pos/BLOCK_SIZE)在设备上对应的逻辑块,并返回在设备上的逻辑块号。如果逻辑</font></i>
<a name='L100'><i><font color='green'>// 块号=0,则表示创建失败,退出循环。</font></i>
<a name='L101'> <b>if</b> (!(block = <a href='../S/12.html#L214' title='Defined at 214 in fs/inode.c.'>create_block</a> (inode, <a href='../D/915.html' title='Multiple defined in 9 places.'>pos</a> / <a href='../D/23.html' title='Multiple defined in 2 places.'>BLOCK_SIZE</a>)))
<a name='L102'> <b>break</b>;
<a name='L103'><i><font color='green'>// 根据该逻辑块号读取设备上的相应数据块,若出错则退出循环。</font></i>
<a name='L104'> <b>if</b> (!(bh = <a href='../S/6.html#L397' title='Defined at 397 in fs/buffer.c.'>bread</a> (inode->i_dev, block)))
<a name='L105'> <b>break</b>;
<a name='L106'><i><font color='green'>// 求出文件读写指针在数据块中的偏移值c,将p 指向读出数据块缓冲区中开始读取的位置。置该</font></i>
<a name='L107'><i><font color='green'>// 缓冲区已修改标志。</font></i>
<a name='L108'> c = <a href='../D/915.html' title='Multiple defined in 9 places.'>pos</a> % <a href='../D/23.html' title='Multiple defined in 2 places.'>BLOCK_SIZE</a>;
<a name='L109'> p = c + bh->b_data;
<a name='L110'> bh->b_dirt = 1;
<a name='L111'><i><font color='green'>// 从开始读写位置到块末共可写入c=(BLOCK_SIZE-c)个字节。若c 大于剩余还需写入的字节数</font></i>
<a name='L112'><i><font color='green'>// (count-i),则此次只需再写入c=(count-i)即可。</font></i>
<a name='L113'> c = <a href='../D/23.html' title='Multiple defined in 2 places.'>BLOCK_SIZE</a> - c;
<a name='L114'> <b>if</b> (c > <a href='../D/738.html' title='Multiple defined in 17 places.'>count</a> - <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>)
<a name='L115'> c = <a href='../D/738.html' title='Multiple defined in 17 places.'>count</a> - <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>;
<a name='L116'><i><font color='green'>// 文件读写指针前移此次需写入的字节数。如果当前文件读写指针位置值超过了文件的大小,则</font></i>
<a name='L117'><i><font color='green'>// 修改i 节点中文件大小字段,并置i 节点已修改标志。</font></i>
<a name='L118'> <a href='../D/915.html' title='Multiple defined in 9 places.'>pos</a> += c;
<a name='L119'> <b>if</b> (<a href='../D/915.html' title='Multiple defined in 9 places.'>pos</a> > inode->i_size)
<a name='L120'> <font color='red'>{</font>
<a name='L121'> inode->i_size = <a href='../D/915.html' title='Multiple defined in 9 places.'>pos</a>;
<a name='L122'> inode->i_dirt = 1;
<a name='L123'> <font color='red'>}</font>
<a name='L124'><i><font color='green'>// 已写入字节计数累加此次写入的字节数c。从用户缓冲区buf 中复制c 个字节到高速缓冲区中p</font></i>
<a name='L125'><i><font color='green'>// 指向开始的位置处。然后释放该缓冲区。</font></i>
<a name='L126'> <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> += c;
<a name='L127'> <b>while</b> (c-- > 0)
<a name='L128'> *(p++) = <a href='../D/821.html' title='Multiple defined in 2 places.'>get_fs_byte</a> (<a href='../D/716.html' title='Multiple defined in 16 places.'>buf</a>++);
<a name='L129'> <a href='../S/6.html#L377' title='Defined at 377 in fs/buffer.c.'>brelse</a> (bh);
<a name='L130'> <font color='red'>}</font>
<a name='L131'><i><font color='green'>// 更改文件修改时间为当前时间。</font></i>
<a name='L132'> inode->i_mtime = <a href='../S/36.html#L234' title='Defined at 234 in include/linux/sched.h.'>CURRENT_TIME</a>;
<a name='L133'><i><font color='green'>// 如果此次操作不是在文件尾添加数据,则把文件读写指针调整到当前读写位置,并更改i 节点修改</font></i>
<a name='L134'><i><font color='green'>// 时间为当前时间。</font></i>
<a name='L135'> <b>if</b> (!(filp->f_flags & <a href='../S/29.html#L18' title='Defined at 18 in include/fcntl.h.'>O_APPEND</a>))
<a name='L136'> <font color='red'>{</font>
<a name='L137'> filp->f_pos = <a href='../D/915.html' title='Multiple defined in 9 places.'>pos</a>;
<a name='L138'> inode->i_ctime = <a href='../S/36.html#L234' title='Defined at 234 in include/linux/sched.h.'>CURRENT_TIME</a>;
<a name='L139'> <font color='red'>}</font>
<a name='L140'><i><font color='green'>// 返回写入的字节数,若写入字节数为0,则返回出错号-1。</font></i>
<a name='L141'> <b>return</b> (<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> ? <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> : -1);
<a name='L142'><font color='red'>}</font>
</pre>
<hr>
<a name='BOTTOM'>
<i><font color='green'>/* [<][>]<a href='#L22'>[^]</a><a href='#L75'>[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 + -