sysfs: fix sysfs_chmod_file() such that it updates sd->s_mode too
authorTejun Heo <htejun@gmail.com>
Thu, 20 Sep 2007 07:05:10 +0000 (16:05 +0900)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 12 Oct 2007 21:51:09 +0000 (14:51 -0700)
sysfs_chmod_file() looked and updated only inode of the target file.
Dentry and inode are reclaimable and the update mode data will go away
when the inode is reclaimed.  This patch makes sysfs_chmod_file()
update sd->s_mode too such that the change is permanent.

Signed-off-by: Tejun Heo <htejun@gmail.com>
Acked-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
fs/sysfs/file.c

index ff93c92164b308c8536d6045642b7f5ee5c9e439..9fdf8dae0dcd81fe5fbbd4114c7ed8145d0e7e26 100644 (file)
@@ -521,10 +521,19 @@ int sysfs_chmod_file(struct kobject *kobj, struct attribute *attr, mode_t mode)
        }
 
        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);
  out:
        dput(victim);