以前的实现方式: 递归式的,但是在内核中递归是一个非常危险的举动, 所以把它实现成非递归的
数据结构:
struct md_bio_pair {
struct list_head bio_head;
struct bio *oldbio;
atomic_t count;
int err;
};
本来打算用bio自己的bi_next将bio串在一起的,但是后面的代码中使用了bi_next, 所以只能用一个新的链表,把要切分的bio串起来。
函数如下:
int do_split(struct bio *bio, struct asd_io_context *ioctx)
{
struct md_bio_pair *bp;
int chksize, split_offset, first_flag = 1, i=0, sum=0, ret = 0;
unsigned int remaining = bio->bi_size >> SECTOR_BITS, len;
unsigned short start_idx = 0;
struct bio *clone;
sector_t next_sec;
struct list_head *pos = NULL;
struct big_bio *tmp_big = NULL;
chksize = ioctx->chunk_size;
split_offset = chksize - (bio->bi_sector & (chksize - 1));
bp = mempool_alloc(asd_sys.src.biopair_mempool,GFP_NOIO);
if(IS_ERR(bp)){
klog(ERROR,"do_split fail\n");
}
memset(bp, 0, sizeof(struct md_bio_pair));