Skip to content

Commit

Permalink
switch devtmpfs to kern_path_create()
Browse files Browse the repository at this point in the history
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
  • Loading branch information
Al Viro committed Jul 20, 2011
1 parent 2780f1f commit 69753a0
Showing 1 changed file with 36 additions and 47 deletions.
83 changes: 36 additions & 47 deletions drivers/base/devtmpfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -144,27 +144,21 @@ int devtmpfs_delete_node(struct device *dev)

static int dev_mkdir(const char *name, mode_t mode)
{
struct nameidata nd;
struct dentry *dentry;
struct path path;
int err;

err = kern_path_parent(name, &nd);
if (err)
return err;

dentry = lookup_create(&nd, 1);
if (!IS_ERR(dentry)) {
err = vfs_mkdir(nd.path.dentry->d_inode, dentry, mode);
if (!err)
/* mark as kernel-created inode */
dentry->d_inode->i_private = &thread;
dput(dentry);
} else {
err = PTR_ERR(dentry);
}

mutex_unlock(&nd.path.dentry->d_inode->i_mutex);
path_put(&nd.path);
dentry = kern_path_create(AT_FDCWD, name, &path, 1);
if (IS_ERR(dentry))
return PTR_ERR(dentry);

err = vfs_mkdir(path.dentry->d_inode, dentry, mode);
if (!err)
/* mark as kernel-created inode */
dentry->d_inode->i_private = &thread;
dput(dentry);
mutex_unlock(&path.dentry->d_inode->i_mutex);
path_put(&path);
return err;
}

Expand Down Expand Up @@ -203,42 +197,37 @@ static int create_path(const char *nodepath)

static int handle_create(const char *nodename, mode_t mode, struct device *dev)
{
struct nameidata nd;
struct dentry *dentry;
struct path path;
int err;

err = kern_path_parent(nodename, &nd);
if (err == -ENOENT) {
dentry = kern_path_create(AT_FDCWD, nodename, &path, 0);
if (dentry == ERR_PTR(-ENOENT)) {
create_path(nodename);
err = kern_path_parent(nodename, &nd);
dentry = kern_path_create(AT_FDCWD, nodename, &path, 0);
}
if (err)
return err;

dentry = lookup_create(&nd, 0);
if (!IS_ERR(dentry)) {
err = vfs_mknod(nd.path.dentry->d_inode,
dentry, mode, dev->devt);
if (!err) {
struct iattr newattrs;

/* fixup possibly umasked mode */
newattrs.ia_mode = mode;
newattrs.ia_valid = ATTR_MODE;
mutex_lock(&dentry->d_inode->i_mutex);
notify_change(dentry, &newattrs);
mutex_unlock(&dentry->d_inode->i_mutex);

/* mark as kernel-created inode */
dentry->d_inode->i_private = &thread;
}
dput(dentry);
} else {
err = PTR_ERR(dentry);
if (IS_ERR(dentry))
return PTR_ERR(dentry);

err = vfs_mknod(path.dentry->d_inode,
dentry, mode, dev->devt);
if (!err) {
struct iattr newattrs;

/* fixup possibly umasked mode */
newattrs.ia_mode = mode;
newattrs.ia_valid = ATTR_MODE;
mutex_lock(&dentry->d_inode->i_mutex);
notify_change(dentry, &newattrs);
mutex_unlock(&dentry->d_inode->i_mutex);

/* mark as kernel-created inode */
dentry->d_inode->i_private = &thread;
}
dput(dentry);

mutex_unlock(&nd.path.dentry->d_inode->i_mutex);
path_put(&nd.path);
mutex_unlock(&path.dentry->d_inode->i_mutex);
path_put(&path);
return err;
}

Expand Down

0 comments on commit 69753a0

Please sign in to comment.