diff options
author | Jason Gunthorpe <jgunthorpe@obsidianresearch.com> | 2016-11-19 13:32:55 -0500 |
---|---|---|
committer | Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> | 2016-11-27 18:31:33 -0500 |
commit | c4484f791c9434445db7fc1d6791af4388756479 (patch) | |
tree | 72f50b826ac2740d0395b2e0a29926ddc5dc5316 | |
parent | 0cf577a03f21a988f6dbe8133d07410967b8489a (diff) |
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: Jason Gunthorpe <jgunthorpe@obsidianresearch.com>
Tested-by: Stefan Berger <stefanb@linux.vnet.ibm.com>
Reviewed-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Tested-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
-rw-r--r-- | drivers/char/tpm/tpm_vtpm_proxy.c | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/drivers/char/tpm/tpm_vtpm_proxy.c b/drivers/char/tpm/tpm_vtpm_proxy.c index 3d6f6ca81def..5463b58af26e 100644 --- a/drivers/char/tpm/tpm_vtpm_proxy.c +++ b/drivers/char/tpm/tpm_vtpm_proxy.c | |||
@@ -42,6 +42,7 @@ struct proxy_dev { | |||
42 | long state; /* internal state */ | 42 | long state; /* internal state */ |
43 | #define STATE_OPENED_FLAG BIT(0) | 43 | #define STATE_OPENED_FLAG BIT(0) |
44 | #define STATE_WAIT_RESPONSE_FLAG BIT(1) /* waiting for emulator response */ | 44 | #define STATE_WAIT_RESPONSE_FLAG BIT(1) /* waiting for emulator response */ |
45 | #define STATE_REGISTERED_FLAG BIT(2) | ||
45 | 46 | ||
46 | size_t req_len; /* length of queued TPM request */ | 47 | size_t req_len; /* length of queued TPM request */ |
47 | size_t resp_len; /* length of queued TPM response */ | 48 | size_t resp_len; /* length of queued TPM response */ |
@@ -370,12 +371,9 @@ static void vtpm_proxy_work(struct work_struct *work) | |||
370 | 371 | ||
371 | rc = tpm_chip_register(proxy_dev->chip); | 372 | rc = tpm_chip_register(proxy_dev->chip); |
372 | if (rc) | 373 | if (rc) |
373 | goto err; | 374 | vtpm_proxy_fops_undo_open(proxy_dev); |
374 | 375 | else | |
375 | return; | 376 | proxy_dev->state |= STATE_REGISTERED_FLAG; |
376 | |||
377 | err: | ||
378 | vtpm_proxy_fops_undo_open(proxy_dev); | ||
379 | } | 377 | } |
380 | 378 | ||
381 | /* | 379 | /* |
@@ -516,7 +514,8 @@ static void vtpm_proxy_delete_device(struct proxy_dev *proxy_dev) | |||
516 | */ | 514 | */ |
517 | vtpm_proxy_fops_undo_open(proxy_dev); | 515 | vtpm_proxy_fops_undo_open(proxy_dev); |
518 | 516 | ||
519 | tpm_chip_unregister(proxy_dev->chip); | 517 | if (proxy_dev->state & STATE_REGISTERED_FLAG) |
518 | tpm_chip_unregister(proxy_dev->chip); | ||
520 | 519 | ||
521 | vtpm_proxy_delete_proxy_dev(proxy_dev); | 520 | vtpm_proxy_delete_proxy_dev(proxy_dev); |
522 | } | 521 | } |