sysfs, kernfs: introduce kernfs_setattr()
authorTejun Heo <tj@kernel.org>
Sat, 23 Nov 2013 22:21:52 +0000 (17:21 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 27 Nov 2013 21:57:57 +0000 (13:57 -0800)
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>
fs/sysfs/file.c
fs/sysfs/inode.c
fs/sysfs/sysfs.h
include/linux/kernfs.h

index 5664410136babb819f6cf041d80e8f43505cbfb8..564abd201afb75fa28f818cc5903c3d454f3a3bc 100644 (file)
@@ -922,19 +922,16 @@ int sysfs_chmod_file(struct kobject *kobj, const struct attribute *attr,
        struct iattr newattrs;
        int rc;
 
-       mutex_lock(&sysfs_mutex);
-
-       rc = -ENOENT;
-       sd = sysfs_find_dirent(kobj->sd, attr->name, NULL);
+       sd = sysfs_get_dirent(kobj->sd, attr->name);
        if (!sd)
-               goto out;
+               return -ENOENT;
 
        newattrs.ia_mode = (mode & S_IALLUGO) | (sd->s_mode & ~S_IALLUGO);
        newattrs.ia_valid = ATTR_MODE;
-       rc = sysfs_sd_setattr(sd, &newattrs);
 
- out:
-       mutex_unlock(&sysfs_mutex);
+       rc = kernfs_setattr(sd, &newattrs);
+
+       sysfs_put(sd);
        return rc;
 }
 EXPORT_SYMBOL_GPL(sysfs_chmod_file);
index 1750f790af3b9a3714580c73705acc3cb21c613b..5f7e2afb3457ef684837d715e7c44d5ad4f5b33d 100644 (file)
@@ -67,7 +67,7 @@ static struct sysfs_inode_attrs *sysfs_init_inode_attrs(struct sysfs_dirent *sd)
        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 iattr *iattrs;
@@ -102,6 +102,23 @@ int sysfs_sd_setattr(struct sysfs_dirent *sd, struct iattr *iattr)
        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)
 {
        struct inode *inode = dentry->d_inode;
@@ -116,7 +133,7 @@ int sysfs_setattr(struct dentry *dentry, struct iattr *iattr)
        if (error)
                goto out;
 
-       error = sysfs_sd_setattr(sd, iattr);
+       error = __kernfs_setattr(sd, iattr);
        if (error)
                goto out;
 
index 8b3fc210b90db829c874ec606d678195b293988f..2abccfdd932e811c90071ec7b897d228a01eab5d 100644 (file)
@@ -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);
 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_setattr(struct dentry *dentry, struct iattr *iattr);
 int sysfs_getattr(struct vfsmount *mnt, struct dentry *dentry,
index 803d9600cf723d59a42aa374b5a4d738383de968..8cb673875715e205ca0e55a0a612ae49b5a72f4a 100644 (file)
@@ -10,6 +10,9 @@
 #include <linux/kernel.h>
 #include <linux/err.h>
 
+struct file;
+struct iattr;
+
 struct sysfs_dirent;
 
 #ifdef CONFIG_SYSFS
@@ -22,6 +25,7 @@ int kernfs_remove_by_name_ns(struct sysfs_dirent *parent, const char *name,
                             const void *ns);
 int kernfs_rename_ns(struct sysfs_dirent *sd, struct sysfs_dirent *new_parent,
                     const char *new_name, const void *new_ns);
+int kernfs_setattr(struct sysfs_dirent *sd, const struct iattr *iattr);
 
 #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)
 { return -ENOSYS; }
 
+static inline int kernfs_setattr(struct sysfs_dirent *sd,
+                                const struct iattr *iattr)
+{ return -ENOSYS; }
+
 #endif /* CONFIG_SYSFS */
 
 static inline int kernfs_remove_by_name(struct sysfs_dirent *parent,