summaryrefslogtreecommitdiff
path: root/arch/powerpc/platforms/powernv/opal-elog.c
diff options
context:
space:
mode:
authorAneesh Kumar K.V <aneesh.kumar@linux.ibm.com>2020-10-14 09:48:13 +0300
committerMichael Ellerman <mpe@ellerman.id.au>2020-10-16 06:25:12 +0300
commitd4263b12a1a0e8816e021450be0765a1ad8bb53c (patch)
tree7843fdd514b5857773ae2ab995755dbdf56ea61c /arch/powerpc/platforms/powernv/opal-elog.c
parentffd0b25ca049a477cb757e5bcf2d5e1664d12e5d (diff)
downloadlinux-d4263b12a1a0e8816e021450be0765a1ad8bb53c.tar.xz
powerpc/opal_elog: Handle multiple writes to ack attribute
Even though we use self removing sysfs helper, we still need to make sure we do the final kobject delete conditionally. sysfs_remove_file_self() will handle parallel calls to remove the sysfs attribute file and returns true only in the caller that removed the attribute file. The other parallel callers are returned false. Do the final kobject delete checking the return value of sysfs_remove_file_self(). Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com> Reviewed-by: Mahesh Salgaonkar <mahesh@linux.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20201014064813.109515-1-aneesh.kumar@linux.ibm.com
Diffstat (limited to 'arch/powerpc/platforms/powernv/opal-elog.c')
-rw-r--r--arch/powerpc/platforms/powernv/opal-elog.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/arch/powerpc/platforms/powernv/opal-elog.c b/arch/powerpc/platforms/powernv/opal-elog.c
index 5e33b1fc67c2..37b380eef41a 100644
--- a/arch/powerpc/platforms/powernv/opal-elog.c
+++ b/arch/powerpc/platforms/powernv/opal-elog.c
@@ -72,9 +72,14 @@ static ssize_t elog_ack_store(struct elog_obj *elog_obj,
const char *buf,
size_t count)
{
- opal_send_ack_elog(elog_obj->id);
- sysfs_remove_file_self(&elog_obj->kobj, &attr->attr);
- kobject_put(&elog_obj->kobj);
+ /*
+ * Try to self remove this attribute. If we are successful,
+ * delete the kobject itself.
+ */
+ if (sysfs_remove_file_self(&elog_obj->kobj, &attr->attr)) {
+ opal_send_ack_elog(elog_obj->id);
+ kobject_put(&elog_obj->kobj);
+ }
return count;
}