From: Kevin Wolf <kwolf@redhat.com>
To: Josh Durgin <josh.durgin@inktank.com>
Cc: qemu-devel@nongnu.org, Stefan Hajnoczi <stefanha@redhat.com>
Subject: Re: [Qemu-devel] [PATCH 2/2] rbd: disable unsupported librbd functions at runtime
Date: Thu, 4 Apr 2013 12:10:33 +0200 [thread overview]
Message-ID: <20130404101033.GD3060@dhcp-200-207.str.redhat.com> (raw)
In-Reply-To: <1365064515-23222-2-git-send-email-josh.durgin@inktank.com>
Am 04.04.2013 um 10:35 hat Josh Durgin geschrieben:
> QEMU may be compiled against a newer version of librbd, but run and
> dynamically linked with an older version that does not support these
> functions. Declare them as weak symbols so they can be checked for
> existence at runtime.
>
> Only rbd_aio_discard, rbd_aio_flush, and rbd_flush were added after
> the initial version of librbd, so only they need to be checked.
>
> Signed-off-by: Josh Durgin <josh.durgin@inktank.com>
> ---
> block/rbd.c | 19 +++++++++++++++++++
> 1 file changed, 19 insertions(+)
>
> diff --git a/block/rbd.c b/block/rbd.c
> index 037d82b..69a339a 100644
> --- a/block/rbd.c
> +++ b/block/rbd.c
> @@ -44,6 +44,15 @@
> * leading "\".
> */
>
> +/*
> + * Treat newer librbd functions as weak symbols so we can detect
> + * whether they're supported at runtime, and disable their use
> + * if they aren't available.
> + */
> +#pragma weak rbd_aio_discard
> +#pragma weak rbd_aio_flush
> +#pragma weak rbd_flush
> +
> /* rbd_aio_discard added in 0.1.2 */
> #if LIBRBD_VERSION_CODE >= LIBRBD_VERSION(0, 1, 2)
> #define LIBRBD_SUPPORTS_DISCARD
> @@ -970,6 +979,7 @@ static BlockDriver bdrv_rbd = {
> .bdrv_aio_readv = qemu_rbd_aio_readv,
> .bdrv_aio_writev = qemu_rbd_aio_writev,
>
> + /* select which of these to use at runtime in bdrv_rbd_init */
> .bdrv_aio_flush = qemu_rbd_aio_flush,
> .bdrv_co_flush_to_disk = qemu_rbd_co_flush,
>
> @@ -985,6 +995,15 @@ static BlockDriver bdrv_rbd = {
>
> static void bdrv_rbd_init(void)
> {
> + if (!rbd_flush || rbd_aio_flush) {
> + bdrv_rbd.bdrv_co_flush_to_disk = NULL;
> + }
> + if (!rbd_aio_flush) {
> + bdrv_rbd.bdrv_aio_flush = NULL;
> + }
> + if (!rbd_aio_discard) {
> + bdrv_rbd.bdrv_aio_discard = NULL;
> + }
> bdrv_register(&bdrv_rbd);
> }
After searching the net a bit and trying out some things myself, I'm
afraid that this approach doesn't work. It does seem to do the right
thing when build and runtime version are the same, but new build -> old
runtime segfaults (because the symbol doesn't become NULL) and old build
-> new runtime segfaults (because the symbol stays NULL). Unless I
missed some build option that is different in qemu than in my test
program.
So it looks as if you had to use dlsym() instead.
Kevin
next prev parent reply other threads:[~2013-04-04 10:10 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-03-29 7:59 [Qemu-devel] [PATCH] rbd: add an asynchronous flush Josh Durgin
2013-03-29 20:03 ` [Qemu-devel] [PATCH v2] " Josh Durgin
2013-04-02 14:10 ` Kevin Wolf
2013-04-04 8:35 ` [Qemu-devel] [PATCH v3 1/2] " Josh Durgin
2013-04-04 8:35 ` [Qemu-devel] [PATCH 2/2] rbd: disable unsupported librbd functions at runtime Josh Durgin
2013-04-04 10:10 ` Kevin Wolf [this message]
2013-04-04 16:50 ` Josh Durgin
2013-04-05 9:31 ` Kevin Wolf
2013-04-10 0:05 ` [Qemu-devel] [PATCH v3 2/2] rbd: link and load librbd dynamically Josh Durgin
2013-04-10 8:09 ` Stefan Hajnoczi
2013-04-10 14:52 ` [Qemu-devel] runtime Block driver modules (was Re: [PATCH v3 2/2] rbd: link and load librbd dynamically) Josh Durgin
2013-04-10 15:08 ` [Qemu-devel] [PATCH v3 2/2] rbd: link and load librbd dynamically Anthony Liguori
2013-04-10 21:19 ` Paolo Bonzini
2013-04-11 8:04 ` Stefan Hajnoczi
2013-04-11 7:59 ` Stefan Hajnoczi
2013-06-21 18:42 ` Sage Weil
2013-06-21 19:08 ` Alex Bligh
2013-06-21 19:13 ` Anthony Liguori
2013-04-10 14:03 ` [Qemu-devel] [PATCH v2] rbd: add an asynchronous flush Josh Durgin
2013-04-11 8:02 ` Stefan Hajnoczi
2013-04-11 8:48 ` Kevin Wolf
2013-04-11 17:19 ` Josh Durgin
2013-04-12 6:50 ` Kevin Wolf
2013-04-12 7:42 ` Stefan Hajnoczi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20130404101033.GD3060@dhcp-200-207.str.redhat.com \
--to=kwolf@redhat.com \
--cc=josh.durgin@inktank.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).