Re: [PATCH] sysfs: kill an extra put in sysfs_create_link() failure path
From: Satyam Sharma
Date: Wed Jul 18 2007 - 10:48:49 EST
Hi Tejun,
Thanks for tracking this down and fixing it.
On 7/18/07, Tejun Heo <htejun@xxxxxxxxx> wrote:
There is a subtle bug in sysfs_create_link() failure path. When
symlink creation fails because there's already a node with the same
name, the target sysfs_dirent is put twice - once by failure path of
sysfs_create_link() and once more when the symlink is released.
The "symlink" is released? But the creation of the symlink is
precisely what failed here ... did it not?
Fix it by making only the symlink node responsible for putting
target_sd.
And again ... the changelog sounds confusing indeed, perhaps I'm
not familiar enough with sysfs symlink-related terminology/semantics.
Care to elaborate?
sd = sysfs_new_dirent(name, S_IFLNK|S_IRWXUGO, SYSFS_KOBJ_LINK);
if (!sd)
goto out_put;
+
sd->s_elem.symlink.target_sd = target_sd;
+ target_sd = NULL; /* reference is now owned by the symlink */
Wow. This looks like a very mysterious way to fix a mysterious bug :-)
BTW I just looked over at sysfs_create_link() and ... it looks quite ...
unnecessarily complicated/obfuscated ...
Thanks again,
Satyam
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/