From: Cedric Xing Date: Tue, 13 May 2025 16:41:54 +0000 (-0500) Subject: tsm-mr: Fix init breakage after bin_attrs constification by scoping non-const pointer... X-Git-Tag: v6.16-rc1~119^2^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b0ca403a9e381140cf626ca94519fb468370fc3e;p=thirdparty%2Fkernel%2Flinux.git tsm-mr: Fix init breakage after bin_attrs constification by scoping non-const pointers to init phase Commit 9bec944506fa ("sysfs: constify attribute_group::bin_attrs") enforced the ro-after-init principle by making elements of bin_attrs_new pointing to const. To align with this change, introduce a temporary variable `bap` within the initialization loop. This improves code clarity by explicitly marking the initialization scope and eliminates the need for type casts when assigning to bin_attrs_new. Signed-off-by: Cedric Xing Link: https://patch.msgid.link/20250513164154.10109-1-cedric.xing@intel.com Signed-off-by: Dan Williams --- diff --git a/drivers/virt/coco/tsm-mr.c b/drivers/virt/coco/tsm-mr.c index 1f0c43a516fb8..feb30af90a208 100644 --- a/drivers/virt/coco/tsm-mr.c +++ b/drivers/virt/coco/tsm-mr.c @@ -173,7 +173,7 @@ tsm_mr_create_attribute_group(const struct tsm_measurements *tm) * so that we don't have to free MR names one-by-one in * tsm_mr_free_attribute_group() */ - const struct bin_attribute * const *attrs __free(kfree) = + const struct bin_attribute **attrs __free(kfree) = kzalloc(sizeof(*attrs) * (tm->nr_mrs + 1) + nlen, GFP_KERNEL); struct tm_context *ctx __free(kfree) = kzalloc(struct_size(ctx, mrs, tm->nr_mrs), GFP_KERNEL); @@ -187,16 +187,14 @@ tsm_mr_create_attribute_group(const struct tsm_measurements *tm) end = name + nlen; for (size_t i = 0; i < tm->nr_mrs; ++i) { - /* break const for init */ - struct bin_attribute **bas = (struct bin_attribute **)attrs; + struct bin_attribute *bap = &ctx->mrs[i]; - bas[i] = &ctx->mrs[i]; - sysfs_bin_attr_init(bas[i]); + sysfs_bin_attr_init(bap); if (tm->mrs[i].mr_flags & TSM_MR_F_NOHASH) - bas[i]->attr.name = tm->mrs[i].mr_name; + bap->attr.name = tm->mrs[i].mr_name; else if (name < end) { - bas[i]->attr.name = name; + bap->attr.name = name; name += snprintf(name, end - name, "%s:%s", tm->mrs[i].mr_name, hash_algo_name[tm->mrs[i].mr_hash]); @@ -206,21 +204,23 @@ tsm_mr_create_attribute_group(const struct tsm_measurements *tm) /* check for duplicated MR definitions */ for (size_t j = 0; j < i; ++j) - if (!strcmp(bas[i]->attr.name, bas[j]->attr.name)) + if (!strcmp(bap->attr.name, attrs[j]->attr.name)) return ERR_PTR(-EINVAL); if (tm->mrs[i].mr_flags & TSM_MR_F_READABLE) { - bas[i]->attr.mode |= 0444; - bas[i]->read_new = tm_digest_read; + bap->attr.mode |= 0444; + bap->read_new = tm_digest_read; } if (tm->mrs[i].mr_flags & TSM_MR_F_WRITABLE) { - bas[i]->attr.mode |= 0200; - bas[i]->write_new = tm_digest_write; + bap->attr.mode |= 0200; + bap->write_new = tm_digest_write; } - bas[i]->size = tm->mrs[i].mr_size; - bas[i]->private = ctx; + bap->size = tm->mrs[i].mr_size; + bap->private = ctx; + + attrs[i] = bap; } if (name != end) @@ -244,7 +244,7 @@ EXPORT_SYMBOL_GPL(tsm_mr_create_attribute_group); void tsm_mr_free_attribute_group(const struct attribute_group *attr_grp) { if (!IS_ERR_OR_NULL(attr_grp)) { - kfree(attr_grp->bin_attrs); + kfree(attr_grp->bin_attrs_new); kfree(container_of(attr_grp, struct tm_context, agrp)); } }