| From f68ef175da77be8eb2709afbe7ff60d8e555794e Mon Sep 17 00:00:00 2001 |
| From: Zyta Szpak <zyta@google.com> |
| Date: Mon, 13 Dec 2021 11:48:52 +0000 |
| Subject: [PATCH] FIXUP: CHROMIUM: tpm: remove hardcoded index |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| Remove the WARN_ON groups_cnt being zero. |
| |
| When the warning was added it was assumed that sysfs attributes |
| always land in 0-index and the for-loop in tpm_add_legacy_sysfs had it |
| hardcoded to 0. To be compliant with this it had to be checked if we are |
| starting from 0 when adding groups in tpm-sysfs.c, otherwise it was |
| missing the right place in the table. |
| |
| Add checking if attributes group name was defined for each group in |
| the table. |
| |
| If name is defined then the sysfs entries land in 'name' subdirectory. |
| This case is handled separately for each dir (like ppi). If name is not |
| defined, we create legacy sysfs entry for every attribute of this group. |
| |
| Fixes: WARNING: CPU: 2 PID: 1 at |
| drivers/char/tpm/tpm-sysfs.c:612 tpm_sysfs_add_device+0x426/0x4c7 |
| and improper legacy sysfs mapping (missing entries) |
| |
| BUG=b:197836367 |
| TEST=build kernel from chromeos-kernelupstream-5.14-rc7 branch with debug |
| options enabled for delbin/caroline; load the kernel and observe warnings |
| during boot |
| |
| Signed-off-by: Zyta Szpak <zyta@google.com> |
| Change-Id: I3676f407a0fcc168a880f083e0b91ac2c74bb2c6 |
| Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/kernel/+/3329890 |
| Reviewed-by: Yi Chou <yich@google.com> |
| Commit-Queue: Yi Chou <yich@google.com> |
| Commit-Queue: Łukasz Bartosik <ukaszb@google.com> |
| --- |
| drivers/char/tpm/tpm-chip.c | 30 ++++++++++++++++++++++-------- |
| drivers/char/tpm/tpm-sysfs.c | 2 -- |
| 2 files changed, 22 insertions(+), 10 deletions(-) |
| |
| diff --git a/drivers/char/tpm/tpm-chip.c b/drivers/char/tpm/tpm-chip.c |
| index 968cf0ab6638..e37ff7d32d16 100644 |
| --- a/drivers/char/tpm/tpm-chip.c |
| +++ b/drivers/char/tpm/tpm-chip.c |
| @@ -465,6 +465,7 @@ static void tpm_del_char_device(struct tpm_chip *chip) |
| static void tpm_del_legacy_sysfs(struct tpm_chip *chip) |
| { |
| struct attribute **i; |
| + int k; |
| |
| if (chip->flags & TPM_CHIP_FLAG_VIRTUAL || |
| tpm_is_firmware_upgrade(chip)) |
| @@ -472,8 +473,14 @@ static void tpm_del_legacy_sysfs(struct tpm_chip *chip) |
| |
| sysfs_remove_link(&chip->dev.parent->kobj, "ppi"); |
| |
| - for (i = chip->groups[0]->attrs; *i != NULL; ++i) |
| - sysfs_remove_link(&chip->dev.parent->kobj, (*i)->name); |
| + for (k = 0; k < chip->groups_cnt; k++) { |
| + if (chip->groups[k]->name) |
| + continue; |
| + else { |
| + for (i = chip->groups[k]->attrs; *i != NULL; ++i) |
| + sysfs_remove_link(&chip->dev.parent->kobj, (*i)->name); |
| + } |
| + } |
| } |
| |
| /* For compatibility with legacy sysfs paths we provide symlinks from the |
| @@ -484,6 +491,7 @@ static int tpm_add_legacy_sysfs(struct tpm_chip *chip) |
| { |
| struct attribute **i; |
| int rc; |
| + int k; |
| |
| if (chip->flags & TPM_CHIP_FLAG_VIRTUAL || |
| tpm_is_firmware_upgrade(chip)) |
| @@ -495,12 +503,18 @@ static int tpm_add_legacy_sysfs(struct tpm_chip *chip) |
| return rc; |
| |
| /* All the names from tpm-sysfs */ |
| - for (i = chip->groups[0]->attrs; *i != NULL; ++i) { |
| - rc = compat_only_sysfs_link_entry_to_kobj( |
| - &chip->dev.parent->kobj, &chip->dev.kobj, (*i)->name, NULL); |
| - if (rc) { |
| - tpm_del_legacy_sysfs(chip); |
| - return rc; |
| + for (k = 0; k < chip->groups_cnt; k++) { |
| + if (chip->groups[k]->name) |
| + continue; |
| + else { |
| + for (i = chip->groups[k]->attrs; *i != NULL; ++i) { |
| + rc = compat_only_sysfs_link_entry_to_kobj( |
| + &chip->dev.parent->kobj, &chip->dev.kobj, (*i)->name, NULL); |
| + if (rc) { |
| + tpm_del_legacy_sysfs(chip); |
| + return rc; |
| + } |
| + } |
| } |
| } |
| |
| diff --git a/drivers/char/tpm/tpm-sysfs.c b/drivers/char/tpm/tpm-sysfs.c |
| index 0116f46d1977..4781bd2f4fde 100644 |
| --- a/drivers/char/tpm/tpm-sysfs.c |
| +++ b/drivers/char/tpm/tpm-sysfs.c |
| @@ -609,8 +609,6 @@ void tpm_sysfs_add_device(struct tpm_chip *chip) |
| /* FIXME: update tpm_sysfs to explicitly lock chip->ops for TPM 2.0 */ |
| int i; |
| |
| - WARN_ON(chip->groups_cnt != 0); |
| - |
| if (tpm_is_firmware_upgrade(chip)) |
| return; |
| |
| -- |
| 2.36.0.rc0.470.gd361397f0d-goog |
| |