From: Kylene Hall Add a missing lock in the register hardware and fix a misplaced lock release release. Signed-off-by: Kylene Hall Signed-off-by: Andrew Morton --- drivers/char/tpm/tpm.c | 10 +++++++--- 1 files changed, 7 insertions(+), 3 deletions(-) diff -puN drivers/char/tpm/tpm.c~fix-tpm-driver-locks drivers/char/tpm/tpm.c --- 25/drivers/char/tpm/tpm.c~fix-tpm-driver-locks 2005-05-09 18:21:34.000000000 -0700 +++ 25-akpm/drivers/char/tpm/tpm.c 2005-05-09 18:21:34.000000000 -0700 @@ -446,15 +446,15 @@ EXPORT_SYMBOL_GPL(tpm_open); int tpm_release(struct inode *inode, struct file *file) { struct tpm_chip *chip = file->private_data; - - file->private_data = NULL; spin_lock(&driver_lock); + file->private_data = NULL; chip->num_opens--; del_singleshot_timer_sync(&chip->user_read_timer); atomic_set(&chip->data_pending, 0); - pci_dev_put(chip->pci_dev); + kfree(chip->data_buffer); + spin_unlock(&driver_lock); return 0; } @@ -664,10 +664,14 @@ dev_num_search_complete: return -ENODEV; } + spin_lock(&driver_lock); + pci_set_drvdata(pci_dev, chip); list_add(&chip->list, &tpm_chip_list); + spin_unlock(&driver_lock); + sysfs_create_group(&pci_dev->dev.kobj, chip->vendor->attr_group); return 0; _