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 10/26] sysfs: Optimize just changing the sysfs file mode.
    From: Eric W. Biederman <ebiederm@xmission.com>

    Don't allocate a struct iattr for the sysfs dentry if just
    the mode changes because we have a field for that on the
    sysfs_dirent, and we can trigger that case with sysfs_chmod_file.

    Signed-off-by: Eric W. Biederman <ebiederm@aristanetworks.com>
    ---
    fs/sysfs/inode.c | 22 ++++++++++++++--------
    1 files changed, 14 insertions(+), 8 deletions(-)

    diff --git a/fs/sysfs/inode.c b/fs/sysfs/inode.c
    index 555f0ff..70ff2a2 100644
    --- a/fs/sysfs/inode.c
    +++ b/fs/sysfs/inode.c
    @@ -60,12 +60,16 @@ int sysfs_setattr(struct dentry * dentry, struct iattr * iattr)
    return error;

    iattr->ia_valid &= ~ATTR_SIZE; /* ignore size changes */
    + if (iattr->ia_valid & ATTR_MODE) {
    + if (!in_group_p(inode->i_gid) && !capable(CAP_FSETID))
    + iattr->ia_mode &= ~S_ISGID;
    + }

    error = inode_setattr(inode, iattr);
    if (error)
    return error;

    - if (!sd_iattr) {
    + if (!sd_iattr && (ia_valid & ~ATTR_MODE)) {
    /* setting attributes for the first time, allocate now */
    sd_iattr = kzalloc(sizeof(struct iattr), GFP_KERNEL);
    if (!sd_iattr)
    @@ -78,6 +82,13 @@ int sysfs_setattr(struct dentry * dentry, struct iattr * iattr)
    sd->s_iattr = sd_iattr;
    }

    + if (ia_valid & ATTR_MODE)
    + sd->s_mode = iattr->ia_mode;
    +
    + /* If we don't need the extra attributes leave */
    + if (!sd_iattr)
    + return 0;
    +
    /* attributes were changed atleast once in past */

    if (ia_valid & ATTR_UID)
    @@ -93,13 +104,8 @@ int sysfs_setattr(struct dentry * dentry, struct iattr * iattr)
    if (ia_valid & ATTR_CTIME)
    sd_iattr->ia_ctime = timespec_trunc(iattr->ia_ctime,
    inode->i_sb->s_time_gran);
    - if (ia_valid & ATTR_MODE) {
    - umode_t mode = iattr->ia_mode;
    -
    - if (!in_group_p(inode->i_gid) && !capable(CAP_FSETID))
    - mode &= ~S_ISGID;
    - sd_iattr->ia_mode = sd->s_mode = mode;
    - }
    + if (ia_valid & ATTR_MODE)
    + sd_iattr->ia_mode = iattr->ia_mode;

    return error;
    }
    --
    1.6.3.1.54.g99dd.dirty


    \
     
     \ /
      Last update: 2009-05-29 22:29    [W:5.077 / U:0.040 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site