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: Jason Gunthorpe <jgunthorpe@obsidianresearch.com>
Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
This commit is contained in:
Jarkko Sakkinen 2016-11-14 05:00:50 -05:00
parent b1a9b7b602
commit cd9b7631a8
4 changed files with 41 additions and 52 deletions

View File

@ -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)
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)

View File

@ -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 {
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;

View File

@ -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) cnt = 0;
{ chip->bios_dir[cnt] = securityfs_create_dir(name, NULL);
struct dentry **ret = NULL, *tpm_dir, *bin_file, *ascii_file; /* 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++;
tpm_dir = securityfs_create_dir(name, NULL); chip->bios_dir[cnt] =
if (is_bad(tpm_dir))
goto out;
bin_file =
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; err:
ret[1] = bin_file; chip->bios_dir[cnt] = NULL;
ret[2] = tpm_dir; tpm_bios_log_teardown(chip);
return -EIO;
return ret;
out_ascii:
securityfs_remove(ascii_file);
out_bin:
securityfs_remove(bin_file);
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]);
} }

View File

@ -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