linux 块层学习

1. blk-map.c代码中的函数

blk_rq_append_bio

int blk_rq_append_bio(struct request *rq, struct bio *bio)

{

if (!rq->bio) { //yyf: rq中无bio时

blk_rq_bio_prep(rq->q, rq, bio);

} else {

if (!ll_back_merge_fn(rq->q, rq, bio))

return -EINVAL;

rq->biotail->bi_next = bio;

rq->biotail = bio;

rq->__data_len += bio->bi_iter.bi_size;

}

return 0;

}

EXPORT_SYMBOL(blk_rq_append_bio);

blk_rq_append_bio的功能是挂个bio到rq,如果rq中已经存在bio了,则直接更新rq->biotail指向的最后一个bio的bi_next指针,并更新biotail指针和__data_len长度。

当rq中无bio时,执行blk_rq_bio_prep函数:

void blk_rq_bio_prep(struct request_queue *q, struct request *rq,

struct bio *bio)

{

if (bio_has_data(bio)) //yyf: 如果有数据的话,则赋值rq的nr_phys_segments

rq->nr_phys_segments = bio_phys_segments(q, bio);

rq->__data_len = bio->bi_iter.bi_size;

rq->bio = rq->biotail = bio; //yyf: bio挂入rq链表

if (bio->bi_bdev)

rq->rq_disk = bio->bi_bdev->bd_disk;

}

bio_has_data判断bio是否携带数据,在头文件中inline定义:

/*

* Check whether this bio carries any data or not. A NULL bio is allowed.

*/

static inline bool bio_has_data(struct bio *bio)

{

if (bio &&

bio->bi_iter.bi_size &&

bio_op(bio) != REQ_OP_DISCARD &&

bio_op(bio) != REQ_OP_SECURE_ERASE &&

bio_op(bio) != REQ_OP_WRITE_ZEROES)

return true;

return false;

}

bio_has_data函数很简单,就是判断bio是否存在,是否有bi_size,是否满足一定的操作命令。

Linux的append函数,linux block层相关推荐

  1. linux c 绝对值函数,linux c 简介

    --- title: linux c 简介 date: 2020-07-19 updated: 2020-07-19 --- # Preface # todo linux c http://blog. ...

  2. linux下wait函数,Linux wait函数详解

    wait和waitpid出现的原因 SIGCHLD --当子进程退出的时候,内核会向父进程SIGCHLD信号,子进程的退出是个异步事件(子进程可以在父进程运行的任何时刻终止) --子进程退出时,内核将 ...

  3. linux使用模板函数,Linux常用C函数

    Linux常用C函数Tag内容描述: 1.Linux常用C函数 接口处理篇 accept(接受socket连线) 相关函数 socket,bind,listen,connect 表头文件 #inclu ...

  4. Linux中append函数的用法,linux C代码 open函数参数:O_APPEND问题求助

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 没有截图,直接上代码吧. 原代码是这样的: #include #include #include #include #include int main() ...

  5. linux vfs open函数,Linux VFS中open系统调用实现原理

    用户空间的函数在内核里面的入口函数是sys_open 通过grep open /usr/include/asm/unistd_64.h查找到的 #define __NR_open2 __SYSCALL ...

  6. linux进程号函数,linux进程

    一.进程的含义 进程是运行中的程序,进程是操作系统资源分配的基本单位/最小单位. 进程在内存,程序在硬盘(程序代码在硬盘,运行时转存到内存) 同时运行2个程序时,它们是运行在物理内存的2个互不相关的地 ...

  7. linux的readir函数,Linux编程--readdir

    作用 在Linux中, readdir是常用来遍历文件夹下的文件 使用方法 通常readdir都是与opendir配合使用. 通过opendir打开的目录, 使用readdir来进行遍历读取 #inc ...

  8. linux下sig_pipe函数,linux socket编程 出现信号SIGPIPE,分析及解决

    在编写一个仿QQ软件,C/S模式.出现的问题:当客户机关闭时,服务器也随着关闭,纠结很久之后,我gdb了下,出现下面提示信息: Program received signal SIGPIPE, Bro ...

  9. linux下sigaction函数,Linux sigaction函数 sa_flags的值

    开始对sa_flags有疑问,网上搜到都是这一个程序,就复制来说事: 代码: 1 #include 2 #include 3 #include 4 #include 5 6 void show_han ...

  10. linux 文件操作函数,Linux下的文件操作函数及creat用法

    编写Linux应用程序要用到如下工具: (1)编译器:GCC GCC是Linux平台下最重要的开发工具,它是GNU的C和C++编译器,其基本用法为:gcc [options] [filenames]. ...

最新文章

  1. 二分类变量相关性分析spss_spss:两个有序分类变量的相关分析『kendallstau-b相关系数』...
  2. 什么是java序列化_什么是Java序列化?为什么序列化?序列化有哪些方式?
  3. git 提交跳过检查
  4. kubernetes(二)k8s组件
  5. PHP培训选云和数据,送给云和数据郑州分中心PHP培训班全体学员的祝福
  6. 知识图谱中的关系方向与强度研究
  7. Vue:net::ERR_CONNECTION_REFUSED
  8. Maven使用注解配置SQL映射器(@Select,@Insert,@Update,@Delete)
  9. Redis实战(七)
  10. 深入研究java.lang.Runtime类,Process类
  11. SparkStreaming 是火还是坑?
  12. Gson之TypeAdapterFactory
  13. 获取微信小程序码的“47001”错误码的坑,errmsg:data format error hint
  14. 关于xpath解析网页中tbody问题
  15. 数学三次方的计算机符号,数学符号三次方
  16. 我的 C# 学习经验分享
  17. 【毕业设计】基于超声波智能跟随小车 - 单片机 物联网 stm32 c51
  18. 仿网易云音乐的滑动冲突处理效果
  19. 根据火车的出发时间和到达时间,编写程序计算整个旅途所用的时间。
  20. Mybatis报错:Could not resolve type alias

热门文章

  1. 力扣-1143 最长公共子序列/1035 不相交的线
  2. JavaWeb 基础系列篇
  3. eclipse没有server选项怎么解决
  4. Linux(Fedora 20) EFI 启动Windows出错 \EFI\Microsoft\Boot\bootmgfw.efi is missing
  5. JAVA 基础 /第六课: 面向对象 / JAVA中的类和对象
  6. CCF-201703-1 分蛋糕
  7. vim源码编译启用python
  8. 详解如何挑战4秒内百万级数据导入SQL Server(转)
  9. $《第一行代码:Android》读书笔记——第5章 Broadcast
  10. 判断进程是否正在运行