sysfs: sysfs_chmod_file handle multiple superblocks

Teach sysfs_chmod_file how to handle multiple sysfs
superblocks.

Signed-off-by: Eric W. Biederman <[EMAIL PROTECTED]>
Signed-off-by: Benjamin Thery <[EMAIL PROTECTED]>
---
 fs/sysfs/file.c |   54 ++++++++++++++++++++++++++++++------------------------
 1 file changed, 30 insertions(+), 24 deletions(-)

Index: linux-mm/fs/sysfs/file.c
===================================================================
--- linux-mm.orig/fs/sysfs/file.c
+++ linux-mm/fs/sysfs/file.c
@@ -573,7 +573,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;
@@ -584,31 +585,36 @@ 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;
 }

-- 
_______________________________________________
Containers mailing list
[EMAIL PROTECTED]
https://lists.linux-foundation.org/mailman/listinfo/containers

_______________________________________________
Devel mailing list
Devel@openvz.org
https://openvz.org/mailman/listinfo/devel

Reply via email to