Le Sunday 26 Jan 2014 à 20:02:40 (+0100), Max Reitz a écrit : > The fail paths of bdrv_file_open() and bdrv_open() naturally exhibit > similarities, thus it is possible to reuse the one from bdrv_open() and > shorten the one in bdrv_file_open() accordingly. > > Signed-off-by: Max Reitz <mre...@redhat.com> > --- > block.c | 17 +++++++---------- > 1 file changed, 7 insertions(+), 10 deletions(-) > > diff --git a/block.c b/block.c > index 72eddd5..0f2cd3f 100644 > --- a/block.c > +++ b/block.c > @@ -1038,9 +1038,6 @@ static int bdrv_file_open(BlockDriverState *bs, const > char *filename, > > fail: > QDECREF(options); > - if (!bs->drv) { > - QDECREF(bs->options); > - } > return ret; > } > > @@ -1240,17 +1237,17 @@ int bdrv_open(BlockDriverState **pbs, const char > *filename, > if (flags & BDRV_O_PROTOCOL) { > assert(!drv); > ret = bdrv_file_open(bs, filename, options, flags & ~BDRV_O_PROTOCOL, > - errp); > + &local_err); > + options = NULL; > if (ret) { > - if (*pbs) { > - bdrv_close(bs); > + if (bs->drv) { > + goto close_and_fail; > } else { > - bdrv_unref(bs); > + goto fail; > } > - } else { > - *pbs = bs; > }
Forget what I said about the goto chain in the previous mail. But something like: if(!ret) { *pbs = bs; return 0; } if (bs->drv) { goto close_and_fail; } goto fail; would keep the code in line. Best regards Benoît > + *pbs = bs; > + return 0; > } > > bs->options = options; > -- > 1.8.5.3 > >