lkml.org 
[lkml]   [2009]   [May]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 16/26] sysfs: In sysfs_chmod_file lazily propagate the mode change.
    From: Eric W. Biederman <ebiederm@xmission.com>

    Now that sysfs_getattr and sysfs_permission refresh the vfs
    inode there is no need to immediatly push the mode change
    into the vfs cache. Reducing the amount of work needed and
    simplifying the locking.

    Acked-by: Tejun Heo <tj@kernel.org>
    Signed-off-by: Eric W. Biederman <ebiederm@aristanetworks.com>
    ---
    fs/sysfs/file.c | 31 ++++++++-----------------------
    1 files changed, 8 insertions(+), 23 deletions(-)

    diff --git a/fs/sysfs/file.c b/fs/sysfs/file.c
    index 0786b41..31cfe1d 100644
    --- a/fs/sysfs/file.c
    +++ b/fs/sysfs/file.c
    @@ -577,38 +577,23 @@ EXPORT_SYMBOL_GPL(sysfs_add_file_to_group);
    */
    int sysfs_chmod_file(struct kobject *kobj, struct attribute *attr, mode_t mode)
    {
    - struct sysfs_dirent *victim_sd = NULL;
    - struct dentry *victim = NULL;
    - struct inode * inode;
    + struct sysfs_dirent *sd;
    struct iattr newattrs;
    int rc;

    - rc = -ENOENT;
    - victim_sd = sysfs_get_dirent(kobj->sd, attr->name);
    - if (!victim_sd)
    - goto out;
    + mutex_lock(&sysfs_mutex);

    - mutex_lock(&sysfs_rename_mutex);
    - victim = sysfs_get_dentry(victim_sd);
    - mutex_unlock(&sysfs_rename_mutex);
    - if (IS_ERR(victim)) {
    - rc = PTR_ERR(victim);
    - victim = NULL;
    + rc = -ENOENT;
    + sd = sysfs_find_dirent(kobj->sd, attr->name);
    + if (!sd)
    goto out;
    - }
    -
    - inode = victim->d_inode;

    - mutex_lock(&inode->i_mutex);
    -
    - newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
    + newattrs.ia_mode = (mode & S_IALLUGO) | (sd->s_mode & ~S_IALLUGO);
    newattrs.ia_valid = ATTR_MODE;
    - rc = sysfs_setattr(victim, &newattrs);
    + rc = sysfs_sd_setattr(sd, &newattrs);

    - mutex_unlock(&inode->i_mutex);
    out:
    - dput(victim);
    - sysfs_put(victim_sd);
    + mutex_unlock(&sysfs_mutex);
    return rc;
    }
    EXPORT_SYMBOL_GPL(sysfs_chmod_file);
    --
    1.6.3.1.54.g99dd.dirty


    \
     
     \ /
      Last update: 2009-05-29 22:33    [W:0.025 / U:30.384 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site