kernfs: add @mode to kernfs_create_dir[_ns]()

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>
This commit is contained in:
Tejun Heo 2013-12-11 16:02:55 -05:00 committed by Greg Kroah-Hartman
parent c637b8acbe
commit bb8b9d095c
4 changed files with 16 additions and 12 deletions

View File

@ -639,22 +639,23 @@ void kernfs_destroy_root(struct kernfs_root *root)
* kernfs_create_dir_ns - create a directory * kernfs_create_dir_ns - create a directory
* @parent: parent in which to create a new directory * @parent: parent in which to create a new directory
* @name: name of the new directory * @name: name of the new directory
* @mode: mode of the new directory
* @priv: opaque data associated with the new directory * @priv: opaque data associated with the new directory
* @ns: optional namespace tag of the directory * @ns: optional namespace tag of the directory
* *
* Returns the created node on success, ERR_PTR() value on failure. * Returns the created node on success, ERR_PTR() value on failure.
*/ */
struct kernfs_node *kernfs_create_dir_ns(struct kernfs_node *parent, struct kernfs_node *kernfs_create_dir_ns(struct kernfs_node *parent,
const char *name, void *priv, const char *name, umode_t mode,
const void *ns) void *priv, const void *ns)
{ {
umode_t mode = S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO;
struct kernfs_addrm_cxt acxt; struct kernfs_addrm_cxt acxt;
struct kernfs_node *kn; struct kernfs_node *kn;
int rc; int rc;
/* allocate */ /* 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) if (!kn)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);

View File

@ -73,7 +73,8 @@ int sysfs_create_dir_ns(struct kobject *kobj, const void *ns)
if (!parent) if (!parent)
return -ENOENT; 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 (IS_ERR(kn)) {
if (PTR_ERR(kn) == -EEXIST) if (PTR_ERR(kn) == -EEXIST)
sysfs_warn_dup(parent, kobject_name(kobj)); sysfs_warn_dup(parent, kobject_name(kobj));

View File

@ -100,7 +100,8 @@ static int internal_create_group(struct kobject *kobj, int update,
return -EINVAL; return -EINVAL;
} }
if (grp->name) { 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 (IS_ERR(kn)) {
if (PTR_ERR(kn) == -EEXIST) if (PTR_ERR(kn) == -EEXIST)
sysfs_warn_dup(kobj->sd, grp->name); sysfs_warn_dup(kobj->sd, grp->name);

View File

@ -210,8 +210,8 @@ struct kernfs_root *kernfs_create_root(void *priv);
void kernfs_destroy_root(struct kernfs_root *root); void kernfs_destroy_root(struct kernfs_root *root);
struct kernfs_node *kernfs_create_dir_ns(struct kernfs_node *parent, struct kernfs_node *kernfs_create_dir_ns(struct kernfs_node *parent,
const char *name, void *priv, const char *name, umode_t mode,
const void *ns); void *priv, const void *ns);
struct kernfs_node *kernfs_create_file_ns_key(struct kernfs_node *parent, struct kernfs_node *kernfs_create_file_ns_key(struct kernfs_node *parent,
const char *name, const char *name,
umode_t mode, loff_t size, 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 void kernfs_destroy_root(struct kernfs_root *root) { }
static inline struct kernfs_node * static inline struct kernfs_node *
kernfs_create_dir_ns(struct kernfs_node *parent, const char *name, void *priv, kernfs_create_dir_ns(struct kernfs_node *parent, const char *name,
const void *ns) umode_t mode, void *priv, const void *ns)
{ return ERR_PTR(-ENOSYS); } { return ERR_PTR(-ENOSYS); }
static inline struct kernfs_node * 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 * 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 * static inline struct kernfs_node *