From 6adb35e643193e4efdab01da6352b2fb5204f600 Mon Sep 17 00:00:00 2001 From: Kay Sievers Date: Mon, 18 Apr 2005 21:57:32 -0700 Subject: [PATCH] --- yaml --- r: 306 b: refs/heads/master c: 31e5abe9a6dab1ed3a5c30352bdb001353146318 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/fs/sysfs/file.c | 35 +++++++++++++++++++++++++++++++++++ trunk/include/linux/sysfs.h | 7 +++++++ 3 files changed, 43 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 6e4a3fbc3fa7..31689c49f820 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 6897089c5f7989603ccb9c696050470ba1dbd262 +refs/heads/master: 31e5abe9a6dab1ed3a5c30352bdb001353146318 diff --git a/trunk/fs/sysfs/file.c b/trunk/fs/sysfs/file.c index 352f966a1174..da25aeb0e062 100644 --- a/trunk/fs/sysfs/file.c +++ b/trunk/fs/sysfs/file.c @@ -427,6 +427,41 @@ int sysfs_update_file(struct kobject * kobj, const struct attribute * attr) } +/** + * sysfs_chmod_file - update the modified mode value on an object attribute. + * @kobj: object we're acting for. + * @attr: attribute descriptor. + * @mode: file permissions. + * + */ +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; + int res = -ENOENT; + + down(&dir->d_inode->i_sem); + victim = sysfs_get_dentry(dir, attr->name); + 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; + } + } + up(&dir->d_inode->i_sem); + + return res; +} +EXPORT_SYMBOL_GPL(sysfs_chmod_file); + + /** * sysfs_remove_file - remove an object attribute. * @kobj: object we're acting for. diff --git a/trunk/include/linux/sysfs.h b/trunk/include/linux/sysfs.h index 6f502ff7902a..38b58b30814a 100644 --- a/trunk/include/linux/sysfs.h +++ b/trunk/include/linux/sysfs.h @@ -99,6 +99,9 @@ sysfs_create_file(struct kobject *, const struct attribute *); extern int sysfs_update_file(struct kobject *, const struct attribute *); +extern int +sysfs_chmod_file(struct kobject *kobj, struct attribute *attr, mode_t mode); + extern void sysfs_remove_file(struct kobject *, const struct attribute *); @@ -140,6 +143,10 @@ static inline int sysfs_update_file(struct kobject * k, const struct attribute * { return 0; } +static inline int sysfs_chmod_file(struct kobject *kobj, struct attribute *attr, mode_t mode) +{ + return 0; +} static inline void sysfs_remove_file(struct kobject * k, const struct attribute * a) {