diff options
author | Kylene Hall <kjhall@us.ibm.com> | 2005-06-24 01:02:03 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-06-24 03:05:26 -0400 |
commit | 5e976d5557d3dd1e835b8be52e6201556dcfa052 (patch) | |
tree | 73f77bc349364eedbd2e3ceae8e9bf219f5bbd69 /drivers/char/tpm/tpm.c | |
parent | d9e5b6bf9cf19e6e9f2825228136ea17bc9a051a (diff) |
[PATCH] tpm: locking fixes
Add a missing lock in the register hardware and fix a misplaced lock release
release.
Signed-off-by: Kylene Hall <kjhall@us.ibm.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers/char/tpm/tpm.c')
-rw-r--r-- | drivers/char/tpm/tpm.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/drivers/char/tpm/tpm.c b/drivers/char/tpm/tpm.c index e7c1dedfe448..c6d985b04b6d 100644 --- a/drivers/char/tpm/tpm.c +++ b/drivers/char/tpm/tpm.c | |||
@@ -447,15 +447,15 @@ EXPORT_SYMBOL_GPL(tpm_open); | |||
447 | int tpm_release(struct inode *inode, struct file *file) | 447 | int tpm_release(struct inode *inode, struct file *file) |
448 | { | 448 | { |
449 | struct tpm_chip *chip = file->private_data; | 449 | struct tpm_chip *chip = file->private_data; |
450 | |||
451 | file->private_data = NULL; | ||
452 | 450 | ||
453 | spin_lock(&driver_lock); | 451 | spin_lock(&driver_lock); |
452 | file->private_data = NULL; | ||
454 | chip->num_opens--; | 453 | chip->num_opens--; |
455 | del_singleshot_timer_sync(&chip->user_read_timer); | 454 | del_singleshot_timer_sync(&chip->user_read_timer); |
456 | atomic_set(&chip->data_pending, 0); | 455 | atomic_set(&chip->data_pending, 0); |
457 | |||
458 | pci_dev_put(chip->pci_dev); | 456 | pci_dev_put(chip->pci_dev); |
457 | kfree(chip->data_buffer); | ||
458 | spin_unlock(&driver_lock); | ||
459 | return 0; | 459 | return 0; |
460 | } | 460 | } |
461 | 461 | ||
@@ -665,10 +665,14 @@ dev_num_search_complete: | |||
665 | return -ENODEV; | 665 | return -ENODEV; |
666 | } | 666 | } |
667 | 667 | ||
668 | spin_lock(&driver_lock); | ||
669 | |||
668 | pci_set_drvdata(pci_dev, chip); | 670 | pci_set_drvdata(pci_dev, chip); |
669 | 671 | ||
670 | list_add(&chip->list, &tpm_chip_list); | 672 | list_add(&chip->list, &tpm_chip_list); |
671 | 673 | ||
674 | spin_unlock(&driver_lock); | ||
675 | |||
672 | sysfs_create_group(&pci_dev->dev.kobj, chip->vendor->attr_group); | 676 | sysfs_create_group(&pci_dev->dev.kobj, chip->vendor->attr_group); |
673 | 677 | ||
674 | return 0; | 678 | return 0; |