All of lore.kernel.org
 help / color / mirror / Atom feed
From: Nishanth Aravamudan <naravamudan@digitalocean.com>
To: Fam Zheng <famz@redhat.com>
Cc: Eric Blake <eblake@redhat.com>, Kevin Wolf <kwolf@redhat.com>,
	John Snow <jsnow@redhat.com>, Max Reitz <mreitz@redhat.com>,
	Stefan Hajnoczi <stefanha@redhat.com>,
	Paolo Bonzini <pbonzini@redhat.com>,
	qemu-block@nongnu.org, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH v3 1/2] linux-aio: properly bubble up errors from initialization
Date: Fri, 22 Jun 2018 10:12:07 -0700	[thread overview]
Message-ID: <20180622171207.GA20261@breakout> (raw)
In-Reply-To: <20180622022119.GA5449@lemon.usersys.redhat.com>

On 22.06.2018 [10:21:19 +0800], Fam Zheng wrote:
> On Thu, 06/21 15:21, Nishanth Aravamudan wrote:
> > laio_init() can fail for a couple of reasons, which will lead to a NULL
> > pointer dereference in laio_attach_aio_context().
> > 
> > To solve this, add a aio_setup_linux_aio() function which is called
> > early in raw_open_common. If this fails, propagate the error up. The
> > signature of aio_get_linux_aio() was not modified, because it seems
> > preferable to return the actual errno from the possible failing
> > initialization calls.
> > 
> > Add an assert that aio_get_linux_aio() cannot return NULL.
> > 
> > Signed-off-by: Nishanth Aravamudan <naravamudan@digitalocean.com>
> > ---
> > Changes from v2 -> v3 (thanks to Eric Blake and Kevin Wolf for review):
> > 
> > Use a boolean false rather than 0 in assignment to use_linux_aio.
> > Drop ending '.' from error_report() calls.
> > Fix typo in commit message (propogates -> propagates).
> > Move aio_setup_linux_aio call to raw_open_common.
> > 
> > Changes from v1 -> v2 (thanks to Kevin Wolf for review):
> > 
> > Rather than affect virtio-scsi/blk at all, make all the changes internal
> > to file-posix.c. Thanks to Kevin Wolf for the suggested change.
> > 
> >  block/file-posix.c      | 17 ++++++++++++-----
> >  block/linux-aio.c       | 15 ++++++++++-----
> >  include/block/aio.h     |  3 +++
> >  include/block/raw-aio.h |  2 +-
> >  stubs/linux-aio.c       |  2 +-
> >  util/async.c            | 16 +++++++++++++---
> >  6 files changed, 40 insertions(+), 15 deletions(-)
> > 
> > diff --git a/block/file-posix.c b/block/file-posix.c
> > index 07bb061fe4..6a1714d4a8 100644
> > --- a/block/file-posix.c
> > +++ b/block/file-posix.c
> > @@ -545,11 +545,18 @@ static int raw_open_common(BlockDriverState *bs, QDict *options,
> >  
> >  #ifdef CONFIG_LINUX_AIO
> >       /* Currently Linux does AIO only for files opened with O_DIRECT */
> > -    if (s->use_linux_aio && !(s->open_flags & O_DIRECT)) {
> > -        error_setg(errp, "aio=native was specified, but it requires "
> > -                         "cache.direct=on, which was not specified.");
> > -        ret = -EINVAL;
> > -        goto fail;
> > +    if (s->use_linux_aio) {
> > +        if (!(s->open_flags & O_DIRECT)) {
> > +            error_setg(errp, "aio=native was specified, but it requires "
> > +                             "cache.direct=on, which was not specified.");
> > +            ret = -EINVAL;
> > +            goto fail;
> > +        }
> > +        ret = aio_setup_linux_aio(bdrv_get_aio_context(bs));
> > +        if (ret != 0) {
> > +            error_setg(errp, "Unable to setup native AIO context.");
> > +            goto fail;
> > +        }
> >      }
> >  #else
> >      if (s->use_linux_aio) {
> > diff --git a/block/linux-aio.c b/block/linux-aio.c
> > index 88b8d55ec7..4d799f85fe 100644
> > --- a/block/linux-aio.c
> > +++ b/block/linux-aio.c
> > @@ -470,28 +470,33 @@ void laio_attach_aio_context(LinuxAioState *s, AioContext *new_context)
> >                             qemu_laio_poll_cb);
> >  }
> >  
> > -LinuxAioState *laio_init(void)
> > +int laio_init(LinuxAioState **linux_aio)
> >  {
> > +    int rc;
> >      LinuxAioState *s;
> >  
> >      s = g_malloc0(sizeof(*s));
> > -    if (event_notifier_init(&s->e, false) < 0) {
> > +    rc = event_notifier_init(&s->e, false);
> > +    if (rc < 0) {
> 
> It would be nice if the error message could distinguish this error...
> 
> >          goto out_free_state;
> >      }
> >  
> > -    if (io_setup(MAX_EVENTS, &s->ctx) != 0) {
> > +    rc = io_setup(MAX_EVENTS, &s->ctx);
> > +    if (rc != 0) {
> 
> ... from this one. And it also makes sense to propagate the errno back with
> error_setg_errno.
> 
> To do this, add an "Error **errp" parameter to the function and you
> can keep the return type (LinuxAioState *).

Thank you for this suggestion! I will send out a v4 with this and your
other feedback integrated.

-Nish

  reply	other threads:[~2018-06-22 17:12 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-06-21 22:21 [Qemu-devel] [PATCH v3 0/2] linux-aio: fix two NULL pointer dereferences failure paths Nishanth Aravamudan
2018-06-21 22:21 ` [Qemu-devel] [PATCH v3 1/2] linux-aio: properly bubble up errors from initialization Nishanth Aravamudan
2018-06-22  2:21   ` Fam Zheng
2018-06-22 17:12     ` Nishanth Aravamudan [this message]
2018-06-21 22:21 ` [Qemu-devel] [PATCH v3 2/2] block/file-posix: reconfigure aio on iothread start Nishanth Aravamudan
2018-06-22  2:25   ` Fam Zheng
2018-06-22  9:02     ` Kevin Wolf
2018-06-22 17:12       ` Nishanth Aravamudan

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=20180622171207.GA20261@breakout \
    --to=naravamudan@digitalocean.com \
    --cc=eblake@redhat.com \
    --cc=famz@redhat.com \
    --cc=jsnow@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=mreitz@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-block@nongnu.org \
    --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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.