summaryrefslogtreecommitdiff
path: root/fs/sysfs/file.c
diff options
context:
space:
mode:
authorJeff Garzik <jgarzik@pobox.com>2005-08-17 00:51:31 -0400
committerJeff Garzik <jgarzik@pobox.com>2005-08-17 00:51:31 -0400
commita2e30e529a48ef4e106e405f91cf4ae525bb01c4 (patch)
tree2def96ef17c0672c30f1a10287552978bf1d0b1c /fs/sysfs/file.c
parentedb3366703224d5d8df573ae698ccd6b488dc743 (diff)
parent2ad56496627630ebc99f06af5f81ca23e17e014e (diff)
Merge /spare/repo/linux-2.6/
Diffstat (limited to 'fs/sysfs/file.c')
-rw-r--r--fs/sysfs/file.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/fs/sysfs/file.c b/fs/sysfs/file.c
index 335288b9be0f..4013d7905e84 100644
--- a/fs/sysfs/file.c
+++ b/fs/sysfs/file.c
@@ -437,8 +437,8 @@ int sysfs_chmod_file(struct kobject *kobj, struct attribute *attr, mode_t mode)
{
struct dentry *dir = kobj->dentry;
struct dentry *victim;
- struct sysfs_dirent *sd;
- umode_t umode = (mode & S_IALLUGO) | S_IFREG;
+ struct inode * inode;
+ struct iattr newattrs;
int res = -ENOENT;
down(&dir->d_inode->i_sem);
@@ -446,13 +446,15 @@ int sysfs_chmod_file(struct kobject *kobj, struct attribute *attr, mode_t mode)
if (!IS_ERR(victim)) {
if (victim->d_inode &&
(victim->d_parent->d_inode == dir->d_inode)) {
- sd = victim->d_fsdata;
- attr->mode = mode;
- sd->s_mode = umode;
- victim->d_inode->i_mode = umode;
- dput(victim);
- res = 0;
+ inode = victim->d_inode;
+ down(&inode->i_sem);
+ newattrs.ia_mode = (mode & S_IALLUGO) |
+ (inode->i_mode & ~S_IALLUGO);
+ newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
+ res = notify_change(victim, &newattrs);
+ up(&inode->i_sem);
}
+ dput(victim);
}
up(&dir->d_inode->i_sem);