lkml.org 
[lkml]   [2018]   [Sep]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.18 108/123] scsi: sysfs: Introduce sysfs_{un,}break_active_protection()
    Date
    4.18-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Bart Van Assche <bart.vanassche@wdc.com>

    commit 2afc9166f79b8f6da5f347f48515215ceee4ae37 upstream.

    Introduce these two functions and export them such that the next patch
    can add calls to these functions from the SCSI core.

    Signed-off-by: Bart Van Assche <bart.vanassche@wdc.com>
    Acked-by: Tejun Heo <tj@kernel.org>
    Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    fs/sysfs/file.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
    include/linux/sysfs.h | 14 ++++++++++++++
    2 files changed, 58 insertions(+)

    --- a/fs/sysfs/file.c
    +++ b/fs/sysfs/file.c
    @@ -406,6 +406,50 @@ int sysfs_chmod_file(struct kobject *kob
    EXPORT_SYMBOL_GPL(sysfs_chmod_file);

    /**
    + * sysfs_break_active_protection - break "active" protection
    + * @kobj: The kernel object @attr is associated with.
    + * @attr: The attribute to break the "active" protection for.
    + *
    + * With sysfs, just like kernfs, deletion of an attribute is postponed until
    + * all active .show() and .store() callbacks have finished unless this function
    + * is called. Hence this function is useful in methods that implement self
    + * deletion.
    + */
    +struct kernfs_node *sysfs_break_active_protection(struct kobject *kobj,
    + const struct attribute *attr)
    +{
    + struct kernfs_node *kn;
    +
    + kobject_get(kobj);
    + kn = kernfs_find_and_get(kobj->sd, attr->name);
    + if (kn)
    + kernfs_break_active_protection(kn);
    + return kn;
    +}
    +EXPORT_SYMBOL_GPL(sysfs_break_active_protection);
    +
    +/**
    + * sysfs_unbreak_active_protection - restore "active" protection
    + * @kn: Pointer returned by sysfs_break_active_protection().
    + *
    + * Undo the effects of sysfs_break_active_protection(). Since this function
    + * calls kernfs_put() on the kernfs node that corresponds to the 'attr'
    + * argument passed to sysfs_break_active_protection() that attribute may have
    + * been removed between the sysfs_break_active_protection() and
    + * sysfs_unbreak_active_protection() calls, it is not safe to access @kn after
    + * this function has returned.
    + */
    +void sysfs_unbreak_active_protection(struct kernfs_node *kn)
    +{
    + struct kobject *kobj = kn->parent->priv;
    +
    + kernfs_unbreak_active_protection(kn);
    + kernfs_put(kn);
    + kobject_put(kobj);
    +}
    +EXPORT_SYMBOL_GPL(sysfs_unbreak_active_protection);
    +
    +/**
    * sysfs_remove_file_ns - remove an object attribute with a custom ns tag
    * @kobj: object we're acting for
    * @attr: attribute descriptor
    --- a/include/linux/sysfs.h
    +++ b/include/linux/sysfs.h
    @@ -237,6 +237,9 @@ int __must_check sysfs_create_files(stru
    const struct attribute **attr);
    int __must_check sysfs_chmod_file(struct kobject *kobj,
    const struct attribute *attr, umode_t mode);
    +struct kernfs_node *sysfs_break_active_protection(struct kobject *kobj,
    + const struct attribute *attr);
    +void sysfs_unbreak_active_protection(struct kernfs_node *kn);
    void sysfs_remove_file_ns(struct kobject *kobj, const struct attribute *attr,
    const void *ns);
    bool sysfs_remove_file_self(struct kobject *kobj, const struct attribute *attr);
    @@ -350,6 +353,17 @@ static inline int sysfs_chmod_file(struc
    return 0;
    }

    +static inline struct kernfs_node *
    +sysfs_break_active_protection(struct kobject *kobj,
    + const struct attribute *attr)
    +{
    + return NULL;
    +}
    +
    +static inline void sysfs_unbreak_active_protection(struct kernfs_node *kn)
    +{
    +}
    +
    static inline void sysfs_remove_file_ns(struct kobject *kobj,
    const struct attribute *attr,
    const void *ns)

    \
     
     \ /
      Last update: 2018-09-03 19:42    [W:4.291 / U:0.068 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site