Commit 5d60418e authored by Tejun Heo's avatar Tejun Heo Committed by Greg Kroah-Hartman

sysfs, kernfs: introduce kernfs_setattr()

Introduce kernfs setattr interface - kernfs_setattr().

sysfs_sd_setattr() is renamed to __kernfs_setattr() and
kernfs_setattr() is a simple wrapper around it with sysfs_mutex
locking.  sysfs_chmod_file() is updated to get an explicit ref on
kobj->sd and then invoke kernfs_setattr() so that it doesn't have to
use internal interface.

This patch doesn't introduce any behavior differences.

v2: Dummy implementation for !CONFIG_SYSFS updated to return -ENOSYS.
Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 890ece16
...@@ -922,19 +922,16 @@ int sysfs_chmod_file(struct kobject *kobj, const struct attribute *attr, ...@@ -922,19 +922,16 @@ int sysfs_chmod_file(struct kobject *kobj, const struct attribute *attr,
struct iattr newattrs; struct iattr newattrs;
int rc; int rc;
mutex_lock(&sysfs_mutex); sd = sysfs_get_dirent(kobj->sd, attr->name);
rc = -ENOENT;
sd = sysfs_find_dirent(kobj->sd, attr->name, NULL);
if (!sd) if (!sd)
goto out; return -ENOENT;
newattrs.ia_mode = (mode & S_IALLUGO) | (sd->s_mode & ~S_IALLUGO); newattrs.ia_mode = (mode & S_IALLUGO) | (sd->s_mode & ~S_IALLUGO);
newattrs.ia_valid = ATTR_MODE; newattrs.ia_valid = ATTR_MODE;
rc = sysfs_sd_setattr(sd, &newattrs);
out: rc = kernfs_setattr(sd, &newattrs);
mutex_unlock(&sysfs_mutex);
sysfs_put(sd);
return rc; return rc;
} }
EXPORT_SYMBOL_GPL(sysfs_chmod_file); EXPORT_SYMBOL_GPL(sysfs_chmod_file);
......
...@@ -67,7 +67,7 @@ static struct sysfs_inode_attrs *sysfs_init_inode_attrs(struct sysfs_dirent *sd) ...@@ -67,7 +67,7 @@ static struct sysfs_inode_attrs *sysfs_init_inode_attrs(struct sysfs_dirent *sd)
return attrs; return attrs;
} }
int sysfs_sd_setattr(struct sysfs_dirent *sd, struct iattr *iattr) static int __kernfs_setattr(struct sysfs_dirent *sd, const struct iattr *iattr)
{ {
struct sysfs_inode_attrs *sd_attrs; struct sysfs_inode_attrs *sd_attrs;
struct iattr *iattrs; struct iattr *iattrs;
...@@ -102,6 +102,23 @@ int sysfs_sd_setattr(struct sysfs_dirent *sd, struct iattr *iattr) ...@@ -102,6 +102,23 @@ int sysfs_sd_setattr(struct sysfs_dirent *sd, struct iattr *iattr)
return 0; return 0;
} }
/**
* kernfs_setattr - set iattr on a node
* @sd: target node
* @iattr: iattr to set
*
* Returns 0 on success, -errno on failure.
*/
int kernfs_setattr(struct sysfs_dirent *sd, const struct iattr *iattr)
{
int ret;
mutex_lock(&sysfs_mutex);
ret = __kernfs_setattr(sd, iattr);
mutex_unlock(&sysfs_mutex);
return ret;
}
int sysfs_setattr(struct dentry *dentry, struct iattr *iattr) int sysfs_setattr(struct dentry *dentry, struct iattr *iattr)
{ {
struct inode *inode = dentry->d_inode; struct inode *inode = dentry->d_inode;
...@@ -116,7 +133,7 @@ int sysfs_setattr(struct dentry *dentry, struct iattr *iattr) ...@@ -116,7 +133,7 @@ int sysfs_setattr(struct dentry *dentry, struct iattr *iattr)
if (error) if (error)
goto out; goto out;
error = sysfs_sd_setattr(sd, iattr); error = __kernfs_setattr(sd, iattr);
if (error) if (error)
goto out; goto out;
......
...@@ -207,7 +207,6 @@ static inline void __sysfs_put(struct sysfs_dirent *sd) ...@@ -207,7 +207,6 @@ static inline void __sysfs_put(struct sysfs_dirent *sd)
*/ */
struct inode *sysfs_get_inode(struct super_block *sb, struct sysfs_dirent *sd); struct inode *sysfs_get_inode(struct super_block *sb, struct sysfs_dirent *sd);
void sysfs_evict_inode(struct inode *inode); void sysfs_evict_inode(struct inode *inode);
int sysfs_sd_setattr(struct sysfs_dirent *sd, struct iattr *iattr);
int sysfs_permission(struct inode *inode, int mask); int sysfs_permission(struct inode *inode, int mask);
int sysfs_setattr(struct dentry *dentry, struct iattr *iattr); int sysfs_setattr(struct dentry *dentry, struct iattr *iattr);
int sysfs_getattr(struct vfsmount *mnt, struct dentry *dentry, int sysfs_getattr(struct vfsmount *mnt, struct dentry *dentry,
......
...@@ -10,6 +10,9 @@ ...@@ -10,6 +10,9 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/err.h> #include <linux/err.h>
struct file;
struct iattr;
struct sysfs_dirent; struct sysfs_dirent;
#ifdef CONFIG_SYSFS #ifdef CONFIG_SYSFS
...@@ -22,6 +25,7 @@ int kernfs_remove_by_name_ns(struct sysfs_dirent *parent, const char *name, ...@@ -22,6 +25,7 @@ int kernfs_remove_by_name_ns(struct sysfs_dirent *parent, const char *name,
const void *ns); const void *ns);
int kernfs_rename_ns(struct sysfs_dirent *sd, struct sysfs_dirent *new_parent, int kernfs_rename_ns(struct sysfs_dirent *sd, struct sysfs_dirent *new_parent,
const char *new_name, const void *new_ns); const char *new_name, const void *new_ns);
int kernfs_setattr(struct sysfs_dirent *sd, const struct iattr *iattr);
#else /* CONFIG_SYSFS */ #else /* CONFIG_SYSFS */
...@@ -41,6 +45,10 @@ static inline int kernfs_rename_ns(struct sysfs_dirent *sd, ...@@ -41,6 +45,10 @@ static inline int kernfs_rename_ns(struct sysfs_dirent *sd,
const char *new_name, const void *new_ns) const char *new_name, const void *new_ns)
{ return -ENOSYS; } { return -ENOSYS; }
static inline int kernfs_setattr(struct sysfs_dirent *sd,
const struct iattr *iattr)
{ return -ENOSYS; }
#endif /* CONFIG_SYSFS */ #endif /* CONFIG_SYSFS */
static inline int kernfs_remove_by_name(struct sysfs_dirent *parent, static inline int kernfs_remove_by_name(struct sysfs_dirent *parent,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment