bio.c

xiaoxiao2021-02-28  141

1 bio_add_page

函数功能:把page加入bio的bio_vec链表

参数:bio-目标bio;page-待加入的page;len-加入长度;offset-在页中偏移地址;

            注意到bio->bi_vec的结构,后三个参数用来给bio->bi_vec赋值

/*include/linux/blk_types.h*/ struct bio_vec { struct page *bv_page; unsigned int bv_len; unsigned int bv_offset; };

函数定义

/** * bio_add_page - attempt to add page to bio * @bio: destination bio * @page: page to add * @len: vec entry length * @offset: vec entry offset * * Attempt to add a page to the bio_vec maplist. This will only fail * if either bio->bi_vcnt == bio->bi_max_vecs or it's a cloned bio. */ int bio_add_page(struct bio *bio, struct page *page, unsigned int len, unsigned int offset) { struct bio_vec *bv; /* * cloned bio must not modify vec list */ if (WARN_ON_ONCE(bio_flagged(bio, BIO_CLONED))) return 0; /* * For filesystems with a blocksize smaller than the pagesize * we will often be called with the same page as last time and * a consecutive offset. Optimize this special case. */ if (bio->bi_vcnt > 0) { bv = &bio->bi_io_vec[bio->bi_vcnt - 1]; if (page == bv->bv_page && offset == bv->bv_offset + bv->bv_len) { bv->bv_len += len; goto done; } } if (bio->bi_vcnt >= bio->bi_max_vecs) return 0; bv = &bio->bi_io_vec[bio->bi_vcnt]; bv->bv_page = page; bv->bv_len = len; bv->bv_offset = offset; bio->bi_vcnt++; done: bio->bi_iter.bi_size += len; return len; } EXPORT_SYMBOL(bio_add_page);

比如raid5-cache.c中,bio_add_page(io->current_bio, io->meta_page, PAGE_SIZE, 0),就是把整页meta_page加到current_bio上面,所以页内偏移(第四个参数offset)是0。

           

转载请注明原文地址: https://www.6miu.com/read-68851.html

最新回复(0)