tpm: Use container_of to locate the tpm_chip in tpm_open
misc_open sets the file->private_date to the misc_dev when calling open. We can use container_of to go from the misc_dev back to the tpm_chip. Future clean ups will move tpm_open into a new file and this change means we do not have to export the tpm_chip list. Signed-off-by: Jason Gunthorpe <jgunthorpe@obsidianresearch.com> Reviewed-by: Joel Schopp <jschopp@linux.vnet.ibm.com> Reviewed-by: Peter Huewe <peterhuewe@gmx.de> Acked-by: Ashley Lai <adlai@linux.vnet.ibm.com> Signed-off-by: Peter Huewe <peterhuewe@gmx.de>
This commit is contained in:
committed by
Peter Huewe
parent
6aff1fdc5d
commit
58c09e2133
@@ -1170,38 +1170,25 @@ EXPORT_SYMBOL_GPL(wait_for_tpm_stat);
|
|||||||
*/
|
*/
|
||||||
int tpm_open(struct inode *inode, struct file *file)
|
int tpm_open(struct inode *inode, struct file *file)
|
||||||
{
|
{
|
||||||
int minor = iminor(inode);
|
struct miscdevice *misc = file->private_data;
|
||||||
struct tpm_chip *chip = NULL, *pos;
|
struct tpm_chip *chip = container_of(misc, struct tpm_chip,
|
||||||
|
vendor.miscdev);
|
||||||
rcu_read_lock();
|
|
||||||
list_for_each_entry_rcu(pos, &tpm_chip_list, list) {
|
|
||||||
if (pos->vendor.miscdev.minor == minor) {
|
|
||||||
chip = pos;
|
|
||||||
get_device(chip->dev);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
rcu_read_unlock();
|
|
||||||
|
|
||||||
if (!chip)
|
|
||||||
return -ENODEV;
|
|
||||||
|
|
||||||
if (test_and_set_bit(0, &chip->is_open)) {
|
if (test_and_set_bit(0, &chip->is_open)) {
|
||||||
dev_dbg(chip->dev, "Another process owns this TPM\n");
|
dev_dbg(chip->dev, "Another process owns this TPM\n");
|
||||||
put_device(chip->dev);
|
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
chip->data_buffer = kzalloc(TPM_BUFSIZE, GFP_KERNEL);
|
chip->data_buffer = kzalloc(TPM_BUFSIZE, GFP_KERNEL);
|
||||||
if (chip->data_buffer == NULL) {
|
if (chip->data_buffer == NULL) {
|
||||||
clear_bit(0, &chip->is_open);
|
clear_bit(0, &chip->is_open);
|
||||||
put_device(chip->dev);
|
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
atomic_set(&chip->data_pending, 0);
|
atomic_set(&chip->data_pending, 0);
|
||||||
|
|
||||||
file->private_data = chip;
|
file->private_data = chip;
|
||||||
|
get_device(chip->dev);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(tpm_open);
|
EXPORT_SYMBOL_GPL(tpm_open);
|
||||||
|
Reference in New Issue
Block a user