Driver Core: devtmpfs: ignore umask while setting file mode
Kay Sievers [Wed, 28 Oct 2009 18:50:57 +0000 (19:50 +0100)]
Signed-off-by: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

drivers/base/devtmpfs.c

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