Linux的append函数,linux block层
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层相关推荐
- linux c 绝对值函数,linux c 简介
--- title: linux c 简介 date: 2020-07-19 updated: 2020-07-19 --- # Preface # todo linux c http://blog. ...
- linux下wait函数,Linux wait函数详解
wait和waitpid出现的原因 SIGCHLD --当子进程退出的时候,内核会向父进程SIGCHLD信号,子进程的退出是个异步事件(子进程可以在父进程运行的任何时刻终止) --子进程退出时,内核将 ...
- linux使用模板函数,Linux常用C函数
Linux常用C函数Tag内容描述: 1.Linux常用C函数 接口处理篇 accept(接受socket连线) 相关函数 socket,bind,listen,connect 表头文件 #inclu ...
- Linux中append函数的用法,linux C代码 open函数参数:O_APPEND问题求助
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 没有截图,直接上代码吧. 原代码是这样的: #include #include #include #include #include int main() ...
- linux vfs open函数,Linux VFS中open系统调用实现原理
用户空间的函数在内核里面的入口函数是sys_open 通过grep open /usr/include/asm/unistd_64.h查找到的 #define __NR_open2 __SYSCALL ...
- linux进程号函数,linux进程
一.进程的含义 进程是运行中的程序,进程是操作系统资源分配的基本单位/最小单位. 进程在内存,程序在硬盘(程序代码在硬盘,运行时转存到内存) 同时运行2个程序时,它们是运行在物理内存的2个互不相关的地 ...
- linux的readir函数,Linux编程--readdir
作用 在Linux中, readdir是常用来遍历文件夹下的文件 使用方法 通常readdir都是与opendir配合使用. 通过opendir打开的目录, 使用readdir来进行遍历读取 #inc ...
- linux下sig_pipe函数,linux socket编程 出现信号SIGPIPE,分析及解决
在编写一个仿QQ软件,C/S模式.出现的问题:当客户机关闭时,服务器也随着关闭,纠结很久之后,我gdb了下,出现下面提示信息: Program received signal SIGPIPE, Bro ...
- linux下sigaction函数,Linux sigaction函数 sa_flags的值
开始对sa_flags有疑问,网上搜到都是这一个程序,就复制来说事: 代码: 1 #include 2 #include 3 #include 4 #include 5 6 void show_han ...
- linux 文件操作函数,Linux下的文件操作函数及creat用法
编写Linux应用程序要用到如下工具: (1)编译器:GCC GCC是Linux平台下最重要的开发工具,它是GNU的C和C++编译器,其基本用法为:gcc [options] [filenames]. ...
最新文章
- 二分类变量相关性分析spss_spss:两个有序分类变量的相关分析『kendallstau-b相关系数』...
- 什么是java序列化_什么是Java序列化?为什么序列化?序列化有哪些方式?
- git 提交跳过检查
- kubernetes(二)k8s组件
- PHP培训选云和数据,送给云和数据郑州分中心PHP培训班全体学员的祝福
- 知识图谱中的关系方向与强度研究
- Vue:net::ERR_CONNECTION_REFUSED
- Maven使用注解配置SQL映射器(@Select,@Insert,@Update,@Delete)
- Redis实战(七)
- 深入研究java.lang.Runtime类,Process类
- SparkStreaming 是火还是坑?
- Gson之TypeAdapterFactory
- 获取微信小程序码的“47001”错误码的坑,errmsg:data format error hint
- 关于xpath解析网页中tbody问题
- 数学三次方的计算机符号,数学符号三次方
- 我的 C# 学习经验分享
- 【毕业设计】基于超声波智能跟随小车 - 单片机 物联网 stm32 c51
- 仿网易云音乐的滑动冲突处理效果
- 根据火车的出发时间和到达时间,编写程序计算整个旅途所用的时间。
- Mybatis报错:Could not resolve type alias
热门文章
- 力扣-1143 最长公共子序列/1035 不相交的线
- JavaWeb 基础系列篇
- eclipse没有server选项怎么解决
- Linux(Fedora 20) EFI 启动Windows出错 \EFI\Microsoft\Boot\bootmgfw.efi is missing
- JAVA 基础 /第六课: 面向对象 / JAVA中的类和对象
- CCF-201703-1 分蛋糕
- vim源码编译启用python
- 详解如何挑战4秒内百万级数据导入SQL Server(转)
- $《第一行代码:Android》读书笔记——第5章 Broadcast
- 判断进程是否正在运行