通用块层学习2 从页高速缓存到通用块层bio的代码流程

来源:互联网 发布:常用的mac论文软件 编辑:程序博客网 时间:2024/05/21 09:21
submit_bh(int rw, struct buffer_head * bh)    =>bio = bio_alloc(GFP_NOIO, 1);//申请1个bio    //初始化bio    =>bio->bi_sector = bh->b_blocknr * (bh->b_size >> 9);//需要数据传输的起始逻辑扇区号(相对于分区)    bio->bi_bdev = bh->b_bdev;    bio->bi_io_vec[0].bv_page = bh->b_page;    bio->bi_io_vec[0].bv_len = bh->b_size;    bio->bi_io_vec[0].bv_offset = bh_offset(bh);    bio->bi_vcnt = 1;//第一个bio只有一个vec,后续加入到集合里面    bio->bi_idx = 0;    bio->bi_size = bh->b_size;//需要传输数据的大小    bio->bi_end_io = end_bio_bh_io_sync;    bio->bi_private = bh;    =>bio_get(bio);    =>submit_bio(rw, bio);//下发块驱动        =>bio->bi_rw |= rw;        =>generic_make_request(bio);        =>do {            ==>current->bio_list = bio->bi_next;            ==>if (bio->bi_next == NULL)                current->bio_tail = &current->bio_list;            ==>else                bio->bi_next = NULL;            ==>__generic_make_request(bio);                =>if (maxsector < nr_sectors || maxsector - nr_sectors < sector)                    handle_bad_sector(bio);                =>do {                    ==>q = bdev_get_queue(bio->bi_bdev);                    ==>blk_partition_remap(bio);//bio的sector和b_size更新,相对于整个磁盘,因为卡驱动看不到分区                    ==>ret = q->make_request_fn(q, bio);                        ||                        \/                    q->make_request_fn = mfn; //在函数void blk_queue_make_request(struct request_queue * q, make_request_fn * mfn)                        ||                        \/                      blk_queue_make_request(q, __make_request);//在函数blk_init_queue_node(request_fn_proc *rfn, spinlock_t *lock, int node_id)                            =>__make_request //switch各种调度算法                         } while (ret);            ==>bio = current->bio_list;        } while (bio);        =>current->bio_tail = NULL;    =>bio_put(bio);

参考
向通用块层提交IO请求
http://blog.chinaunix.net/uid-28897358-id-3776947.html

原创粉丝点击