From: David Smith Date: Tue, 29 Aug 2017 21:27:23 +0000 (-0500) Subject: Fix PR22036 by handling "struct bio" kernel changes. X-Git-Tag: release-3.2~79 X-Git-Url: https://sourceware.org/git/?a=commitdiff_plain;h=f630ccfbdaebdd05f223780428e64b035338b7da;p=systemtap.git Fix PR22036 by handling "struct bio" kernel changes. * buildrun.cxx (compile_pass): Add "autoconf"-style test for bi_opf field of the "bio" structure. * runtime/linux/autoconf-bio-bi_opf.c: New file. * tapset/linux/ioblock.stp (bio_op): Use new STAPCONF_BIO_BI_OPF define. --- diff --git a/buildrun.cxx b/buildrun.cxx index 53643e2dd..dd0759344 100644 --- a/buildrun.cxx +++ b/buildrun.cxx @@ -463,6 +463,7 @@ compile_pass (systemtap_session& s) "STAPCONF_GET_USER_PAGES_REMOTE_FLAGS_LOCKED", NULL); output_autoconf(s, o, "autoconf-uapi-linux-sched-types.c", "STAPCONF_UAPI_LINUX_SCHED_TYPES", NULL); + output_autoconf(s, o, "autoconf-bio-bi_opf.c", "STAPCONF_BIO_BI_OPF", NULL); // used by runtime/linux/netfilter.c output_exportconf(s, o, "nf_register_hook", "STAPCONF_NF_REGISTER_HOOK"); diff --git a/runtime/linux/autoconf-bio-bi_opf.c b/runtime/linux/autoconf-bio-bi_opf.c new file mode 100644 index 000000000..20db781f3 --- /dev/null +++ b/runtime/linux/autoconf-bio-bi_opf.c @@ -0,0 +1,27 @@ +#include + +/* + * Handle the following kernel commit: + * + * commit 1eff9d322a444245c67515edb52bc0eb68374aa8 + * Author: Jens Axboe + * Date: Fri Aug 5 15:35:16 2016 -0600 + * + * block: rename bio bi_rw to bi_opf + * + * Since commit 63a4cc24867d, bio->bi_rw contains flags in the lower + * portion and the op code in the higher portions. This means that + * old code that relies on manually setting bi_rw is most likely + * going to be broken. Instead of letting that brokeness linger, + * rename the member, to force old and out-of-tree code to break + * at compile time instead of at runtime. + * + * No intended functional changes in this commit. + */ + +void bar (void) +{ + struct bio foo; + foo.bi_opf = 0; + (void) foo; +} diff --git a/tapset/linux/ioblock.stp b/tapset/linux/ioblock.stp index 317a99093..e6798fc6d 100644 --- a/tapset/linux/ioblock.stp +++ b/tapset/linux/ioblock.stp @@ -19,7 +19,7 @@ /* Returns the REQ_OP_* bits for a bio structure. */ function bio_op:long(bio:long) %{ /* pure */ /* unprivileged */ -#if defined(bio_op) +#if defined(STAPCONF_BIO_BI_OPF) struct bio *bio = (struct bio *)(uintptr_t)STAP_ARG_bio; STAP_RETVALUE = 0;