【问题标题】:Changes in new linux kernel 4.4.2 distributed with SLES 12 SP2 causing driver build failure随 SLES 12 SP2 分发的新 linux 内核 4.4.2 中的更改导致驱动程序构建失败
【发布时间】:2017-11-13 18:37:36
【问题描述】:

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

  1. 结构 bvec_merge_data

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

    结构 bvec_merge_data { struct block_device *bi_bdev;
    扇区_t bi_sector;
    无符号 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 中删除 结构请求队列{

unprep_rq_fn *unprep_rq_fn;

merge_bvec_fn *merge_bvec_fn;

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

【问题讨论】:

    标签: linux-kernel linux-device-driver suse sles


    【解决方案1】:

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

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

    提交 8ae126660fddbeebb9251a174e6fa45b6ad8f932 作者:Kent Overstreet 日期:4 月 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.
    

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

    希望对你有帮助:)

    【讨论】:

    • 感谢@bytefire。我们将尝试它,如果有任何进一步的查询或发现有用的信息,我们会更新。
    • @Durgesh 实际上,后续提交消息会提供更多详细信息。例如。提交 0e28997ec476b 表示不需要生物拆分(这似乎与 bvec_merge_data 相关),因为现在可以处理任意大的 bios。您还可以通过git show <commit-hash> 了解其他人是如何处理删除 merge_bvec_fn 和结构的
    猜你喜欢
    • 2019-03-01
    • 2011-02-10
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    • 2017-05-18
    • 2016-04-23
    • 1970-01-01
    • 2014-02-05
    相关资源
    最近更新 更多