• Tejun Heo's avatar
    kobject: grab an extra reference on kobject->sd to allow duplicate deletes · 26ea12de
    Tejun Heo authored
    sysfs currently has a rather weird behavior regarding removals.  A
    directory removal would delete all files directly under it but
    wouldn't recurse into subdirectories, which, while a bit inconsistent,
    seems to make sense at the first glance as each directory is
    supposedly associated with a kobject and each kobject can take care of
    the directory deletion; however, this doesn't really hold as we have
    groups which can be directories without a kobject associated with it
    and require explicit deletions.
    
    We're in the process of separating out sysfs from kboject / driver
    core and want a consistent behavior.  A removal should delete either
    only the specified node or everything under it.  I think it is helpful
    to support recursive atomic removal and later patches will implement
    it.
    
    Such change means that a sysfs_dirent associated with kobject may be
    deleted before the kobject itself is removed if one of its ancestor
    gets removed before it.  As sysfs_remove_dir() puts the base ref, we
    may end up with dangling pointer on descendants.  This can be solved
    by holding an extra reference on the sd from kobject.
    
    Acquire an extra reference on the associated sysfs_dirent on directory
    creation and put it after removal.
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    26ea12de
kobject.c 26.7 KB