08 Jun, 2014

1 commit

  • commit f5c16f29bf5e57ba4051fc7785ba7f035f798c71 upstream.

    13c589d5b0ac ("sysfs: use seq_file when reading regular files")
    switched sysfs from custom read implementation to seq_file to enable
    later transition to kernfs. After the change, the buffer passed to
    ->show() is acquired through seq_get_buf(); unfortunately, this
    introduces a subtle behavior change. Before the commit, the buffer
    passed to ->show() was always zero as it was allocated using
    get_zeroed_page(). Because seq_file doesn't clear buffers on
    allocation and neither does seq_get_buf(), after the commit, depending
    on the behavior of ->show(), we may end up exposing uninitialized data
    to userland thus possibly altering userland visible behavior and
    leaking information.

    Fix it by explicitly clearing the buffer.

    Signed-off-by: Tejun Heo
    Reported-by: Ron
    Fixes: 13c589d5b0ac ("sysfs: use seq_file when reading regular files")
    Signed-off-by: Greg Kroah-Hartman

    Tejun Heo
     

25 Feb, 2014

1 commit

  • As mount() and kill_sb() is not a one-to-one match, we shoudn't get
    ns refcnt unconditionally in sysfs_mount(), and instead we should
    get the refcnt only when kernfs_mount() allocated a new superblock.

    v2:
    - Changed the name of the new argument, suggested by Tejun.
    - Made the argument optional, suggested by Tejun.

    v3:
    - Make the new argument as second-to-last arg, suggested by Tejun.

    Signed-off-by: Li Zefan
    Acked-by: Tejun Heo
    ---
    fs/kernfs/mount.c | 8 +++++++-
    fs/sysfs/mount.c | 5 +++--
    include/linux/kernfs.h | 9 +++++----
    3 files changed, 15 insertions(+), 7 deletions(-)
    Signed-off-by: Greg Kroah-Hartman

    Li Zefan
     

14 Jan, 2014

2 commits

  • This reverts commit 1ae06819c77cff1ea2833c94f8c093fe8a5c79db.

    Tejun writes:
    I'm sorry but can you please revert the whole series?
    get_active() waiting while a node is deactivated has potential
    to lead to deadlock and that deactivate/reactivate interface is
    something fundamentally flawed and that cgroup will have to work
    with the remove_self() like everybody else. IOW, I think the
    first posting was correct.

    Cc: Tejun Heo
    Cc: Alan Stern
    Cc: kbuild test robot
    Signed-off-by: Greg Kroah-Hartman

    Greg Kroah-Hartman
     
  • This reverts commit d1ba277e79889085a2faec3b68b91ce89c63f888.

    Tejun writes:
    I'm sorry but can you please revert the whole series?
    get_active() waiting while a node is deactivated has potential
    to lead to deadlock and that deactivate/reactivate interface is
    something fundamentally flawed and that cgroup will have to work
    with the remove_self() like everybody else. IOW, I think the
    first posting was correct.

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

    Greg Kroah-Hartman
     

11 Jan, 2014

2 commits

  • All device_schedule_callback_owner() users are converted to use
    device_remove_file_self(). Remove now unused
    {sysfs|device}_schedule_callback_owner().

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

    Tejun Heo
     
  • Sometimes it's necessary to implement a node which wants to delete
    nodes including itself. This isn't straightforward because of kernfs
    active reference. While a file operation is in progress, an active
    reference is held and kernfs_remove() waits for all such references to
    drain before completing. For a self-deleting node, this is a deadlock
    as kernfs_remove() ends up waiting for an active reference that itself
    is sitting on top of.

    This currently is worked around in the sysfs layer using
    sysfs_schedule_callback() which makes such removals asynchronous.
    While it works, it's rather cumbersome and inherently breaks
    synchronicity of the operation - the file operation which triggered
    the operation may complete before the removal is finished (or even
    started) and the removal may fail asynchronously. If a removal
    operation is immmediately followed by another operation which expects
    the specific name to be available (e.g. removal followed by rename
    onto the same name), there's no way to make the latter operation
    reliable.

    The thing is there's no inherent reason for this to be asynchrnous.
    All that's necessary to do this synchronous is a dedicated operation
    which drops its own active ref and deactivates self. This patch
    implements kernfs_remove_self() and its wrappers in sysfs and driver
    core. kernfs_remove_self() is to be called from one of the file
    operations, drops the active ref and deactivates using
    __kernfs_deactivate_self(), removes the self node, and restores active
    ref to the dead node using __kernfs_reactivate_self() so that the ref
    is balanced afterwards. __kernfs_remove() is updated so that it takes
    an early exit if the target node is already fully removed so that the
    active ref restored by kernfs_remove_self() after removal doesn't
    confuse the deactivation path.

    This makes implementing self-deleting nodes very easy. The normal
    removal path doesn't even need to be changed to use
    kernfs_remove_self() for the self-deleting node. The method can
    invoke kernfs_remove_self() on itself before proceeding the normal
    removal path. kernfs_remove() invoked on the node by the normal
    deletion path will simply be ignored.

    This will replace sysfs_schedule_callback(). A subtle feature of
    sysfs_schedule_callback() is that it collapses multiple invocations -
    even if multiple removals are triggered, the removal callback is run
    only once. An equivalent effect can be achieved by testing the return
    value of kernfs_remove_self() - only the one which gets %true return
    value should proceed with actual deletion. All other instances of
    kernfs_remove_self() will wait till the enclosing kernfs operation
    which invoked the winning instance of kernfs_remove_self() finishes
    and then return %false. This trivially makes all users of
    kernfs_remove_self() automatically show correct synchronous behavior
    even when there are multiple concurrent operations - all "echo 1 >
    delete" instances will finish only after the whole operation is
    completed by one of the instances.

    v2: For !CONFIG_SYSFS, dummy version kernfs_remove_self() was missing
    and sysfs_remove_file_self() had incorrect return type. Fix it.
    Reported by kbuild test bot.

    v3: Updated to use __kernfs_{de|re}activate_self().

    Signed-off-by: Tejun Heo
    Cc: Alan Stern
    Cc: kbuild test robot
    Signed-off-by: Greg Kroah-Hartman

    Tejun Heo
     

18 Dec, 2013

3 commits

  • Add support for mkdir(2), rmdir(2) and rename(2) syscalls. This is
    implemented through optional kernfs_dir_ops callback table which can
    be specified on kernfs_create_root(). An implemented callback is
    invoked when the matching syscall is invoked.

    As kernfs keep dcache syncs with internal representation and
    revalidates dentries on each access, the implementation of these
    methods is extremely simple. Each just discovers the relevant
    kernfs_node(s) and invokes the requested callback which is allowed to
    do any kernfs operations and the end result doesn't necessarily have
    to match the expected semantics of the syscall.

    This will be used to convert cgroup to use kernfs instead of its own
    filesystem implementation.

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

    Tejun Heo
     
  • Because sysfs used struct attribute which are supposed to stay
    constant, sysfs didn't copy names when creating regular files. The
    specified string for name was supposed to stay constant. Such
    distinction isn't inherent for kernfs. kernfs_create_file[_ns]()
    should be able to take the same @name as kernfs_create_dir[_ns]()

    As there can be huge number of sysfs attributes, we still want to be
    able to use static names for sysfs attributes. This patch renames
    kernfs_create_file_ns_key() to __kernfs_create_file() and adds
    @name_is_static parameter so that the caller can explicitly indicate
    that @name can be used without copying. kernfs is updated to use
    KERNFS_STATIC_NAME to distinguish static and copied names.

    This patch doesn't introduce any behavior changes.

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

    Tejun Heo
     
  • sysfs assumed 0755 for all newly created directories and kernfs
    inherited it. This assumption is unnecessarily restrictive and
    inconsistent with kernfs_create_file[_ns](). This patch adds @mode
    parameter to kernfs_create_dir[_ns]() and update uses in sysfs
    accordingly. Among others, this will be useful for implementations of
    the planned ->mkdir() method.

    This patch doesn't introduce any behavior differences.

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

    Tejun Heo
     

12 Dec, 2013

4 commits

  • kernfs has just been separated out from sysfs and we're already in
    full conflict mode. Nothing can make the situation any worse. Let's
    take the chance to name things properly.

    This patch performs the following renames.

    * s/SYSFS_DIR/KERNFS_DIR/
    * s/SYSFS_KOBJ_ATTR/KERNFS_FILE/
    * s/SYSFS_KOBJ_LINK/KERNFS_LINK/
    * s/SYSFS_{TYPE_FLAGS}/KERNFS_{TYPE_FLAGS}/
    * s/SYSFS_FLAG_{FLAG}/KERNFS_{FLAG}/
    * s/sysfs_type()/kernfs_type()/
    * s/SD_DEACTIVATED_BIAS/KN_DEACTIVATED_BIAS/

    This patch is strictly rename only and doesn't introduce any
    functional difference.

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

    Tejun Heo
     
  • kernfs has just been separated out from sysfs and we're already in
    full conflict mode. Nothing can make the situation any worse. Let's
    take the chance to name things properly.

    This patch performs the following renames.

    * s/sysfs_open_dirent/kernfs_open_node/
    * s/sysfs_open_file/kernfs_open_file/
    * s/sysfs_inode_attrs/kernfs_iattrs/
    * s/sysfs_addrm_cxt/kernfs_addrm_cxt/
    * s/sysfs_super_info/kernfs_super_info/
    * s/sysfs_info()/kernfs_info()/
    * s/sysfs_open_dirent_lock/kernfs_open_node_lock/
    * s/sysfs_open_file_mutex/kernfs_open_file_mutex/
    * s/sysfs_of()/kernfs_of()/

    This patch is strictly rename only and doesn't introduce any
    functional difference.

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

    Tejun Heo
     
  • kernfs has just been separated out from sysfs and we're already in
    full conflict mode. Nothing can make the situation any worse. Let's
    take the chance to name things properly.

    s_ prefix for kernfs members is used inconsistently and a misnomer
    now. It's not like kernfs_node is used widely across the kernel
    making the ability to grep for the members particularly useful. Let's
    just drop the prefix.

    This patch is strictly rename only and doesn't introduce any
    functional difference.

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

    Tejun Heo
     
  • kernfs has just been separated out from sysfs and we're already in
    full conflict mode. Nothing can make the situation any worse. Let's
    take the chance to name things properly.

    This patch performs the following renames.

    * s/sysfs_elem_dir/kernfs_elem_dir/
    * s/sysfs_elem_symlink/kernfs_elem_symlink/
    * s/sysfs_elem_attr/kernfs_elem_file/
    * s/sysfs_dirent/kernfs_node/
    * s/sd/kn/ in kernfs proper
    * s/parent_sd/parent/
    * s/target_sd/target/
    * s/dir_sd/parent/
    * s/to_sysfs_dirent()/rb_to_kn()/
    * misc renames of local vars when they conflict with the above

    Because md, mic and gpio dig into sysfs details, this patch ends up
    modifying them. All are sysfs_dirent renames and trivial. While we
    can avoid these by introducing a dummy wrapping struct sysfs_dirent
    around kernfs_node, given the limited usage outside kernfs and sysfs
    proper, I don't think such workaround is called for.

    This patch is strictly rename only and doesn't introduce any
    functional difference.

    - mic / gpio renames were missing. Spotted by kbuild test robot.

    Signed-off-by: Tejun Heo
    Cc: Neil Brown
    Cc: Linus Walleij
    Cc: Ashutosh Dixit
    Cc: kbuild test robot
    Signed-off-by: Greg Kroah-Hartman

    Tejun Heo
     

11 Dec, 2013

