aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason Gunthorpe <jgunthorpe@obsidianresearch.com>2016-11-19 13:32:55 -0500
committerJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>2016-11-27 18:31:33 -0500
commitc4484f791c9434445db7fc1d6791af4388756479 (patch)
tree72f50b826ac2740d0395b2e0a29926ddc5dc5316
parent0cf577a03f21a988f6dbe8133d07410967b8489a (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.c13
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
377err:
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}