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: Tejun Heo <tj@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
890ece160c
commit
5d60418e54
@@ -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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
*/
|
*/
|
||||||
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 @@
|
|||||||
#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,
|
|||||||
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,
|
|||||||
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,
|
||||||
|
Reference in New Issue
Block a user