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)
{
int rc;
if (chip->flags & TPM_CHIP_FLAG_TPM2)
return 0;
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)
@ -293,8 +295,7 @@ static void tpm1_chip_unregister(struct tpm_chip *chip)
if (chip->flags & TPM_CHIP_FLAG_TPM2)
return;
if (chip->bios_dir)
tpm_bios_log_teardown(chip->bios_dir);
tpm_bios_log_teardown(chip);
}
static void tpm_del_legacy_sysfs(struct tpm_chip *chip)

View file

@ -40,6 +40,7 @@ enum tpm_const {
TPM_BUFSIZE = 4096,
TPM_NUM_DEVICES = 65536,
TPM_RETRY = 50, /* 5 seconds */
TPM_NUM_EVENT_LOG_FILES = 3,
};
enum tpm_timeout {
@ -171,7 +172,7 @@ struct tpm_chip {
unsigned long duration[3]; /* jiffies */
bool duration_adjusted;
struct dentry **bios_dir;
struct dentry *bios_dir[TPM_NUM_EVENT_LOG_FILES];
const struct attribute_group *groups[3];
unsigned int groups_cnt;

View file

@ -359,63 +359,50 @@ static const struct file_operations tpm_bios_measurements_ops = {
.release = tpm_bios_measurements_release,
};
static int is_bad(void *p)
int tpm_bios_log_setup(struct tpm_chip *chip)
{
if (!p)
return 1;
if (IS_ERR(p) && (PTR_ERR(p) != -ENODEV))
return 1;
return 0;
}
const char *name = dev_name(&chip->dev);
unsigned int cnt;
struct dentry **tpm_bios_log_setup(const char *name)
{
struct dentry **ret = NULL, *tpm_dir, *bin_file, *ascii_file;
cnt = 0;
chip->bios_dir[cnt] = securityfs_create_dir(name, NULL);
/* 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);
if (is_bad(tpm_dir))
goto out;
bin_file =
chip->bios_dir[cnt] =
securityfs_create_file("binary_bios_measurements",
0440, tpm_dir,
0440, chip->bios_dir[0],
(void *)&tpm_binary_b_measurements_seqops,
&tpm_bios_measurements_ops);
if (is_bad(bin_file))
goto out_tpm;
if (IS_ERR(chip->bios_dir[cnt]))
goto err;
cnt++;
ascii_file =
chip->bios_dir[cnt] =
securityfs_create_file("ascii_bios_measurements",
0440, tpm_dir,
0440, chip->bios_dir[0],
(void *)&tpm_ascii_b_measurements_seqops,
&tpm_bios_measurements_ops);
if (is_bad(ascii_file))
goto out_bin;
if (IS_ERR(chip->bios_dir[cnt]))
goto err;
cnt++;
ret = kmalloc(3 * sizeof(struct dentry *), GFP_KERNEL);
if (!ret)
goto out_ascii;
return 0;
ret[0] = ascii_file;
ret[1] = bin_file;
ret[2] = tpm_dir;
return ret;
out_ascii:
securityfs_remove(ascii_file);
out_bin:
securityfs_remove(bin_file);
out_tpm:
securityfs_remove(tpm_dir);
out:
return NULL;
err:
chip->bios_dir[cnt] = NULL;
tpm_bios_log_teardown(chip);
return -EIO;
}
void tpm_bios_log_teardown(struct dentry **lst)
void tpm_bios_log_teardown(struct tpm_chip *chip)
{
int i;
for (i = 0; i < 3; i++)
securityfs_remove(lst[i]);
for (i = (TPM_NUM_EVENT_LOG_FILES - 1); i >= 0; 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) || \
defined(CONFIG_ACPI)
extern struct dentry **tpm_bios_log_setup(const char *);
extern void tpm_bios_log_teardown(struct dentry **);
extern int tpm_bios_log_setup(struct tpm_chip *chip);
extern void tpm_bios_log_teardown(struct tpm_chip *chip);
#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