All of lore.kernel.org
 help / color / mirror / Atom feed
From: Max Reitz <mreitz@redhat.com>
To: Jeff Cody <jcody@redhat.com>
Cc: Kevin Wolf <kwolf@redhat.com>,
	qemu-devel@nongnu.org, Stefan Hajnoczi <stefanha@redhat.com>
Subject: Re: [Qemu-devel] [PATCH 09/10] block: Reuse success path from bdrv_open()
Date: Mon, 27 Jan 2014 20:06:50 +0100	[thread overview]
Message-ID: <52E6AE4A.4060304@redhat.com> (raw)
In-Reply-To: <20140127174414.GB28138@localhost.localdomain>

On 27.01.2014 18:44, Jeff Cody wrote:
> On Sun, Jan 26, 2014 at 08:02:42PM +0100, Max Reitz wrote:
>> The fail and success paths of bdrv_file_open() may be further shortened
>> by reusing code already existent in bdrv_open(). This includes
>> bdrv_file_open() not taking the reference to options which allows the
>> removal of QDECREF(options) in that function.
>>
>> Signed-off-by: Max Reitz <mreitz@redhat.com>
>> ---
>>   block.c | 33 ++++++++++++---------------------
>>   1 file changed, 12 insertions(+), 21 deletions(-)
>>
>> diff --git a/block.c b/block.c
>> index f847c4b..b1bae23 100644
>> --- a/block.c
>> +++ b/block.c
>> @@ -943,9 +943,7 @@ free_and_fail:
>>    * Opens a file using a protocol (file, host_device, nbd, ...)
>>    *
>>    * options is a QDict of options to pass to the block drivers, or NULL for an
>> - * empty set of options. The reference to the QDict belongs to the block layer
>> - * after the call (even on failure), so if the caller intends to reuse the
>> - * dictionary, it needs to use QINCREF() before calling bdrv_file_open.
>> + * empty set of options.
>>    */
>>   static int bdrv_file_open(BlockDriverState *bs, const char *filename,
>>                             QDict *options, int flags, Error **errp)
>> @@ -1010,8 +1008,8 @@ static int bdrv_file_open(BlockDriverState *bs, const char *filename,
>>       }
>>   
>>       if (!drv->bdrv_file_open) {
>> +        QINCREF(options);
>>           ret = bdrv_open(&bs, filename, NULL, options, flags, drv, &local_err);
>> -        options = NULL;
>>       } else {
>>           ret = bdrv_open_common(bs, NULL, options, flags, drv, &local_err);
>>       }
>> @@ -1020,21 +1018,10 @@ static int bdrv_file_open(BlockDriverState *bs, const char *filename,
>>           goto fail;
>>       }
>>   
>> -    /* Check if any unknown options were used */
>> -    if (options && (qdict_size(options) != 0)) {
>> -        const QDictEntry *entry = qdict_first(options);
>> -        error_setg(errp, "Block protocol '%s' doesn't support the option '%s'",
>> -                   drv->format_name, entry->key);
>> -        ret = -EINVAL;
>> -        goto fail;
>> -    }
>> -    QDECREF(options);
>> -
>>       bs->growable = 1;
>>       return 0;
>>   
>>   fail:
>> -    QDECREF(options);
>>       return ret;
>>   }
>>   
>> @@ -1238,7 +1225,6 @@ int bdrv_open(BlockDriverState **pbs, const char *filename,
>>           assert(!drv);
>>           ret = bdrv_file_open(bs, filename, options, flags & ~BDRV_O_PROTOCOL,
>>                                &local_err);
>> -        options = NULL;
>>           if (ret) {
>>               if (bs->drv) {
>>                   goto close_and_fail;
>> @@ -1246,8 +1232,7 @@ int bdrv_open(BlockDriverState **pbs, const char *filename,
>>                   goto fail;
>>               }
>>           }
>> -        *pbs = bs;
>> -        return 0;
>> +        goto done;
>>       }
>>   
>>       /* For snapshot=on, create a temporary qcow2 overlay */
>> @@ -1377,12 +1362,18 @@ int bdrv_open(BlockDriverState **pbs, const char *filename,
>>           }
>>       }
>>   
>> +done:
>>       /* Check if any unknown options were used */
>>       if (qdict_size(options) != 0) {
>>           const QDictEntry *entry = qdict_first(options);
>> -        error_setg(errp, "Block format '%s' used by device '%s' doesn't "
>> -                   "support the option '%s'", drv->format_name, bs->device_name,
>> -                   entry->key);
>> +        if (flags & BDRV_O_PROTOCOL) {
>> +            error_setg(errp, "Block protocol '%s' doesn't support the option "
>> +                       "'%s'", drv->format_name, entry->key);
> Tests 071 and 072 segfault, and gdb shows that it occurs here.  More
> investigation shows that entry is NULL, although qdict_size() is
> returning 1.

Hm, and I thought I'd run the tests, but obviously I did not for this 
final version… The problem is probably the QINCREF(). Hm, I really want 
to reuse this test; the only way I see then is to make the options 
parameter of bdrv_file_open() an indirect pointer so it can be set to 
NULL after bdrv_open() (in bdrv_file_open()). That would not be very 
pretty, but it would work and there wouldn't be two tests whether all 
options could be handled.

Thanks for catching this,

Max

>> +        } else {
>> +            error_setg(errp, "Block format '%s' used by device '%s' doesn't "
>> +                       "support the option '%s'", drv->format_name,
>> +                       bs->device_name, entry->key);
>> +        }
>>   
>>           ret = -EINVAL;
>>           goto close_and_fail;
>> -- 
>> 1.8.5.3
>>
>>

  reply	other threads:[~2014-01-27 19:05 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-01-26 19:02 [Qemu-devel] [PATCH 00/10] block: Integrate bdrv_file_open() into bdrv_open() Max Reitz
2014-01-26 19:02 ` [Qemu-devel] [PATCH 01/10] block: Change BDS parameter of bdrv_open() to ** Max Reitz
2014-01-27  2:38   ` Benoît Canet
2014-01-27 18:51     ` Max Reitz
2014-01-27 19:31   ` Jeff Cody
2014-01-27 19:35     ` Max Reitz
2014-01-29 11:50   ` Kevin Wolf
2014-01-31 20:07     ` Max Reitz
2014-02-03  9:49       ` Kevin Wolf
2014-01-26 19:02 ` [Qemu-devel] [PATCH 02/10] block: Add reference parameter to bdrv_open() Max Reitz
2014-01-26 19:02 ` [Qemu-devel] [PATCH 03/10] block: Make bdrv_file_open() static Max Reitz
2014-01-27  2:51   ` Benoît Canet
2014-01-29 13:26   ` Kevin Wolf
2014-01-31 20:20     ` Max Reitz
2014-02-03 10:05       ` Kevin Wolf
2014-01-26 19:02 ` [Qemu-devel] [PATCH 04/10] block: Reuse NULL options check from bdrv_open() Max Reitz
2014-01-27  2:52   ` Benoît Canet
2014-01-26 19:02 ` [Qemu-devel] [PATCH 05/10] block: Reuse reference handling " Max Reitz
2014-01-27  2:56   ` Benoît Canet
2014-01-26 19:02 ` [Qemu-devel] [PATCH 06/10] block: Remove bdrv_new() from bdrv_file_open() Max Reitz
2014-01-27  3:04   ` Benoît Canet
2014-01-29 13:35   ` Kevin Wolf
2014-01-31 20:21     ` Max Reitz
2014-01-26 19:02 ` [Qemu-devel] [PATCH 07/10] block: Reuse fail path from bdrv_open() Max Reitz
2014-01-27  3:10   ` Benoît Canet
2014-01-27 18:58     ` Max Reitz
2014-01-29 13:40   ` Kevin Wolf
2014-01-26 19:02 ` [Qemu-devel] [PATCH 08/10] block: Reuse bs->options setting " Max Reitz
2014-01-27  3:13   ` Benoît Canet
2014-01-29 13:45   ` Kevin Wolf
2014-01-31 20:25     ` Max Reitz
2014-01-26 19:02 ` [Qemu-devel] [PATCH 09/10] block: Reuse success path " Max Reitz
2014-01-27 17:44   ` Jeff Cody
2014-01-27 19:06     ` Max Reitz [this message]
2014-01-26 19:02 ` [Qemu-devel] [PATCH 10/10] block: Remove bdrv_open_image()'s force_raw option Max Reitz

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=52E6AE4A.4060304@redhat.com \
    --to=mreitz@redhat.com \
    --cc=jcody@redhat.com \
    --cc=kwolf@redhat.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 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.