lkml.org 
[lkml]   [2008]   [Apr]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 05/10] sysfs: sysfs_chmod_file handle multiple superblocks
    sysfs: sysfs_chmod_file handle multiple superblocks

    Teach sysfs_chmod_file how to handle multiple sysfs
    superblocks.

    Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
    Acked-by: Benjamin Thery <benjamin.thery@bull.net>
    ---
    fs/sysfs/file.c | 53 +++++++++++++++++++++++++++++------------------------
    1 file changed, 29 insertions(+), 24 deletions(-)
    Index: linux-mm/fs/sysfs/file.c
    ===================================================================
    --- linux-mm.orig/fs/sysfs/file.c
    +++ linux-mm/fs/sysfs/file.c
    @@ -567,7 +567,8 @@ EXPORT_SYMBOL_GPL(sysfs_add_file_to_grou
    int sysfs_chmod_file(struct kobject *kobj, struct attribute *attr, mode_t mode)
    {
    struct sysfs_dirent *victim_sd = NULL;
    - struct dentry *victim = NULL;
    + struct super_block *sb;
    + struct dentry *victim;
    struct inode * inode;
    struct iattr newattrs;
    int rc;
    @@ -578,31 +579,35 @@ int sysfs_chmod_file(struct kobject *kob
    goto out;

    mutex_lock(&sysfs_rename_mutex);
    - victim = sysfs_get_dentry(sysfs_sb, victim_sd);
    - mutex_unlock(&sysfs_rename_mutex);
    - if (IS_ERR(victim)) {
    - rc = PTR_ERR(victim);
    - victim = NULL;
    - goto out;
    - }
    -
    - inode = victim->d_inode;
    + sysfs_grab_supers();
    + list_for_each_entry(sb, &sysfs_fs_type.fs_supers, s_instances) {
    + victim = sysfs_get_dentry(sb, victim_sd);
    + if (victim == ERR_PTR(-EXDEV))
    + continue;
    + if (IS_ERR(victim)) {
    + rc = PTR_ERR(victim);
    + victim = NULL;
    + goto out_unlock;
    + }
    +
    + inode = victim->d_inode;
    + mutex_lock(&inode->i_mutex);
    + newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
    + newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
    + rc = notify_change(victim, &newattrs);
    + if (rc == 0) {
    + mutex_lock(&sysfs_mutex);
    + victim_sd->s_mode = newattrs.ia_mode;
    + mutex_unlock(&sysfs_mutex);
    + }
    + mutex_unlock(&inode->i_mutex);

    - mutex_lock(&inode->i_mutex);
    -
    - newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
    - newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
    - rc = notify_change(victim, &newattrs);
    -
    - if (rc == 0) {
    - mutex_lock(&sysfs_mutex);
    - victim_sd->s_mode = newattrs.ia_mode;
    - mutex_unlock(&sysfs_mutex);
    + dput(victim);
    }
    -
    - mutex_unlock(&inode->i_mutex);
    - out:
    - dput(victim);
    +out_unlock:
    + sysfs_release_supers();
    + mutex_unlock(&sysfs_rename_mutex);
    +out:
    sysfs_put(victim_sd);
    return rc;
    }
    --


    \
     
     \ /
      Last update: 2008-04-29 19:41    [from the cache]
    ©2003-2014 Jasper Spaans. Advertise on this site