23 Aug, 2007

2 commits

  • This patch (as960) removes the error message and stack dump logged by
    sysfs_remove_bin_file() when someone tries to remove a nonexistent
    file. The warning doesn't seem to be needed, since none of the other
    file-, symlink-, or directory-removal routines in sysfs complain in a
    comparable way.

    Signed-off-by: Alan Stern
    Acked-by: Tejun Heo
    Acked-by: Cornelia Huck
    Signed-off-by: Greg Kroah-Hartman

    Alan Stern
     
  • sd children list walking in sysfs_lookup() and sd renaming in
    sysfs_rename_dir() were left out during i_mutex -> sysfs_mutex
    conversion. Fix them.

    Signed-off-by: Tejun Heo
    Acked-by: Cornelia Huck
    Signed-off-by: Greg Kroah-Hartman

    Tejun Heo
     

20 Jul, 2007

1 commit

  • Slab destructors were no longer supported after Christoph's
    c59def9f222d44bb7e2f0a559f2906191a0862d7 change. They've been
    BUGs for both slab and slub, and slob never supported them
    either.

    This rips out support for the dtor pointer from kmem_cache_create()
    completely and fixes up every single callsite in the kernel (there were
    about 224, not including the slab allocator definitions themselves,
    or the documentation references).

    Signed-off-by: Paul Mundt

    Paul Mundt
     

19 Jul, 2007

5 commits

  • Node addition failure is detected by testing return value of
    sysfs_addfm_finish() which returns the number of added and removed
    nodes. As the function is called as the last step of addition right
    on top of error handling block, the if blocks looked like the
    following.

    if (sysfs_addrm_finish(&acxt))
    success handling, usually return;
    /* fall through to error handling */

    This is the opposite of usual convention in sysfs and makes the code
    difficult to understand. This patch inverts the test and makes those
    blocks look more like others.

    Signed-off-by: Tejun Heo
    Cc: Gabriel C
    Cc: Miles Lane
    Signed-off-by: Greg Kroah-Hartman

    Tejun Heo
     
  • 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.

    Fix it by making only the symlink node responsible for putting
    target_sd.

    Signed-off-by: Tejun Heo
    Cc: Gabriel C
    Cc: Miles Lane
    Signed-off-by: Greg Kroah-Hartman

    Tejun Heo
     
  • With sysfs_fill_super() converted to use sysfs_get_inode(), there is
    no user of sysfs_init_inode() outside of fs/sysfs/inode.c. Make it
    static.

    Signed-off-by: Tejun Heo
    Acked-by: Jean Delvare
    Signed-off-by: Greg Kroah-Hartman

    Tejun Heo
     
  • While making sysfs indoes hashed, sysfs root inode was left out. Now
    that nlink accounting depends on the inode being on the hash, sysfs
    root inode nlink isn't adjusted properly.

    Put sysfs root inode on the inode hash by allocating it using
    sysfs_get_inode() like other sysfs inodes. While at it, massage
    comments a bit.

    Signed-off-by: Tejun Heo
    Acked-by: Jean Delvare
    Signed-off-by: Greg Kroah-Hartman

    Tejun Heo
     
  • kmem_cache_free() with NULL is not allowed. But it may happen
    if out of memory error is triggered in sysfs_new_dirent().
    This patch fixes that error handling.

    Signed-off-by: Akinobu Mita
    Signed-off-by: Greg Kroah-Hartman

    Akinobu Mita
     

12 Jul, 2007

