Linux的append函数,linux block层

本文详细介绍了Linux内核中的blk_rq_append_bio函数,该函数用于将bio挂载到请求队列rq。当rq无bio时,会调用blk_rq_bio_prep进行初始化。内容涉及bio_has_data检查、bio的链表管理和数据长度计算等关键步骤,揭示了Linux块层数据处理的内部机制。
摘要由CSDN通过智能技术生成

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,是否满足一定的操作命令。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值