NFS系统read调用过程(四)

本文深入剖析了NFS系统read调用过程中的nfs_readpages()函数,重点讨论了read_cache_pages()函数的使用,以及readpage_async_filler函数中的步骤。详细阐述了nfs_pageio_add_request()在添加缓存页到请求链表时的处理逻辑,包括对新请求是否能与现有请求连续的判断函数nfs_can_coalesce_requests()的分析。
摘要由CSDN通过智能技术生成

        接着前面的内容讲,这篇文章主要介绍了nfs_readpages()函数中的步骤4,步骤4中包含下面一条语句

ret = read_cache_pages(mapping, pages, readpage_async_filler, &desc);

read_cache_pages()是一个通用函数(不是NFS中的函数),这个函数定义在mm/readahead.c,这个函数的完整定义如下:

参数mapping: 这是文件缓存的数据结构

参数pages: 这是一个链表,链表中保存的是缓存页,缓存页中的index字段必须已经设置好了

参数filler: 这是一个函数指针,对链表中每一个缓存页执行函数filler

参数data: 这是供filler使用的参数

int read_cache_pages(struct address_space *mapping, struct list_head *pages,
                        int (*filler)(void *, struct page *), void *data)
{
        struct page *page;
        int ret = 0;

        while (!list_empty(pages)) {    // 处理链表中每一个缓存页
                page = list_to_page(pages);     // 从链表中取出一个缓存页
                list_del(&page->lru);
                // 将缓存页添加到radix树中,然后添加到lru链表中.
                // page->index是缓存页在文件中的索引值
                // 这个函数会增加缓存页的引用计数
                if (add_to_page_cache_lru(page, mapping,
                                        page->index, GFP_KERNEL)) {
                        // 添加缓存页失败了,需要释放这个缓存页.
                        read_cache_pages_invalidate_page(mapping, page);
                        continue;
                }
                // 由于add_to_page_cache_lru()增加了缓存页的引用计数,
                // 这里需要减少引用计数.
                page_cache_release(page);       

           
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值