32 commits

  • Well, first of all, I don't want to change so many files either.

    What I do:
    Adding a new parameter "struct bin_attribute *" in the
    .read/.write methods for the sysfs binary attributes.

    In fact, only the four lines change in fs/sysfs/bin.c and
    include/linux/sysfs.h do the real work.
    But I have to update all the files that use binary attributes
    to make them compatible with the new .read and .write methods.
    I'm not sure if I missed any. :(

    Why I do this:
    For a sysfs attribute, we can get a pointer pointing to the
    struct attribute in the .show/.store method,
    while we can't do this for the binary attributes.
    I don't know why this is different, but this does make it not
    so handy to use the binary attributes as the regular ones.
    So I think this patch is reasonable. :)

    Who benefits from it:
    The patch that exposes ACPI tables in sysfs
    requires such an improvement.
    All the table binary attributes share the same .read method.
    Parameter "struct bin_attribute *" is used to get
    the table signature and instance number which are used to
    distinguish different ACPI table binary attributes.

    Without this parameter, we need to offer different .read methods
    for different ACPI table binary attributes.
    This is impossible as there are various ACPI tables on different
    platforms, and we don't know what they are until they are loaded.

    Signed-off-by: Zhang Rui
    Signed-off-by: Greg Kroah-Hartman

    Zhang Rui
     
  • This patch makes dentries and inodes for sysfs directories
    reclaimable.

    * sysfs_notify() is modified to walk sysfs_dirent tree instead of
    dentry tree.

    * sysfs_update_file() and sysfs_chmod_file() use sysfs_get_dentry() to
    grab the victim dentry.

    * sysfs_rename_dir() and sysfs_move_dir() grab all dentries using
    sysfs_get_dentry() on startup.

    * Dentries for all shadowed directories are pinned in memory to serve
    as lookup start point.

    Signed-off-by: Tejun Heo
    Signed-off-by: Greg Kroah-Hartman

    Tejun Heo
     
  • Some sysfs operations require dentry and inode. sysfs_get_dentry()
    looks up and gets dentry for the specified sysfs_dirent. It finds the
    first ancestor with dentry attached and starts looking up dentries
    from there.

    Looking up from the nearest ancestor is necessary to support shadowed
    directories because we can't reliably lookup dentry for one of the
    shadows. Dentries for each shadow will be pinned in memory such that
    they can serve as the starting point for dentry lookup.

    Signed-off-by: Tejun Heo
    Signed-off-by: Greg Kroah-Hartman

    Tejun Heo
     
  • After add/remove path restructuring, the only user of
    sysfs_drop_dentry() is sysfs_addrm_finish(). Move sysfs_drop_dentry()
    to dir.c and make it static.

    Signed-off-by: Tejun Heo
    Signed-off-by: Greg Kroah-Hartman

    Tejun Heo
     
  • The original add/remove code had the following problems.

    * parent's timestamps are updated on dentry instantiation. this is
    incorrect with reclaimable files.

    * updating parent's timestamps isn't synchronized.

    * parent nlink update assumes the inode is accessible which won't be
    true once directory dentries are made reclaimable.

    This patch restructures add/remove paths to resolve the above
    problems. Add/removal are done in the following steps.

    1. sysfs_addrm_start() : acquire locks including sysfs_mutex and other
    resources.

    2-a. sysfs_add_one() : add new sd. linking the new sd into the
    children list is caller's responsibility.

    2-b. sysfs_remove_one() : remove a sd. unlinking the sd from the
    children list is caller's responsibility.

    3. sysfs_addrm_finish() : release all resources and clean up.

    Steps 2-a and/or 2-b can be repeated multiple times.

    Parent's inode is looked up during sysfs_addrm_start(). If available
    (always at the moment), it's pinned and nlink is updated as sd's are
    added and removed. Timestamps are updated during finish if any sd has
    been added or removed. If parent's inode is not available during
    start, sysfs_mutex ensures that parent inode is not created till
    add/remove is complete.

    All the complexity is contained inside the helper functions.
    Especially, dentry/inode handling is properly hidden from the rest of
    sysfs which now mostly operate on sysfs_dirents. As an added bonus,
    codes which use these helpers to add and remove sysfs_dirents are now
    more structured and simpler.

    Signed-off-by: Tejun Heo
    Signed-off-by: Greg Kroah-Hartman

    Tejun Heo
     
  • As kobj sysfs dentries and inodes are gonna be made reclaimable,
    i_mutex can't be used to protect sysfs_dirent tree. Use sysfs_mutex
    globally instead. As the whole tree is protected with sysfs_mutex,
    there is no reason to keep sysfs_rename_sem. Drop it.

    While at it, add docbook comments to functions which require
    sysfs_mutex locking.

    Signed-off-by: Tejun Heo
    Signed-off-by: Greg Kroah-Hartman

    Tejun Heo
     
  • Replace sysfs_lock and kobj_sysfs_assoc_lock with sysfs_assoc_lock.
    sysfs_lock was originally to be used to protect sysfs_dirent tree but
    mutex seems better choice, so there is no reason to keep sysfs_lock
    separate. Merge the two spinlocks into one.

    Signed-off-by: Tejun Heo
    Signed-off-by: Greg Kroah-Hartman

    Tejun Heo
     
  • As kobj sysfs dentries and inodes are gonna be made reclaimable,
    dentry can't be used as naming token for sysfs file/directory, replace
    kobj->dentry with kobj->sd. The only external interface change is
    shadow directory handling. All other changes are contained in kobj
    and sysfs.

    Signed-off-by: Tejun Heo
    Signed-off-by: Greg Kroah-Hartman

    Tejun Heo
     
  • Implement sysfs_find_dirent() and sysfs_get_dirent().
    sysfs_dirent_exist() is replaced by sysfs_find_dirent(). These will
    be used to make directory entries reclamiable.

    Signed-off-by: Tejun Heo
    Signed-off-by: Greg Kroah-Hartman

    Tejun Heo
     
  • Implement SYSFS_FLAG_REMOVED flag which currently is used only to
    improve sanity check in sysfs_deactivate(). The flag will be used to
    make directory entries reclamiable.

    Signed-off-by: Tejun Heo
    Signed-off-by: Greg Kroah-Hartman

    Tejun Heo
     
  • Rename sysfs_dirent->s_type to s_flags, pack type into lower eight
    bits and reserve the rest for flags. sysfs_type() can used to access
    the type. All existing sd->s_type accesses are converted to use
    sysfs_type(). While at it, type test is changed to equality test
    instead of bit-and test where appropriate.

    Signed-off-by: Tejun Heo
    Signed-off-by: Greg Kroah-Hartman

    Tejun Heo
     
  • sysfs_drop_dentry() used to go through sd->s_dentry and
    sd->s_parent->s_dentry to access the inodes. This is incorrect
    because inode can be cached without dentry.

    This patch makes sysfs_drop_dentry() access inodes using ilookup() on
    sd->s_ino. This is both correct and simpler.

    Signed-off-by: Tejun Heo
    Signed-off-by: Greg Kroah-Hartman

    Tejun Heo
     
  • Fix oops on x86_64 caused by the dereference of dir in
    sysfs_drop_dentry() made before checking if dir is not NULL
    (cf. http://marc.info/?l=linux-kernel&m=118151626704924&w=2).

    Signed-off-by: Rafael J. Wysocki
    Signed-off-by: Tejun Heo
    Signed-off-by: Greg Kroah-Hartman

    Rafael J. Wysocki
     
  • Make sysfs_dirent use singly linked list for its tree structure.
    sysfs_link_sibling() and sysfs_unlink_sibling() functions are added to
    handle simpler cases. It adds some complexity and cpu cycle overhead
    but reduced memory footprint is worthwhile on big machines.

    This change reduces the sizeof sysfs_dirent from 104 to 88 on 64bit
    and from 60 to 52 on 32bit.

    Signed-off-by: Tejun Heo
    Signed-off-by: Greg Kroah-Hartman

    Tejun Heo
     
  • Make sysfs_dirent->s_active an atomic_t instead of rwsem. This
    reduces the size of sysfs_dirent from 136 to 104 on 64bit and from 76
    to 60 on 32bit with lock debugging turned off. With lock debugging
    turned on the reduction is much larger.

    s_active starts at zero and each active reference increments s_active.
    Putting a reference decrements s_active. Deactivation subtracts
    SD_DEACTIVATED_BIAS which is currently INT_MIN and assumed to be small
    enough to make s_active negative. If s_active is negative,
    sysfs_get() no longer grants new references. Deactivation succeeds
    immediately if there is no active user; otherwise, it waits using a
    completion for the last put.

    Due to the removal of lockdep tricks, this change makes things less
    trickier in release_sysfs_dirent(). As all the complexity is
    contained in three s_active functions, I think it's more readable this
    way.

    Signed-off-by: Tejun Heo
    Signed-off-by: Greg Kroah-Hartman

    Tejun Heo
     
  • These functions are about to receive more complexity and doesn't
    really need to be inlined in the first place. Move them from
    fs/sysfs/sysfs.h to fs/sysfs/dir.c.

    Signed-off-by: Tejun Heo
    Signed-off-by: Greg Kroah-Hartman

    Tejun Heo
     
  • The root sysfs_dirent didn't point to the root dentry fix it.

    Signed-off-by: Tejun Heo
    Signed-off-by: Greg Kroah-Hartman

    Tejun Heo
     
  • After dentry is reclaimed, sysfs always used to allocate new dentry
    and inode if the file is accessed again. This causes problem with
    operations which only pin the inode. For example, if inotify watch is
    added to a sysfs file and the dentry for the file is reclaimed, the
    next update event creates new dentry and new inode making the inotify
    watch miss all the events from there on.

    This patch fixes it by using iget_locked() instead of new_inode().
    sysfs_new_inode() is renamed to sysfs_get_inode() and inode is
    initialized iff the inode is newly allocated. sysfs_instantiate() is
    responsible for unlocking new inodes.

    Signed-off-by: Tejun Heo
    Signed-off-by: Greg Kroah-Hartman

    Tejun Heo
     
  • Reorganize/clean up sysfs_new_inode() and sysfs_create().

    * sysfs_init_inode() is separated out from sysfs_new_inode() and is
    responsible for basic initialization.
    * sysfs_instantiate() replaces the last step of sysfs_create() and is
    responsible for dentry instantitaion.
    * type-specific initialization is moved out to the callers.
    * mode is specified only once when creating a sysfs_dirent.
    * spurious list_del_init(&sd->s_sibling) dropped from create_dir()

    This change is to

    * prepare for inode allocation fix.
    * separate alloc and init code for synchronization update.
    * make dentry/inode initialization more flexible for later changes.

    This patch doesn't introduce visible behavior change.

    Signed-off-by: Tejun Heo
    Signed-off-by: Greg Kroah-Hartman

    Tejun Heo
     
  • Parent reference wasn't properly transferred during rename and move.
    Fix it.

    Signed-off-by: Tejun Heo
    Signed-off-by: Greg Kroah-Hartman

    Tejun Heo
     
  • sysfs_alloc_ino() isn't used out side of fs/sysfs/dir.c. Make it
    static.

    Signed-off-by: Tejun Heo
    Signed-off-by: Greg Kroah-Hartman

    Tejun Heo
     
  • sysfs is now completely out of driver/module lifetime game. After
    deletion, a sysfs node doesn't access anything outside sysfs proper,
    so there's no reason to hold onto the attribute owners. Note that
    often the wrong modules were accounted for as owners leading to
    accessing removed modules.

    This patch kills now unnecessary attribute->owner. Note that with
    this change, userland holding a sysfs node does not prevent the
    backing module from being unloaded.

    For more info regarding lifetime rule cleanup, please read the
    following message.

    http://article.gmane.org/gmane.linux.kernel/510293

    (tweaked by Greg to not delete the field just yet, to make it easier to
    merge things properly.)

    Signed-off-by: Tejun Heo
    Cc: Cornelia Huck
    Cc: Andrew Morton
    Signed-off-by: Greg Kroah-Hartman

    Tejun Heo
     
  • This patch reimplements sysfs_drop_dentry() such that remove_dir() can
    use it to drop dentry instead of using a separate mechanism. With
    this change, making directories reclaimable is much easier.

    This patch used to contain fixes for two race conditions around
    sd->s_dentry but that part has been separated out and included into
    mainline early as commit 6aa054aadfea613a437ad0b15d38eca2b963fc0a and
    dd14cbc994709a1c5a64ed3621f583c49a27e521.

    Signed-off-by: Tejun Heo
    Signed-off-by: Greg Kroah-Hartman

    Tejun Heo
     
  • Consolidate sd dentry association into sysfs_attach_dentry() and
    call it after dentry and inode are properly set up. This is in
    preparation of sysfs_drop_dentry() updates.

    Signed-off-by: Tejun Heo
    Signed-off-by: Greg Kroah-Hartman

    Tejun Heo
     
  • Now that sysfs_dirent can be disconnected from kobject on deletion,
    there is no need to orphan each attribute files. All [bin_]attribute
    nodes are automatically orphaned when the parent node is deleted.
    Kill attribute file orphaning.

    Signed-off-by: Tejun Heo
    Signed-off-by: Greg Kroah-Hartman

    Tejun Heo
     
  • 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/510293

    Signed-off-by: Tejun Heo
    Signed-off-by: Greg Kroah-Hartman

    Tejun Heo
     
  • Implement bin_buffer which contains a mutex and pointer to PAGE_SIZE
    buffer to properly synchronize accesses to per-openfile buffer and
    prepare for immediate-kobj-disconnect.

    Signed-off-by: Tejun Heo
    Signed-off-by: Greg Kroah-Hartman

    Tejun Heo
     
  • sysfs symlink is implemented by referencing dentry and kobject from
    sysfs_dirent - symlink entry references kobject, dentry is used to
    walk the tree. This complicates object lifetimes rules and is
    dangerous - for example, there is no way to tell to which module the
    target of a symlink belongs and referencing that kobject can make it
    linger after the module is gone.

    This patch reimplements symlink using only sysfs_dirent tree. sd for
    a symlink points and holds reference to the target sysfs_dirent and
    all walking is done using sysfs_dirent tree. Simpler and safer.

    Please read the following message for more info.

    http://article.gmane.org/gmane.linux.kernel/510293

    Signed-off-by: Tejun Heo
    Signed-off-by: Greg Kroah-Hartman

    Tejun Heo
     
  • kobj->dentry can go away anytime unless the user controls when the
    associated sysfs node is deleted. This patch implements
    kobj_sysfs_assoc_lock which protects kobj->dentry. This will be used
    to maintain kobj based API when converting sysfs to use sysfs_dirent
    tree instead of dentry/kobject.

    Note that this lock belongs to kobject/driver-model not sysfs. Once
    sysfs is converted to not use kobject in its interface, this can be
    removed from sysfs.

    This is in preparation of object reference simplification.

    Signed-off-by: Tejun Heo
    Signed-off-by: Greg Kroah-Hartman

    Tejun Heo
     
  • Make sd->s_element a union of sysfs_elem_{dir|symlink|attr|bin_attr}
    and rename it to s_elem. This is to achieve...

    * some level of type checking : changing symlink to point to
    sysfs_dirent instead of kobject is much safer and less painful now.
    * easier / standardized dereferencing
    * allow sysfs_elem_* to contain more than one entry

    Where possible, pointer is obtained by directly deferencing from sd
    instead of going through other entities. This reduces dependencies to
    dentry, inode and kobject. to_attr() and to_bin_attr() are unused now
    and removed.

    This is in preparation of object reference simplification.

    Signed-off-by: Tejun Heo
    Signed-off-by: Greg Kroah-Hartman

    Tejun Heo
     
  • Add s_name to sysfs_dirent. This is to further reduce dependency to
    the associated dentry. Name is copied for directories and symlinks
    but not for attributes.

    Where possible, name dereferences are converted to use sd->s_name.
    sysfs_symlink->link_name and sysfs_get_name() are unused now and
    removed.

    This change allows symlink to be implemented using sysfs_dirent tree
    proper, which is the last remaining dentry-dependent sysfs walk.

    Signed-off-by: Tejun Heo
    Signed-off-by: Greg Kroah-Hartman

    Tejun Heo
     
  • Add sysfs_dirent->s_parent. With this patch, each sd points to and
    holds a reference to its parent. This allows walking sysfs tree
    without referencing sd->s_dentry which can go away anytime if the user
    doesn't control when it's deleted.

    sd->s_parent is initialized and parent is referenced in
    sysfs_attach_dirent(). Reference to parent is released when the sd is
    released, so as long as reference to a sd is held, s_parent can be
    followed.

    dentry walk in sysfs_readdir() is convereted to s_parent walk.

    This will be used to reimplement symlink such that it uses only
    sysfs_dirent tree.

    Signed-off-by: Tejun Heo
    Signed-off-by: Greg Kroah-Hartman

    Tejun Heo