Teach sysfs_chmod_file how to handle multiple sysfs
superblocks.  We need to iterate over each superblock
so that we give all of the appropriate filesystem modification
notifications.

Signed-off-by: Eric W. Biederman <[EMAIL PROTECTED]>
---
 fs/sysfs/file.c |   41 +++++++++++++++++++++++++----------------
 1 files changed, 25 insertions(+), 16 deletions(-)

diff --git a/fs/sysfs/file.c b/fs/sysfs/file.c
index f954b9f..cff054f 100644
--- a/fs/sysfs/file.c
+++ b/fs/sysfs/file.c
@@ -501,7 +501,8 @@ int sysfs_update_file(struct kobject * kobj, const struct 
attribute * attr)
 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;
@@ -512,22 +513,30 @@ int sysfs_chmod_file(struct kobject *kobj, struct 
attribute *attr, mode_t mode)
                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;
+       sysfs_grab_supers();
+       list_for_each_entry(sb, &sysfs_fs_type.fs_supers, s_instances) {
+               victim = sysfs_get_dentry(sb, victim_sd);
+               if (!victim)
+                       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);
+               mutex_unlock(&inode->i_mutex);
+
+               dput(victim);
        }
-
-       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);
-       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;
 }
-- 
1.5.1.1.181.g2de0

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to