Commit c4484f79 authored by Jason Gunthorpe's avatar Jason Gunthorpe Committed by Jarkko Sakkinen

tpm: vtpm_proxy: conditionally call tpm_chip_unregister

If tpm_chip_register fails vtpm must not call tpm_chip_unregister:

> [   58.271017]  [<ffffffff8155bd32>] dpm_sysfs_remove+0x22/0x60
> [   58.271017]  [<ffffffff8154e438>] device_del+0x58/0x280
> [   58.271017]  [<ffffffffa024c020>] tpm_chip_unregister+0x40/0xb0 [tpm]
> [   58.271017]  [<ffffffffa0292360>] vtpm_proxy_fops_release+0x40/0x60 [tpm_vtpm_proxy]

[jarkko.sakkinen@linux.intel.com: cleaned up unneeded goto away]
Signed-off-by: default avatarJason Gunthorpe <jgunthorpe@obsidianresearch.com>
Tested-by: default avatarStefan Berger <stefanb@linux.vnet.ibm.com>
Reviewed-by: default avatarJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Tested-by: default avatarJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Signed-off-by: default avatarJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
parent 0cf577a0
...@@ -42,6 +42,7 @@ struct proxy_dev { ...@@ -42,6 +42,7 @@ struct proxy_dev {
long state; /* internal state */ long state; /* internal state */
#define STATE_OPENED_FLAG BIT(0) #define STATE_OPENED_FLAG BIT(0)
#define STATE_WAIT_RESPONSE_FLAG BIT(1) /* waiting for emulator response */ #define STATE_WAIT_RESPONSE_FLAG BIT(1) /* waiting for emulator response */
#define STATE_REGISTERED_FLAG BIT(2)
size_t req_len; /* length of queued TPM request */ size_t req_len; /* length of queued TPM request */
size_t resp_len; /* length of queued TPM response */ size_t resp_len; /* length of queued TPM response */
...@@ -370,12 +371,9 @@ static void vtpm_proxy_work(struct work_struct *work) ...@@ -370,12 +371,9 @@ static void vtpm_proxy_work(struct work_struct *work)
rc = tpm_chip_register(proxy_dev->chip); rc = tpm_chip_register(proxy_dev->chip);
if (rc) if (rc)
goto err; vtpm_proxy_fops_undo_open(proxy_dev);
else
return; proxy_dev->state |= STATE_REGISTERED_FLAG;
err:
vtpm_proxy_fops_undo_open(proxy_dev);
} }
/* /*
...@@ -516,7 +514,8 @@ static void vtpm_proxy_delete_device(struct proxy_dev *proxy_dev) ...@@ -516,7 +514,8 @@ static void vtpm_proxy_delete_device(struct proxy_dev *proxy_dev)
*/ */
vtpm_proxy_fops_undo_open(proxy_dev); vtpm_proxy_fops_undo_open(proxy_dev);
tpm_chip_unregister(proxy_dev->chip); if (proxy_dev->state & STATE_REGISTERED_FLAG)
tpm_chip_unregister(proxy_dev->chip);
vtpm_proxy_delete_proxy_dev(proxy_dev); vtpm_proxy_delete_proxy_dev(proxy_dev);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment