lkml.org 
[lkml]   [2008]   [Jun]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 07/11] sysfs: Implement sysfs_delete_link and sysfs_rename_link
    sysfs: Implement sysfs_delete_link and sysfs_rename_link

    When removing a symlink sysfs_remove_link does not provide
    enough information to figure out which tagged directory the symlink
    falls in. So I need sysfs_delete_link which is passed the target
    of the symlink to delete.

    Further half the time when we are removing a symlink the code is
    actually renaming the symlink but not doing so explicitly because
    we don't have a symlink rename method. So I have added sysfs_rename_link
    as well.

    Both of these functions now have enough information to find a symlink
    in a tagged directory. The only restriction is that they must be called
    before the target kobject is renamed or deleted. If they are called
    later I loose track of which tag the target kobject was marked with
    and can no longer find the old symlink to remove it.

    Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
    Signed-off-by: Benjamin Thery <benjamin.thery@bull.net>
    ---
    fs/sysfs/symlink.c | 31 +++++++++++++++++++++++++++++++
    include/linux/sysfs.h | 17 +++++++++++++++++
    2 files changed, 48 insertions(+)

    Index: linux-mm/fs/sysfs/symlink.c
    ===================================================================
    --- linux-mm.orig/fs/sysfs/symlink.c
    +++ linux-mm/fs/sysfs/symlink.c
    @@ -80,6 +80,21 @@ int sysfs_create_link(struct kobject * k
    }

    /**
    + * sysfs_delete_link - remove symlink in object's directory.
    + * @kobj: object we're acting for.
    + * @targ: object we're pointing to.
    + * @name: name of the symlink to remove.
    + *
    + * Unlike sysfs_remove_link sysfs_delete_link has enough information
    + * to successfully delete symlinks in tagged directories.
    + */
    +void sysfs_delete_link(struct kobject *kobj, struct kobject *targ,
    + const char *name)
    +{
    + sysfs_hash_and_remove(targ, kobj->sd, name);
    +}
    +
    +/**
    * sysfs_remove_link - remove symlink in object's directory.
    * @kobj: object we're acting for.
    * @name: name of the symlink to remove.
    @@ -97,6 +112,22 @@ void sysfs_remove_link(struct kobject *
    sysfs_hash_and_remove(kobj, parent_sd, name);
    }

    +/**
    + * sysfs_rename_link - rename symlink in object's directory.
    + * @kobj: object we're acting for.
    + * @targ: object we're pointing to.
    + * @old: previous name of the symlink.
    + * @new: new name of the symlink.
    + *
    + * A helper function for the common rename symlink idiom.
    + */
    +int sysfs_rename_link(struct kobject *kobj, struct kobject *targ,
    + const char *old, const char *new)
    +{
    + sysfs_delete_link(kobj, targ, old);
    + return sysfs_create_link(kobj, targ, new);
    +}
    +
    static int sysfs_get_target_path(struct sysfs_dirent *parent_sd,
    struct sysfs_dirent *target_sd, char *path)
    {
    Index: linux-mm/include/linux/sysfs.h
    ===================================================================
    --- linux-mm.orig/include/linux/sysfs.h
    +++ linux-mm/include/linux/sysfs.h
    @@ -113,6 +113,12 @@ int __must_check sysfs_create_link(struc
    const char *name);
    void sysfs_remove_link(struct kobject *kobj, const char *name);

    +int sysfs_rename_link(struct kobject *kobj, struct kobject *target,
    + const char *old_name, const char *new_name);
    +
    +void sysfs_delete_link(struct kobject *dir, struct kobject *targ,
    + const char *name);
    +
    int __must_check sysfs_create_group(struct kobject *kobj,
    const struct attribute_group *grp);
    int sysfs_update_group(struct kobject *kobj,
    @@ -194,6 +200,17 @@ static inline void sysfs_remove_link(str
    {
    }

    +static inline int sysfs_rename_link(struct kobject *k, struct kobject *t,
    + const char *old_name, const char *new_name)
    +{
    + return 0;
    +}
    +
    +static inline void sysfs_delete_link(struct kobject *k, struct kobject *t,
    + const char *name)
    +{
    +}
    +
    static inline int sysfs_create_group(struct kobject *kobj,
    const struct attribute_group *grp)
    {
    --


    \
     
     \ /
      Last update: 2008-06-18 19:13    [W:0.023 / U:126.096 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site