Driver Core: devtmpfs: ignore umask while setting file mode

Signed-off-by: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
Kay Sievers 2009-10-28 19:50:57 +01:00 committed by Greg Kroah-Hartman
parent f38506c49d
commit 0092699643
1 changed files with 16 additions and 10 deletions

View File

@ -156,34 +156,40 @@ int devtmpfs_create_node(struct device *dev)
mode |= S_IFCHR; mode |= S_IFCHR;
curr_cred = override_creds(&init_cred); curr_cred = override_creds(&init_cred);
err = vfs_path_lookup(dev_mnt->mnt_root, dev_mnt, err = vfs_path_lookup(dev_mnt->mnt_root, dev_mnt,
nodename, LOOKUP_PARENT, &nd); nodename, LOOKUP_PARENT, &nd);
if (err == -ENOENT) { if (err == -ENOENT) {
/* create missing parent directories */
create_path(nodename); create_path(nodename);
err = vfs_path_lookup(dev_mnt->mnt_root, dev_mnt, err = vfs_path_lookup(dev_mnt->mnt_root, dev_mnt,
nodename, LOOKUP_PARENT, &nd); nodename, LOOKUP_PARENT, &nd);
if (err)
goto out;
} }
if (err)
goto out;
dentry = lookup_create(&nd, 0); dentry = lookup_create(&nd, 0);
if (!IS_ERR(dentry)) { if (!IS_ERR(dentry)) {
int umask;
umask = sys_umask(0000);
err = vfs_mknod(nd.path.dentry->d_inode, err = vfs_mknod(nd.path.dentry->d_inode,
dentry, mode, dev->devt); dentry, mode, dev->devt);
sys_umask(umask); if (!err) {
/* mark as kernel created inode */ struct iattr newattrs;
if (!err)
/* 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 = &dev_mnt; dentry->d_inode->i_private = &dev_mnt;
}
dput(dentry); dput(dentry);
} else { } else {
err = PTR_ERR(dentry); err = PTR_ERR(dentry);
} }
mutex_unlock(&nd.path.dentry->d_inode->i_mutex);
mutex_unlock(&nd.path.dentry->d_inode->i_mutex);
path_put(&nd.path); path_put(&nd.path);
out: out:
kfree(tmp); kfree(tmp);