On Tue, 10 Oct 2017 14:32:54 +1100 Cyril Bur <cyril...@gmail.com> wrote:
> While this driver expects to interact asynchronously, OPAL is well > within its rights to return OPAL_SUCCESS to indicate that the operation > completed without the need for a callback. We shouldn't treat > OPAL_SUCCESS as an error rather we should wrap up and return promptly to > the caller. > > Signed-off-by: Cyril Bur <cyril...@gmail.com> Acked-by: Boris Brezillon <boris.brezil...@free-electrons.com> > --- > I'll note here that currently no OPAL exists that will return > OPAL_SUCCESS so there isn't the possibility of a bug today. > --- > drivers/mtd/devices/powernv_flash.c | 15 ++++++++++----- > 1 file changed, 10 insertions(+), 5 deletions(-) > > diff --git a/drivers/mtd/devices/powernv_flash.c > b/drivers/mtd/devices/powernv_flash.c > index f9ec38281ff2..ca3ca6adf71e 100644 > --- a/drivers/mtd/devices/powernv_flash.c > +++ b/drivers/mtd/devices/powernv_flash.c > @@ -63,7 +63,6 @@ static int powernv_flash_async_op(struct mtd_info *mtd, > enum flash_op op, > if (token < 0) { > if (token != -ERESTARTSYS) > dev_err(dev, "Failed to get an async token\n"); > - > return token; > } > > @@ -83,21 +82,25 @@ static int powernv_flash_async_op(struct mtd_info *mtd, > enum flash_op op, > return -EIO; > } > > + if (rc == OPAL_SUCCESS) > + goto out_success; > + > if (rc != OPAL_ASYNC_COMPLETION) { > dev_err(dev, "opal_flash_async_op(op=%d) failed (rc %d)\n", > op, rc); > - opal_async_release_token(token); > - return -EIO; > + rc = -EIO; > + goto out; > } > > rc = opal_async_wait_response(token, &msg); > - opal_async_release_token(token); > if (rc) { > dev_err(dev, "opal async wait failed (rc %d)\n", rc); > - return -EIO; > + rc = -EIO; > + goto out; > } > > rc = opal_get_async_rc(msg); > +out_success: > if (rc == OPAL_SUCCESS) { > rc = 0; > if (retlen) > @@ -106,6 +109,8 @@ static int powernv_flash_async_op(struct mtd_info *mtd, > enum flash_op op, > rc = -EIO; > } > > +out: > + opal_async_release_token(token); > return rc; > } >