• Tejun Heo's avatar
    sysfs: implement sysfs_dirent active reference and immediate disconnect · 0ab66088
    Tejun Heo authored
    sysfs: implement sysfs_dirent active reference and immediate disconnect
    
    Opening a sysfs node references its associated kobject, so userland
    can arbitrarily prolong lifetime of a kobject which complicates
    lifetime rules in drivers.  This patch implements active reference and
    makes the association between kobject and sysfs immediately breakable.
    
    Now each sysfs_dirent has two reference counts - s_count and s_active.
    s_count is a regular reference count which guarantees that the
    containing sysfs_dirent is accessible.  As long as s_count reference
    is held, all sysfs internal fields in sysfs_dirent are accessible
    including s_parent and s_name.
    
    The newly added s_active is active reference count.  This is acquired
    by invoking sysfs_get_active() and it's the caller's responsibility to
    ensure sysfs_dirent itself is accessible (should be holding s_count
    one way or the other).  Dereferencing sysfs_dirent to access objects
    out of sysfs proper requires active reference.  This includes access
    to the associated kobjects, attributes and ops.
    
    The active references can be drained and denied by calling
    sysfs_deactivate().  All active sysfs_dirents must be deactivated
    after deletion but before the default reference is dropped.  This
    enables immediate disconnect of sysfs nodes.  Once a sysfs_dirent is
    deleted, it won't access any entity external to sysfs proper.
    
    Because attr/bin_attr ops access both the node itself and its parent
    for kobject, they need to hold active references to both.
    sysfs_get/put_active_two() helpers are provided to help grabbing both
    references.  Parent's is acquired first and released last.
    
    Unlike other operations, mmapped area lingers on after mmap() is
    finished and the module implement implementing it and kobj need to
    stay referenced till all the mapped pages are gone.  This is
    accomplished by holding one set of active references to the bin_attr
    and its parent if there have been any mmap during lifetime of an
    openfile.  The references are dropped when the openfile is released.
    
    This change makes sysfs lifetime rules independent from both kobject's
    and module's.  It not only fixes several race conditions caused by
    sysfs not holding onto the proper module when referencing kobject, but
    also helps fixing and simplifying lifetime management in driver model
    and drivers by taking sysfs out of the equation.
    
    Please read the following message for more info.
    
      http://article.gmane.org/gmane.linux.kernel/510293Signed-off-by: default avatarTejun Heo <htejun@gmail.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
    0ab66088
inode.c 7.09 KB