diff options
Diffstat (limited to 'drivers/base/devtmpfs.c')
| -rw-r--r-- | drivers/base/devtmpfs.c | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/drivers/base/devtmpfs.c b/drivers/base/devtmpfs.c index fd488ad4263a..a1cb5afe6801 100644 --- a/drivers/base/devtmpfs.c +++ b/drivers/base/devtmpfs.c | |||
| @@ -6,9 +6,10 @@ | |||
| 6 | * During bootup, before any driver core device is registered, | 6 | * During bootup, before any driver core device is registered, |
| 7 | * devtmpfs, a tmpfs-based filesystem is created. Every driver-core | 7 | * devtmpfs, a tmpfs-based filesystem is created. Every driver-core |
| 8 | * device which requests a device node, will add a node in this | 8 | * device which requests a device node, will add a node in this |
| 9 | * filesystem. The node is named after the the name of the device, | 9 | * filesystem. |
| 10 | * or the susbsytem can provide a custom name. All devices are | 10 | * By default, all devices are named after the the name of the |
| 11 | * owned by root and have a mode of 0600. | 11 | * device, owned by root and have a default mode of 0600. Subsystems |
| 12 | * can overwrite the default setting if needed. | ||
| 12 | */ | 13 | */ |
| 13 | 14 | ||
| 14 | #include <linux/kernel.h> | 15 | #include <linux/kernel.h> |
| @@ -20,6 +21,7 @@ | |||
| 20 | #include <linux/fs.h> | 21 | #include <linux/fs.h> |
| 21 | #include <linux/shmem_fs.h> | 22 | #include <linux/shmem_fs.h> |
| 22 | #include <linux/cred.h> | 23 | #include <linux/cred.h> |
| 24 | #include <linux/sched.h> | ||
| 23 | #include <linux/init_task.h> | 25 | #include <linux/init_task.h> |
| 24 | 26 | ||
| 25 | static struct vfsmount *dev_mnt; | 27 | static struct vfsmount *dev_mnt; |
| @@ -134,7 +136,7 @@ int devtmpfs_create_node(struct device *dev) | |||
| 134 | const char *tmp = NULL; | 136 | const char *tmp = NULL; |
| 135 | const char *nodename; | 137 | const char *nodename; |
| 136 | const struct cred *curr_cred; | 138 | const struct cred *curr_cred; |
| 137 | mode_t mode; | 139 | mode_t mode = 0; |
| 138 | struct nameidata nd; | 140 | struct nameidata nd; |
| 139 | struct dentry *dentry; | 141 | struct dentry *dentry; |
| 140 | int err; | 142 | int err; |
| @@ -142,14 +144,16 @@ int devtmpfs_create_node(struct device *dev) | |||
| 142 | if (!dev_mnt) | 144 | if (!dev_mnt) |
| 143 | return 0; | 145 | return 0; |
| 144 | 146 | ||
| 145 | nodename = device_get_nodename(dev, &tmp); | 147 | nodename = device_get_devnode(dev, &mode, &tmp); |
| 146 | if (!nodename) | 148 | if (!nodename) |
| 147 | return -ENOMEM; | 149 | return -ENOMEM; |
| 148 | 150 | ||
| 151 | if (mode == 0) | ||
| 152 | mode = 0600; | ||
| 149 | if (is_blockdev(dev)) | 153 | if (is_blockdev(dev)) |
| 150 | mode = S_IFBLK|0600; | 154 | mode |= S_IFBLK; |
| 151 | else | 155 | else |
| 152 | mode = S_IFCHR|0600; | 156 | mode |= S_IFCHR; |
| 153 | 157 | ||
| 154 | curr_cred = override_creds(&init_cred); | 158 | curr_cred = override_creds(&init_cred); |
| 155 | err = vfs_path_lookup(dev_mnt->mnt_root, dev_mnt, | 159 | err = vfs_path_lookup(dev_mnt->mnt_root, dev_mnt, |
| @@ -165,8 +169,12 @@ int devtmpfs_create_node(struct device *dev) | |||
| 165 | 169 | ||
| 166 | dentry = lookup_create(&nd, 0); | 170 | dentry = lookup_create(&nd, 0); |
| 167 | if (!IS_ERR(dentry)) { | 171 | if (!IS_ERR(dentry)) { |
| 172 | int umask; | ||
| 173 | |||
| 174 | umask = sys_umask(0000); | ||
| 168 | err = vfs_mknod(nd.path.dentry->d_inode, | 175 | err = vfs_mknod(nd.path.dentry->d_inode, |
| 169 | dentry, mode, dev->devt); | 176 | dentry, mode, dev->devt); |
| 177 | sys_umask(umask); | ||
| 170 | /* mark as kernel created inode */ | 178 | /* mark as kernel created inode */ |
| 171 | if (!err) | 179 | if (!err) |
| 172 | dentry->d_inode->i_private = &dev_mnt; | 180 | dentry->d_inode->i_private = &dev_mnt; |
| @@ -271,7 +279,7 @@ int devtmpfs_delete_node(struct device *dev) | |||
| 271 | if (!dev_mnt) | 279 | if (!dev_mnt) |
| 272 | return 0; | 280 | return 0; |
| 273 | 281 | ||
| 274 | nodename = device_get_nodename(dev, &tmp); | 282 | nodename = device_get_devnode(dev, NULL, &tmp); |
| 275 | if (!nodename) | 283 | if (!nodename) |
| 276 | return -ENOMEM; | 284 | return -ENOMEM; |
| 277 | 285 | ||
