1

我正在使用 3.x 内核在内核版本为 4.4.2 的 SLES 12 SP2 上构建我的 SLES 12 驱动程序(块设备驱动程序)。现在我面临一些问题:

  1. 结构 bvec_merge_data

    在 include/linux/blkdev.h 的内核 4.3.0 及以后版本中不可用

    struct bvec_merge_data { struct block_device *bi_bdev;
    扇区_t 双扇区;
    无符号bi_size;
    无符号长 bi_rw; };

  2. 从 4.2.8 开始,此函数指针不存在。4.3 或更高版本中提供了可能的替代方法。

typedef int (merge_bvec_fn) (struct request_queue *, struct bvec_merge_data *, struct bio_vec *);

  1. 在 request_queue 结构中,从 4.2.8 中删除了以下结构元素,其中处理了这些元素 struct request_queue {

unprep_rq_fn *unprep_rq_fn;

合并bvec_fn *merge_bvec_fn;

知道我在哪里可以找到这些变化以及这些变化的任何替代方案吗?

4

1 回答 1

1

获得此类答案的最佳位置是内核源代码的 git log。提供 -S 开关将在 diff 内容中进行搜索。提供 -G 将做同样的事情,但使用正则表达式。

在这种情况下,运行git log -S "bvec_merge_data"显示与此结构相关的更改信息,并通过关联显示merge_bvec_fn方法。这是关于完全删除 struct的顶部消息的快照bvec_merge_data

提交 8ae126660fddbeebb9251a174e6fa45b6ad8f932 作者:Kent Overstreet 日期:Mon Apr 27 23:48:34 2015 -0700

block: kill merge_bvec_fn() completely

As generic_make_request() is now able to handle arbitrarily sized bios,
it's no longer necessary for each individual block driver to define its
own ->merge_bvec_fn() callback. Remove every invocation completely.

在此之前的其他提交消息显示了它的构建,这可以很好地逐步解释您的问题。

希望能帮助到你 :)

于 2017-06-12T10:46:19.140 回答