Commit cd9b7631 authored by Jarkko Sakkinen's avatar Jarkko Sakkinen

tpm: replace dynamically allocated bios_dir with a static array

This commit is based on a commit by Nayna Jain. Replaced dynamically
allocated bios_dir with a static array as the size is always constant.
Suggested-by: default avatarJason Gunthorpe <jgunthorpe@obsidianresearch.com>
Signed-off-by: default avatarJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
parent b1a9b7b6
...@@ -278,14 +278,16 @@ static void tpm_del_char_device(struct tpm_chip *chip) ...@@ -278,14 +278,16 @@ static void tpm_del_char_device(struct tpm_chip *chip)
static int tpm1_chip_register(struct tpm_chip *chip) static int tpm1_chip_register(struct tpm_chip *chip)
{ {
int rc;
if (chip->flags & TPM_CHIP_FLAG_TPM2) if (chip->flags & TPM_CHIP_FLAG_TPM2)
return 0; return 0;
tpm_sysfs_add_device(chip); tpm_sysfs_add_device(chip);
chip->bios_dir = tpm_bios_log_setup(dev_name(&chip->dev)); rc = tpm_bios_log_setup(chip);
return 0; return rc;
} }
static void tpm1_chip_unregister(struct tpm_chip *chip) static void tpm1_chip_unregister(struct tpm_chip *chip)
...@@ -293,8 +295,7 @@ static void tpm1_chip_unregister(struct tpm_chip *chip) ...@@ -293,8 +295,7 @@ static void tpm1_chip_unregister(struct tpm_chip *chip)
if (chip->flags & TPM_CHIP_FLAG_TPM2) if (chip->flags & TPM_CHIP_FLAG_TPM2)
return; return;
if (chip->bios_dir) tpm_bios_log_teardown(chip);
tpm_bios_log_teardown(chip->bios_dir);
} }
static void tpm_del_legacy_sysfs(struct tpm_chip *chip) static void tpm_del_legacy_sysfs(struct tpm_chip *chip)
......
...@@ -40,6 +40,7 @@ enum tpm_const { ...@@ -40,6 +40,7 @@ enum tpm_const {
TPM_BUFSIZE = 4096, TPM_BUFSIZE = 4096,
TPM_NUM_DEVICES = 65536, TPM_NUM_DEVICES = 65536,
TPM_RETRY = 50, /* 5 seconds */ TPM_RETRY = 50, /* 5 seconds */
TPM_NUM_EVENT_LOG_FILES = 3,
}; };
enum tpm_timeout { enum tpm_timeout {
...@@ -171,7 +172,7 @@ struct tpm_chip { ...@@ -171,7 +172,7 @@ struct tpm_chip {
unsigned long duration[3]; /* jiffies */ unsigned long duration[3]; /* jiffies */
bool duration_adjusted; bool duration_adjusted;
struct dentry **bios_dir; struct dentry *bios_dir[TPM_NUM_EVENT_LOG_FILES];
const struct attribute_group *groups[3]; const struct attribute_group *groups[3];
unsigned int groups_cnt; unsigned int groups_cnt;
......
...@@ -359,63 +359,50 @@ static const struct file_operations tpm_bios_measurements_ops = { ...@@ -359,63 +359,50 @@ static const struct file_operations tpm_bios_measurements_ops = {
.release = tpm_bios_measurements_release, .release = tpm_bios_measurements_release,
}; };
static int is_bad(void *p) int tpm_bios_log_setup(struct tpm_chip *chip)
{ {
if (!p) const char *name = dev_name(&chip->dev);
return 1; unsigned int cnt;
if (IS_ERR(p) && (PTR_ERR(p) != -ENODEV))
return 1;
return 0;
}
struct dentry **tpm_bios_log_setup(const char *name)
{
struct dentry **ret = NULL, *tpm_dir, *bin_file, *ascii_file;
tpm_dir = securityfs_create_dir(name, NULL); cnt = 0;
if (is_bad(tpm_dir)) chip->bios_dir[cnt] = securityfs_create_dir(name, NULL);
goto out; /* NOTE: securityfs_create_dir can return ENODEV if securityfs is
* compiled out. The caller should ignore the ENODEV return code.
*/
if (IS_ERR(chip->bios_dir[cnt]))
goto err;
cnt++;
bin_file = chip->bios_dir[cnt] =
securityfs_create_file("binary_bios_measurements", securityfs_create_file("binary_bios_measurements",
0440, tpm_dir, 0440, chip->bios_dir[0],
(void *)&tpm_binary_b_measurements_seqops, (void *)&tpm_binary_b_measurements_seqops,
&tpm_bios_measurements_ops); &tpm_bios_measurements_ops);
if (is_bad(bin_file)) if (IS_ERR(chip->bios_dir[cnt]))
goto out_tpm; goto err;
cnt++;
ascii_file = chip->bios_dir[cnt] =
securityfs_create_file("ascii_bios_measurements", securityfs_create_file("ascii_bios_measurements",
0440, tpm_dir, 0440, chip->bios_dir[0],
(void *)&tpm_ascii_b_measurements_seqops, (void *)&tpm_ascii_b_measurements_seqops,
&tpm_bios_measurements_ops); &tpm_bios_measurements_ops);
if (is_bad(ascii_file)) if (IS_ERR(chip->bios_dir[cnt]))
goto out_bin; goto err;
cnt++;
ret = kmalloc(3 * sizeof(struct dentry *), GFP_KERNEL); return 0;
if (!ret)
goto out_ascii;
ret[0] = ascii_file;
ret[1] = bin_file;
ret[2] = tpm_dir;
return ret;
out_ascii: err:
securityfs_remove(ascii_file); chip->bios_dir[cnt] = NULL;
out_bin: tpm_bios_log_teardown(chip);
securityfs_remove(bin_file); return -EIO;
out_tpm:
securityfs_remove(tpm_dir);
out:
return NULL;
} }
void tpm_bios_log_teardown(struct dentry **lst) void tpm_bios_log_teardown(struct tpm_chip *chip)
{ {
int i; int i;
for (i = 0; i < 3; i++) for (i = (TPM_NUM_EVENT_LOG_FILES - 1); i >= 0; i--)
securityfs_remove(lst[i]); securityfs_remove(chip->bios_dir[i]);
} }
...@@ -77,14 +77,14 @@ int read_log(struct tpm_bios_log *log); ...@@ -77,14 +77,14 @@ int read_log(struct tpm_bios_log *log);
#if defined(CONFIG_TCG_IBMVTPM) || defined(CONFIG_TCG_IBMVTPM_MODULE) || \ #if defined(CONFIG_TCG_IBMVTPM) || defined(CONFIG_TCG_IBMVTPM_MODULE) || \
defined(CONFIG_ACPI) defined(CONFIG_ACPI)
extern struct dentry **tpm_bios_log_setup(const char *); extern int tpm_bios_log_setup(struct tpm_chip *chip);
extern void tpm_bios_log_teardown(struct dentry **); extern void tpm_bios_log_teardown(struct tpm_chip *chip);
#else #else
static inline struct dentry **tpm_bios_log_setup(const char *name) static inline int tpm_bios_log_setup(struct tpm_chip *chip)
{ {
return NULL; return 0;
} }
static inline void tpm_bios_log_teardown(struct dentry **dir) static inline void tpm_bios_log_teardown(struct tpm_chip *chip)
{ {
} }
#endif #endif
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment