文档章节

generic_file_aio_read()

认真即可
 认真即可
发布于 2015/11/27 15:01
字数 501
阅读 414
收藏 0

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

mm/filemap.c:

1565 /**
1566  * generic_file_aio_read - generic filesystem read routine
1567  * @iocb:   kernel I/O control block
1568  * @iov:    io vector request
1569  * @nr_segs:    number of segments in the iovec
1570  * @pos:    current file position
1571  *
1572  * This is the "read()" routine for all filesystems
1573  * that can use the page cache directly.
1574  */
1575 ssize_t
1576 generic_file_aio_read(struct kiocb *iocb, const struct iovec *iov,
1577         unsigned long nr_segs, loff_t pos)
1578 {
// nr_segs=1
1579     struct file *filp = iocb->ki_filp;
1580     ssize_t retval;
1581     unsigned long seg = 0;
1582     size_t count;
1583     loff_t *ppos = &iocb->ki_pos;
1584 
1585     count = 0;
1586     retval = generic_segment_checks(iov, &nr_segs, &count, VERIFY_WRITE);
1587     if (retval)
1588         return retval;
1589 
1590     /* coalesce the iovecs and go direct-to-BIO for O_DIRECT */
1591     if (kiocb_is_direct(iocb)) {
1592         loff_t size;
1593         struct address_space *mapping;
1594         struct inode *inode;
1595 
1596         mapping = filp->f_mapping;
1597         inode = mapping->host;
1598         if (!count)
1599             goto out; /* skip atime */
1600         size = i_size_read(inode);
1601         if (pos < size) {
1602             retval = filemap_write_and_wait_range(mapping, pos,
1603                     pos + iov_length(iov, nr_segs) - 1);
1604             if (!retval) {
1605                 struct blk_plug plug;
1606 
1607                 blk_start_plug(&plug);
1608                 retval = mapping->a_ops->direct_IO(READ, iocb,
1609                             iov, pos, nr_segs);
1610                 blk_finish_plug(&plug);
1611             }
1612             if (retval > 0) {
1613                 *ppos = pos + retval;
1614                 count -= retval;
1615             }
1616 
1617             /*
1618              * Btrfs can have a short DIO read if we encounter
1619              * compressed extents, so if there was an error, or if
1620              * we've already read everything we wanted to, or if
1621              * there was a short read because we hit EOF, go ahead
1622              * and return.  Otherwise fallthrough to buffered io for
1623              * the rest of the read.
1624              */
1625             if (retval < 0 || !count || *ppos >= size) {
1626                 file_accessed(filp);
1627                 goto out;
1628             }
1629         }
1630     }
1631 
//直到这里是我们关心的;
//count = retval = 0
1632     count = retval;
1633     for (seg = 0; seg < nr_segs; seg++) {
//read_descriptor_t用来跟踪读的最新状况,一个封装起来通用的数据结构,能使有些代码也复用起来
1634         read_descriptor_t desc;
1635         loff_t offset = 0;
1636 
1637         /*
1638          * If we did a short DIO read we need to skip the section of the
1639          * iov that we've already read data into.
1640          */
1641         if (count) {
1642             if (count > iov[seg].iov_len) {
1643                 count -= iov[seg].iov_len;
1644                 continue;
1645             }
1646             offset = count;
1647             count = 0;
1648         }
1649 
1650         desc.written = 0;
1651         desc.arg.buf = iov[seg].iov_base + offset;
1652         desc.count = iov[seg].iov_len - offset;
1653         if (desc.count == 0)
1654             continue;
1655         desc.error = 0;
//do_generic_file_read()是主角,包括file_read_actor(),单独分析
1656         do_generic_file_read(filp, ppos, &desc, file_read_actor);
1657         retval += desc.written;
1658         if (desc.error) {
1659             retval = retval ?: desc.error;
1660             break;
1661         }
//如果这个if语句成立,应该表示读不到更多内容,就结束
1662         if (desc.count > 0)
1663             break;
1664     }
1665 out:
1666     return retval;
1667 }
1668 EXPORT_SYMBOL(generic_file_aio_read);


© 著作权归作者所有

上一篇: do_generic_file_read()
下一篇: ocfs2_file_aio_read()
认真即可
粉丝 5
博文 103
码字总数 47805
作品 0
朝阳
程序员
私信 提问
linux读文件过程-3.10.0-Start From read

从系统调用read开始, 其系统调用实现如下,传入的参数是打开的文件句柄,用户区缓冲池,读取长度: SYSCALLDEFINE3(read, unsigned int, fd, char user *, buf, sizet, count) { struct fd f...

binarydady
2018/06/08
0
0
linux文件系统实现原理简述

[摘要] [背景] [正文] [总结] 注意:请使用谷歌浏览器阅读(IE浏览器排版混乱) 【摘要】 本文将以jffs2文件系统的访问过程为例,从全局视角,介绍一下linux文件系统的实现机理。本文不追...

eleven_xiy
2017/05/06
0
0
Linux 中直接 I/O 机制的介绍

Linux 中直接 I/O 机制的介绍 简介: 对于传统的操作系统来说,普通的 I/O 操作一般会被内核缓存,这种 I/O 被称作缓存 I/O。本文所介绍的文件访问机制不经过操作系统内核的缓存,数据直接在...

慎思
2012/07/27
796
1
linux异步IO浅析【转】

知道异步IO已经很久了,但是直到最近,才真正用它来解决一下实际问题(在一个CPU密集型的应用中,有一些需要处理的数据可能放在磁盘上。预先知道这些数据的位置,所以预先发起异步IO读请求。...

文艺小青年
2017/05/11
0
0
Linux I/O子系统框架图

I/O write I/O read: read系统调用的处理分为用户空间和内核空间处理两部分。其中,用户空间处理只是通过0x80中断陷入内核,接着调用其中断服务例程,即sysread以进入内核处理流程。 对于rea...

满小茂
2015/12/31
343
0

没有更多内容

加载失败,请刷新页面

加载更多

在C语言中“静态”是什么意思?

我已经在C代码的不同地方看到了static一词。 这就像C#中的静态函数/类(实现在对象之间共享)吗? #1楼 多文件变量作用域示例 在这里,我说明了静态如何影响多个文件中函数定义的范围。 交流...

javail
25分钟前
15
0
利用 FC + OSS 快速搭建 Serverless 实时按需图像处理服务

作者:泽尘 简介 随着具有不同屏幕尺寸和分辨率设备的爆炸式增长,开发人员经常需要提供各种尺寸的图像,从而确保良好的用户体验。目前比较常见的做法是预先为一份图像存放多份具有不同尺寸的...

阿里巴巴云原生
27分钟前
14
0
前端架构最佳实践

Folders-by-Feature Structure 胜过 Folders-by-Type Structure

lilugirl
38分钟前
11
0
Seata AT 模式启动源码分析

从上一篇文章「分布式事务中间件Seata的设计原理」讲了下 Seata AT 模式的一些设计原理,从中也知道了 AT 模式的三个角色(RM、TM、TC),接下来我会更新 Seata 源码分析系列文章。今天就来分...

后端进阶
39分钟前
19
0
Python中“自我”一词的目的是什么?

Python中self词的目的是什么? 我知道它是指从该类创建的特定对象,但是我看不到为什么要将它显式地作为参数添加到每个函数中。 为了说明这一点,在Ruby中,我可以这样做: class myClass ...

技术盛宴
41分钟前
16
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部