powerpc/opal_elog: Handle multiple writes to ack attribute
authorAneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
Wed, 14 Oct 2020 06:48:13 +0000 (12:18 +0530)
committerMichael Ellerman <mpe@ellerman.id.au>
Fri, 16 Oct 2020 03:25:12 +0000 (14:25 +1100)
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
arch/powerpc/platforms/powernv/opal-elog.c

index 5e33b1fc67c2b0889566b1bea6bff159d5a1210e..37b380eef41a4ecfe9a2695e1feb6316602f415d 100644 (file)
@@ -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;
 }