summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorTejun Heo2007-09-20 09:05:10 +0200
committerGreg Kroah-Hartman2007-10-12 23:51:09 +0200
commitf88123eaf953f13a0c597dde54745d28f81236de (patch)
treed737f3d4a79055d9d6c8ab5df0c564ea6a89ec8a /fs
parentsysfs: fix comments of sysfs_add/remove_one() (diff)
downloadkernel-qcow2-linux-f88123eaf953f13a0c597dde54745d28f81236de.tar.gz
kernel-qcow2-linux-f88123eaf953f13a0c597dde54745d28f81236de.tar.xz
kernel-qcow2-linux-f88123eaf953f13a0c597dde54745d28f81236de.zip
sysfs: fix sysfs_chmod_file() such that it updates sd->s_mode too
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>
Diffstat (limited to 'fs')
-rw-r--r--fs/sysfs/file.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/fs/sysfs/file.c b/fs/sysfs/file.c
index ff93c92164b3..9fdf8dae0dcd 100644
--- a/fs/sysfs/file.c
+++ b/fs/sysfs/file.c
@@ -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);