Messages in this thread | | | Subject | Re: [PATCH v11 08/16] tpm: clean up tpm_try_transmit() error handling flow | From | Stefan Berger <> | Date | Thu, 7 Feb 2019 18:36:59 -0500 |
| |
On 2/5/19 5:47 PM, Jarkko Sakkinen wrote: > Move locking, locality handling and power management to tpm_transmit() > in order to simplify the flow. > > Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> > Reviewed-by: Stefan Berger <stefanb@linux.ibm.com> > Tested-by: Stefan Berger <stefanb@linux.ibm.com> > Reviewed-by: Jerry Snitselaar <jsnitsel@redhat.com> > Reviewed-by: James Bottomley <James.Bottomley@HansenPartnership.com> > --- > drivers/char/tpm/tpm-interface.c | 94 +++++++++++++++----------------- > drivers/char/tpm/tpm.h | 1 + > drivers/char/tpm/tpm2-space.c | 2 +- > 3 files changed, 45 insertions(+), 52 deletions(-) > > diff --git a/drivers/char/tpm/tpm-interface.c b/drivers/char/tpm/tpm-interface.c > index c28ffef92f1a..f5f5224f68b0 100644 > --- a/drivers/char/tpm/tpm-interface.c > +++ b/drivers/char/tpm/tpm-interface.c > @@ -167,7 +167,6 @@ static ssize_t tpm_try_transmit(struct tpm_chip *chip, struct tpm_space *space, > ssize_t len = 0; > u32 count, ordinal; > unsigned long stop; > - bool need_locality; > > rc = tpm_validate_command(chip, space, buf, bufsiz); > if (rc == -EINVAL) > @@ -197,37 +196,16 @@ static ssize_t tpm_try_transmit(struct tpm_chip *chip, struct tpm_space *space, > return -E2BIG; > } > > - if (!(flags & TPM_TRANSMIT_UNLOCKED) && !(flags & TPM_TRANSMIT_NESTED)) > - mutex_lock(&chip->tpm_mutex); > - > - if (chip->ops->clk_enable != NULL) > - chip->ops->clk_enable(chip, true); > - > - /* Store the decision as chip->locality will be changed. */ > - need_locality = chip->locality == -1; > - > - if (need_locality) { > - rc = tpm_request_locality(chip, flags); > - if (rc < 0) { > - need_locality = false; > - goto out_locality; > - } > - } > - > - rc = tpm_cmd_ready(chip, flags); > - if (rc) > - goto out_locality; > - > rc = tpm2_prepare_space(chip, space, ordinal, buf); > if (rc) > - goto out; > + return rc; > > rc = chip->ops->send(chip, buf, count); > if (rc < 0) { > if (rc != -EPIPE) > dev_err(&chip->dev, > "%s: tpm_send: error %d\n", __func__, rc); > - goto out; > + goto out_rc; > } > > if (chip->flags & TPM_CHIP_FLAG_IRQ) > @@ -243,7 +221,7 @@ static ssize_t tpm_try_transmit(struct tpm_chip *chip, struct tpm_space *space, > if (chip->ops->req_canceled(chip, status)) { > dev_err(&chip->dev, "Operation Canceled\n"); > rc = -ECANCELED; > - goto out; > + goto out_rc; > } > > tpm_msleep(TPM_TIMEOUT_POLL); > @@ -253,40 +231,20 @@ static ssize_t tpm_try_transmit(struct tpm_chip *chip, struct tpm_space *space, > chip->ops->cancel(chip); > dev_err(&chip->dev, "Operation Timed out\n"); > rc = -ETIME; > - goto out; > + goto out_rc; > > out_recv: > len = chip->ops->recv(chip, buf, bufsiz); > if (len < 0) { > rc = len; > - dev_err(&chip->dev, > - "tpm_transmit: tpm_recv: error %d\n", rc); > - goto out; > - } else if (len < TPM_HEADER_SIZE) { > + dev_err(&chip->dev, "tpm_transmit: tpm_recv: error %d\n", rc); > + } else if (len < TPM_HEADER_SIZE || len != be32_to_cpu(header->length)) > rc = -EFAULT; > - goto out; > - }
Add an else branch here for 'rc = 0' because it is otherwise set from 'rc = chip->ops->send(chip, buf, count);'. Or add it further above...
| |