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:
parent
c637b8acbe
commit
bb8b9d095c
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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));
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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 *
|
||||||
|
|
Loading…
Reference in New Issue