kernfs: add @mode to kernfs_create_dir[_ns]()
authorTejun Heo <tj@kernel.org>
Wed, 11 Dec 2013 21:02:55 +0000 (16:02 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 17 Dec 2013 16:59:15 +0000 (08:59 -0800)
sysfs assumed 0755 for all newly created directories and kernfs
inherited it.  This assumption is unnecessarily restrictive and
inconsistent with kernfs_create_file[_ns]().  This patch adds @mode
parameter to kernfs_create_dir[_ns]() and update uses in sysfs
accordingly.  Among others, this will be useful for implementations of
the planned ->mkdir() method.

This patch doesn't introduce any behavior differences.

Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/kernfs/dir.c
fs/sysfs/dir.c
fs/sysfs/group.c
include/linux/kernfs.h

index 6520066c49eaaf511624a1ec4b245ceecdc2c0ed..e55bb02f15a473bdea2a29b9eb7fc3dbf972e054 100644 (file)
@@ -639,22 +639,23 @@ void kernfs_destroy_root(struct kernfs_root *root)
  * kernfs_create_dir_ns - create a directory
  * @parent: parent in which to create a new directory
  * @name: name of the new directory
+ * @mode: mode of the new directory
  * @priv: opaque data associated with the new directory
  * @ns: optional namespace tag of the directory
  *
  * Returns the created node on success, ERR_PTR() value on failure.
  */
 struct kernfs_node *kernfs_create_dir_ns(struct kernfs_node *parent,
-                                        const char *name, void *priv,
-                                        const void *ns)
+                                        const char *name, umode_t mode,
+                                        void *priv, const void *ns)
 {
-       umode_t mode = S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO;
        struct kernfs_addrm_cxt acxt;
        struct kernfs_node *kn;
        int rc;
 
        /* allocate */
-       kn = kernfs_new_node(kernfs_root(parent), name, mode, KERNFS_DIR);
+       kn = kernfs_new_node(kernfs_root(parent), name, mode | S_IFDIR,
+                            KERNFS_DIR);
        if (!kn)
                return ERR_PTR(-ENOMEM);
 
index aa007401bfc9058f785f82573de3fd483d83a421..ee0d761c3179ca06efcdebe619eb107214079ba7 100644 (file)
@@ -73,7 +73,8 @@ int sysfs_create_dir_ns(struct kobject *kobj, const void *ns)
        if (!parent)
                return -ENOENT;
 
-       kn = kernfs_create_dir_ns(parent, kobject_name(kobj), kobj, ns);
+       kn = kernfs_create_dir_ns(parent, kobject_name(kobj),
+                                 S_IRWXU | S_IRUGO | S_IXUGO, kobj, ns);
        if (IS_ERR(kn)) {
                if (PTR_ERR(kn) == -EEXIST)
                        sysfs_warn_dup(parent, kobject_name(kobj));
index 4d00d3996477397c964b3a723b934ae55b29c4ea..6b579387c67a143d14550ff8f272bb370348c649 100644 (file)
@@ -100,7 +100,8 @@ static int internal_create_group(struct kobject *kobj, int update,
                return -EINVAL;
        }
        if (grp->name) {
-               kn = kernfs_create_dir(kobj->sd, grp->name, kobj);
+               kn = kernfs_create_dir(kobj->sd, grp->name,
+                                      S_IRWXU | S_IRUGO | S_IXUGO, kobj);
                if (IS_ERR(kn)) {
                        if (PTR_ERR(kn) == -EEXIST)
                                sysfs_warn_dup(kobj->sd, grp->name);
index e9c4e3a0396068f6d062732fa57b4303868b6f8b..0ca2aedfd31bd089c71abc6206f007bb0dfe9fa9 100644 (file)
@@ -210,8 +210,8 @@ struct kernfs_root *kernfs_create_root(void *priv);
 void kernfs_destroy_root(struct kernfs_root *root);
 
 struct kernfs_node *kernfs_create_dir_ns(struct kernfs_node *parent,
-                                        const char *name, void *priv,
-                                        const void *ns);
+                                        const char *name, umode_t mode,
+                                        void *priv, const void *ns);
 struct kernfs_node *kernfs_create_file_ns_key(struct kernfs_node *parent,
                                              const char *name,
                                              umode_t mode, loff_t size,
@@ -260,8 +260,8 @@ static inline struct kernfs_root *kernfs_create_root(void *priv)
 static inline void kernfs_destroy_root(struct kernfs_root *root) { }
 
 static inline struct kernfs_node *
-kernfs_create_dir_ns(struct kernfs_node *parent, const char *name, void *priv,
-                    const void *ns)
+kernfs_create_dir_ns(struct kernfs_node *parent, const char *name,
+                    umode_t mode, void *priv, const void *ns)
 { return ERR_PTR(-ENOSYS); }
 
 static inline struct kernfs_node *
@@ -314,9 +314,10 @@ kernfs_find_and_get(struct kernfs_node *kn, const char *name)
 }
 
 static inline struct kernfs_node *
-kernfs_create_dir(struct kernfs_node *parent, const char *name, void *priv)
+kernfs_create_dir(struct kernfs_node *parent, const char *name, umode_t mode,
+                 void *priv)
 {
-       return kernfs_create_dir_ns(parent, name, priv, NULL);
+       return kernfs_create_dir_ns(parent, name, mode, priv, NULL);
 }
 
 static inline struct kernfs_node *