Teach sysfs_chmod_file how to handle multiple sysfs superblocks.

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

diff --git a/fs/sysfs/file.c b/fs/sysfs/file.c
index 8c7bba0..ade6140 100644
--- a/fs/sysfs/file.c
+++ b/fs/sysfs/file.c
@@ -558,7 +558,8 @@ 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 super_block *sb;
+       struct dentry *victim;
        struct inode * inode;
        struct iattr newattrs;
        int rc;
@@ -569,31 +570,35 @@ 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;
-       }
-
-       inode = victim->d_inode;
-
-       mutex_lock(&inode->i_mutex);
+       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;
+               }
 
-       newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
-       newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
-       rc = notify_change(victim, &newattrs);
+               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);
 
-       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;
 }
-- 
1.5.3.rc6.17.g1911

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

Reply via email to