2 commits

  • While restructuring the [u]mount path, 4b93dc9b1c68 ("sysfs, kernfs:
    prepare mount path for kernfs") incorrectly updated sysfs_kill_sb() so
    that it first kills super_block and then tries to dereference its
    namespace tag to drop it. Fix it by caching namespace tag before
    killing the superblock and then drop the cached namespace tag.

    Signed-off-by: Tejun Heo
    Reported-by: Yuanhan Liu
    Tested-by: Yuanhan Liu
    Tested-by: Vlastimil Babka
    Link: http://lkml.kernel.org/g/20131205031051.GC5135@yliu-dev.sh.intel.com
    Signed-off-by: Greg Kroah-Hartman

    Tejun Heo
     
  • This is v3.14 fix for the same issue that a8b14744429f ("sysfs: give
    different locking key to regular and bin files") addresses for v3.13.
    Due to the extensive kernfs reorganization in v3.14 branch, the same
    fix couldn't be ported as-is. The v3.13 fix was ignored while merging
    it into v3.14 branch.

    027a485d12e0 ("sysfs: use a separate locking class for open files
    depending on mmap") assigned different lockdep key to
    sysfs_open_file->mutex depending on whether the file implements mmap
    or not in an attempt to avoid spurious lockdep warning caused by
    merging of regular and bin file paths.

    While this restored some of the original behavior of using different
    locks (at least lockdep is concerned) for the different clases of
    files. The restoration wasn't full because now the lockdep key
    assignment depends on whether the file has mmap or not instead of
    whether it's a regular file or not.

    This means that bin files which don't implement mmap will get assigned
    the same lockdep class as regular files. This is problematic because
    file_operations for bin files still implements the mmap file operation
    and checking whether the sysfs file actually implements mmap happens
    in the file operation after grabbing @sysfs_open_file->mutex. We
    still end up adding locking dependency from mmap locking to
    sysfs_open_file->mutex to the regular file mutex which triggers
    spurious circular locking warning.

    For v3.13, a8b14744429f ("sysfs: give different locking key to regular
    and bin files") fixed it by giving sysfs_open_file->mutex different
    lockdep keys depending on whether the file is regular or bin instead
    of whether mmap exists or not; however, due to the way sysfs is now
    layered behind kernfs, this approach is no longer viable. kernfs can
    tell whether a sysfs node has mmap implemented or not but can't tell
    whether a bin file from a regular one.

    This patch updates kernfs such that kernfs_file_mmap() checks
    SYSFS_FLAG_HAS_MMAP and bail before grabbing sysfs_open_file->mutex so
    that it doesn't add spurious locking dependency from mmap to
    sysfs_open_file->mutex and changes sysfs so that it specifies
    kernfs_ops->mmap iff the sysfs file implements mmap. Combined, this
    ensures that sysfs_open_file->mutex is grabbed under mmap path iff the
    sysfs file actually implements mmap. As sysfs_open_file->mutex is
    already given a different lockdep key if mmap is implemented, this
    removes the spurious locking dependency.

    Signed-off-by: Tejun Heo
    Reported-by: Dave Jones
    Link: http://lkml.kernel.org/g/20131203184324.GA11320@redhat.com
    Signed-off-by: Greg Kroah-Hartman

    Tejun Heo
     

30 Nov, 2013

25 commits

  • fs/kernfs/kernfs-internal.h needed to include fs/sysfs/sysfs.h because
    part of kernfs core implementation was living in sysfs.

    fs/sysfs/sysfs.h needed to include fs/kernfs/kernfs-internal.h because
    include/linux/kernfs.h didn't expose enough interface.

    The separation is complete and neither is true anymore. Remove the
    cross inclusion and make sysfs a proper user of kernfs.

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

    Tejun Heo
     
  • fs/sysfs/symlink.c::sysfs_delete_link() tests @sd->s_flags for
    SYSFS_FLAG_NS. Let's add kernfs_ns_enabled() so that sysfs doesn't
    have to test sysfs_dirent flag directly. This makes things tidier for
    kernfs proper too.

    This is purely cosmetic.

    v2: To avoid possible NULL deref, use noop dummy implementation which
    always returns false when !CONFIG_SYSFS.

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

    Tejun Heo
     
  • Move core mount code to fs/kernfs/mount.c. The respective
    declarations in fs/sysfs/sysfs.h are moved to
    fs/kernfs/kernfs-internal.h.

    This is pure relocation.

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

    Tejun Heo
     
  • We're in the process of separating out core sysfs functionality into
    kernfs which will deal with sysfs_dirents directly. This patch
    rearranges mount path so that the kernfs and sysfs parts are separate.

    * As sysfs_super_info won't be visible outside kernfs proper,
    kernfs_super_ns() is added to allow kernfs users to access a
    super_block's namespace tag.

    * Generic mount operation is separated out into kernfs_mount_ns().
    sysfs_mount() now just performs sysfs-specific permission check,
    acquires namespace tag, and invokes kernfs_mount_ns().

    * Generic superblock release is separated out into kernfs_kill_sb()
    which can be used directly as file_system_type->kill_sb(). As sysfs
    needs to put the namespace tag, sysfs_kill_sb() wraps
    kernfs_kill_sb() with ns tag put.

    * sysfs_dir_cachep init and sysfs_inode_init() are separated out into
    kernfs_init(). kernfs_init() uses only small amount of memory and
    trying to handle and propagate kernfs_init() failure doesn't make
    much sense. Use SLAB_PANIC for sysfs_dir_cachep and make
    sysfs_inode_init() panic on failure.

    After this change, kernfs_init() should be called before
    sysfs_init(), fs/namespace.c::mnt_init() modified accordingly.

    Signed-off-by: Tejun Heo
    Cc: linux-fsdevel@vger.kernel.org
    Cc: Christoph Hellwig
    Signed-off-by: Greg Kroah-Hartman

    Tejun Heo
     
  • kernfs is being updated to allow multiple sysfs_dirent hierarchies so
    that it can also be used by other users. Currently, sysfs
    super_blocks are always attached to one kernfs_root - sysfs_root - and
    distinguished only by their namespace tags.

    This patch adds sysfs_super_info->root and update
    sysfs_fill/test_super() so that super_blocks are identified by the
    combination of both the associated kernfs_root and namespace tag.
    This allows mounting different kernfs hierarchies.

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

    Tejun Heo
     
  • There currently is single kernfs hierarchy in the whole system which
    is used for sysfs. kernfs needs to support multiple hierarchies to
    allow other users. This patch introduces struct kernfs_root which
    serves as the root of each kernfs hierarchy and implements
    kernfs_create/destroy_root().

    * Each kernfs_root is associated with a root sd (sysfs_dentry). The
    root is freed when the root sd is released and kernfs_destory_root()
    simply invokes kernfs_remove() on the root sd. sysfs_remove_one()
    is updated to handle release of the root sd. Note that ps_iattr
    update in sysfs_remove_one() is trivially updated for readability.

    * Root sd's are now dynamically allocated using sysfs_new_dirent().
    Update sysfs_alloc_ino() so that it gives out ino from 1 so that the
    root sd still gets ino 1.

    * While kernfs currently only points to the root sd, it'll soon grow
    fields which are specific to each hierarchy. As determining a given
    sd's root will be necessary, sd->s_dir.root is added. This backlink
    fits better as a separate field in sd; however, sd->s_dir is inside
    union with space to spare, so use it to save space and provide
    kernfs_root() accessor to determine the root sd.

    * As hierarchies may be destroyed now, each mount needs to hold onto
    the hierarchy it's attached to. Update sysfs_fill_super() and
    sysfs_kill_sb() so that they get and put the kernfs_root
    respectively.

    * sysfs_root is replaced with kernfs_root which is dynamically created
    by invoking kernfs_create_root() from sysfs_init().

    This patch doesn't introduce any visible behavior changes.

    v2: kernfs_create_root() forgot to set @sd->priv. Fixed.

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

    Tejun Heo
     
  • Currently, it's assumed that there's a single kernfs hierarchy in the
    system anchored at sysfs_root which is defined as a global struct. To
    allow other users of kernfs, this will be made dynamic. Introduce a
    new global variable sysfs_root_sd which points to &sysfs_root and
    convert all &sysfs_root users.

    This patch doesn't introduce any behavior difference.

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

    Tejun Heo
     
  • It has been very long since sysfs depended on vfs to keep track of
    internal states and whether sysfs is mounted or not doesn't make any
    difference to sysfs's internal operation.

    In addition to init and filesystem type registration, sysfs_init()
    invokes kern_mount() to create in-kernel mount of sysfs. This
    internal mounting doesn't server any purpose anymore. Remove it.

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

    Tejun Heo
     
  • Add const qualifier to sysfs_super_info->ns so that it's consistent
    with other namespace tag usages in sysfs. Because kobject doesn't use
    const qualifier for namespace tags, this ends up requiring an explicit
    cast to drop const qualifier in free_sysfs_super_info().

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

    Tejun Heo
     
  • sysfs_fill_super() takes three params - @sb, @data and @silent - but
    uses only @sb. Drop the latter two.

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

    Tejun Heo
     
  • Move core symlink code to fs/kernfs/symlink.c. fs/sysfs/symlink.c now
    only contains sysfs wrappers around kernfs interfaces. The respective
    declarations in fs/sysfs/sysfs.h are moved to
    fs/kernfs/kernfs-internal.h.

    This is pure relocation.

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

    Tejun Heo
     
  • Move core file code to fs/kernfs/file.c. fs/sysfs/file.c now contains
    sysfs kernfs_ops callbacks, sysfs wrappers around kernfs interfaces,
    and sysfs_schedule_callback(). The respective declarations in
    fs/sysfs/sysfs.h are moved to fs/kernfs/kernfs-internal.h.

    This is pure relocation.

    v2: Refreshed on top of the v2 of "sysfs, kernfs: prepare read path
    for kernfs".

    v3: Refreshed on top of the v3 of "sysfs, kernfs: prepare read path
    for kernfs".

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

    Tejun Heo
     
  • Move core dir code to fs/kernfs/dir.c. fs/sysfs/dir.c now only
    contains sysfs_warn_dup() and sysfs wrappers around kernfs interfaces.
    The respective declarations in fs/sysfs/sysfs.h are moved to
    fs/kernfs/kernfs-internal.h.

    This is pure relocation.

    v2: sysfs_symlink_target_lock was mistakenly relocated to kernfs. It
    should remain with sysfs. Fixed.

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

    Tejun Heo
     
  • There's nothing sysfs-specific in fs/sysfs/inode.c. Move everything
    in it to fs/kernfs/inode.c. The respective declarations in
    fs/sysfs/sysfs.h are moved to fs/kernfs/kernfs-internal.h.

    This is pure relocation.

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

    Tejun Heo
     
  • Move data structure, constant and basic accessor declarations from
    fs/sysfs/sysfs.h to fs/kernfs/kernfs-internal.h. The two files
    currently include each other. Once kernfs / sysfs separation is
    complete, the cross inclusions will be removed. Inclusion protectors
    are added to fs/sysfs/sysfs.h to allow cross-inclusion.

    This patch doesn't introduce any functional changes.

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

    Tejun Heo
     
  • Introduce kernfs interface for finding, getting and putting
    sysfs_dirents.

    * sysfs_find_dirent() is renamed to kernfs_find_ns() and lockdep
    assertion for sysfs_mutex is added.

    * sysfs_get_dirent_ns() is renamed to kernfs_find_and_get().

    * Macro inline dancing around __sysfs_get/put() are removed and
    kernfs_get/put() are made proper functions implemented in
    fs/sysfs/dir.c.

    While the conversions are mostly equivalent, there's one difference -
    kernfs_get() doesn't return the input param as its return value. This
    change is intentional. While passing through the input increases
    writability in some areas, it is unnecessary and has been shown to
    cause confusion regarding how the last ref is handled.

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

    Tejun Heo
     
  • Currently, sysfs_dirent active_ref lockdep annotation uses
    attribute->[s]key as the lockdep key, which forces
    kernfs_create_file_ns() to assume that sysfs_dirent->priv is pointing
    to a struct attribute which may not be true for non-sysfs users. This
    patch restructures the lockdep annotation such that

    * kernfs_ops contains lockdep_key which is used by default for files
    created kernfs_create_file_ns().

    * kernfs_create_file_ns_key() is introduced which takes an extra @key
    argument. The created file will use the specified key for
    active_ref lockdep annotation. If NULL is specified, lockdep for
    the file is disabled.

    * sysfs_add_file_mode_ns() is updated to use
    kernfs_create_file_ns_key() with the appropriate key from the
    attribute or NULL if ignore_lockdep is set.

    This makes the lockdep annotation properly contained in kernfs while
    allowing sysfs to cleanly keep its current behavior. This patch
    doesn't introduce any behavior differences.

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

    Tejun Heo
     
  • We want to add one more SYSFS_FLAG_* but we can't use the next higher
    bit, 0x10000, as the flag field is 16bits wide. The flags are
    currently arranged weirdly - 8 bits are set aside for the type flags
    when there are only three three used, the first flag starts at 0x1000
    instead of 0x0100 and flag literals have 5 digits (20 bits) when only
    4 digits can be used.

    Rearrange them so that type bits are only the lowest four, flags start
    at 0x0010 and similar flags are grouped.

    This patch doesn't cause any behavior difference.

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

    Tejun Heo
     
  • Introduce kernfs interface to wake up poll(2) which takes and returns
    sysfs_dirents.

    sysfs_notify_dirent() is renamed to kernfs_notify() and sysfs_notify()
    is updated so that it doesn't directly grab sysfs_mutex but acquires
    the target sysfs_dirents using sysfs_get_dirent().
    sysfs_notify_dirent() is reimplemented as a dumb inline wrapper around
    kernfs_notify().

    This patch doesn't introduce any behavior changes.

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

    Tejun Heo
     
  • kernfs_ops currently only supports single_open() behavior which is
    pretty restrictive. Add optional callbacks ->seq_{start|next|stop}()
    which, when implemented, are invoked for seq_file traversal. This
    allows full seq_file functionality for kernfs users. This currently
    doesn't have any user and doesn't change any behavior.

    v2: Refreshed on top of the updated "sysfs, kernfs: prepare read path
    for kernfs".

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

    Tejun Heo
     
  • sysfs_add_one() is a wrapper around __sysfs_add_one() which prints out
    duplicate name warning if __sysfs_add_one() fails with -EEXIST. The
    previous kernfs conversions moved all dup warnings to sysfs interface
    functions and sysfs_add_one() doesn't have any user left.

    Remove sysfs_add_one() and update __sysfs_add_one() to take its name.

    This patch doesn't make any functional changes.

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

    Tejun Heo
     
  • Introduce kernfs interface to create a file which takes and returns
    sysfs_dirents.

    The actual file creation part is separated out from
    sysfs_add_file_mode_ns() into kernfs_create_file_ns(). The former now
    only decides the kernfs_ops to use and the file's size and invokes the
    latter.

    This patch doesn't introduce behavior changes.

    v2: Dummy implementation for !CONFIG_SYSFS updated to return -ENOSYS.

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

    Tejun Heo
     
  • After kernfs_ops and sysfs_dirent->s_attr.size addition, the
    distinction between SYSFS_KOBJ_BIN_ATTR and SYSFS_KOBJ_ATTR is only
    necessary while creating files to decide which kernfs_ops to use.
    Afterwards, they behave exactly the same.

    This patch removes SYSFS_KOBJ_BIN_ATTR along with sysfs_is_bin().
    sysfs_add_file[_mode_ns]() are updated to take bool @is_bin instead of
    @type.

    This patch doesn't introduce any behavior changes. This completely
    isolates the distinction between the two sysfs file types in the sysfs
    layer proper.

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

    Tejun Heo
     
  • sysfs sets the size of regular files unconditionally at PAGE_SIZE and
    takes the size of bin files from bin_attribute. The latter is a
    pretty bad interface which forces bin_attribute users to create a
    separate copy of bin_attribute for each instance of the file -
    e.g. pci resource files.

    Add sysfs_dirent->s_attr.size so that the size can be specified
    separately. This unifies inode init paths of ATTR and BIN_ATTR
    identical and allows for generic size handling for kernfs.

    Unfortunately, this grows the size of sysfs_dirent by sizeof(loff_t).

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

    Tejun Heo
     
  • We're in the process of separating out core sysfs functionality into
    kernfs which will deal with sysfs_dirents directly. This patch
    introduces kernfs_ops which hosts methods kernfs users implement and
    updates fs/sysfs/file.c such that sysfs_kf_*() functions populate
    kernfs_ops and kernfs_file_*() functions call the matching entries
    from kernfs_ops.

    kernfs_ops contains the following groups of methods.

    * seq_show() - for kernfs files which use seq_file for reads.

    * read() - for direct read implementations. Used iff seq_show() is
    not implemented.

    * write() - for writes.

    * mmap() - for mmaps.

    Notes:

    * sysfs_elem_attr->ops is added so that kernfs_ops can be accessed
    from sysfs_dirent. kernfs_ops() helper is added to verify locking
    and access the field.

    * SYSFS_FLAG_HAS_(SEQ_SHOW|MMAP) added. sd->s_attr->ops is accessible
    only while holding active_ref and there are cases where we want to
    take different actions depending on which ops are implemented.
    These two flags cache whether the two ops are implemented for those.

    * kernfs_file_*() no longer test sysfs type but chooses different
    behaviors depending on which methods in kernfs_ops are implemented.
    The conversions are trivial except for the open path. As
    kernfs_file_open() now decides whether to allow read/write accesses
    depending on the kernfs_ops implemented, the presence of methods in
    kobjs and attribute_bin should be propagated to kernfs_ops.
    sysfs_add_file_mode_ns() is updated so that it propagates presence /
    absence of the callbacks through _empty, _ro, _wo, _rw kernfs_ops.

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

    Tejun Heo