NFS系统read调用过程(五)

本文详细探讨了NFS系统read调用过程,从nfs_readpages()开始,讲解了缓存页如何添加到文件缓存,nfs_pageio_descriptor结构如何组织缓存页,以及如何通过nfs_pageio_complete()和pg_doio()函数向服务器请求数据。重点介绍了nfs_generic_pg_readpages()的步骤,包括创建nfs_read_header结构,初始化nfs_pgio_header,分配nfs_read_data结构并发起READ请求,以及最后的收尾工作。
摘要由CSDN通过智能技术生成

    这篇文章接着讲解nfs_readpages()的流程。上篇文章中,我们讲到了read_cache_pages()将缓存页添加到文件缓存的radix树中,为每个缓存页创建了一个nfs_page结构,然后将这些缓存页链接到nfs_pageio_descriptor结构中。nfs_pageio_descriptor中包含了多个缓存页以及向服务器请求数据的函数集合。接下来就是调用nfs_pageio_descriptor中的函数向服务器请求数据了,这是通过函数nfs_pageio_complete()实现的,这个函数最终调用的是nfs_pageio_descriptor结构中pg_ops字段中的函数pg_doio(),读操作中,这个函数是nfs_generic_pg_readpages()。

static int nfs_generic_pg_readpages(struct nfs_pageio_descriptor *desc)
{
        struct nfs_read_header *rhdr;
        struct nfs_pgio_header *hdr;
        int ret;

        // 步骤1   创建一个nfs_read_header结构
        rhdr = nfs_readhdr_alloc();
        if (!rhdr) {    // 创建rhdr失败了,不能处理desc中的缓存页了,需要释放这些缓存页
                desc->pg_completion_ops->error_cleanup(&desc->pg_list);
                return -ENOMEM;
        }

        // 步骤2   初始化hdr
        hdr = &rhdr->header;            // 找到nfs_pgio_header结构
        // 根据desc结构中的信息初始化hdr,向hdr中添加了nfs_page结构,
        // 设置了hdr->completion_ops、inode、io_start、good_bytes
        // nfs_readhdr_free用来释放nfs_read_header结构占用的内存
        nfs_pgheader_init(desc, hdr, nfs_readhdr_free);
        atom
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值