fs: port vfs_*() helpers to struct mnt_idmap
[linux-block.git] / drivers / base / devtmpfs.c
CommitLineData
b2441318 1// SPDX-License-Identifier: GPL-2.0
2b2af54a
KS
2/*
3 * devtmpfs - kernel-maintained tmpfs-based /dev
4 *
5 * Copyright (C) 2009, Kay Sievers <kay.sievers@vrfy.org>
6 *
7 * During bootup, before any driver core device is registered,
8 * devtmpfs, a tmpfs-based filesystem is created. Every driver-core
9 * device which requests a device node, will add a node in this
e454cea2 10 * filesystem.
02fbe5e6
PK
11 * By default, all devices are named after the name of the device,
12 * owned by root and have a default mode of 0600. Subsystems can
13 * overwrite the default setting if needed.
2b2af54a
KS
14 */
15
16#include <linux/kernel.h>
17#include <linux/syscalls.h>
18#include <linux/mount.h>
19#include <linux/device.h>
322cbb50 20#include <linux/blkdev.h>
2b2af54a
KS
21#include <linux/namei.h>
22#include <linux/fs.h>
23#include <linux/shmem_fs.h>
da5e4ef7 24#include <linux/ramfs.h>
e454cea2 25#include <linux/sched.h>
5a0e3ad6 26#include <linux/slab.h>
2780f1ff 27#include <linux/kthread.h>
c60166f0 28#include <linux/init_syscalls.h>
e262e32d 29#include <uapi/linux/mount.h>
c3a30420 30#include "base.h"
2b2af54a 31
28f0c335
KC
32#ifdef CONFIG_DEVTMPFS_SAFE
33#define DEVTMPFS_MFLAGS (MS_SILENT | MS_NOEXEC | MS_NOSUID)
34#else
35#define DEVTMPFS_MFLAGS (MS_SILENT)
36#endif
37
2780f1ff 38static struct task_struct *thread;
2b2af54a 39
fad1db8a 40static int __initdata mount_dev = IS_ENABLED(CONFIG_DEVTMPFS_MOUNT);
2b2af54a 41
2780f1ff
AV
42static DEFINE_SPINLOCK(req_lock);
43
44static struct req {
45 struct req *next;
46 struct completion done;
47 int err;
48 const char *name;
2c9ede55 49 umode_t mode; /* 0 => delete */
4e4098a3
GKH
50 kuid_t uid;
51 kgid_t gid;
2780f1ff
AV
52 struct device *dev;
53} *requests;
ed413ae6 54
2b2af54a
KS
55static int __init mount_param(char *str)
56{
fc14f2fe 57 mount_dev = simple_strtoul(str, NULL, 0);
2b2af54a
KS
58 return 1;
59}
60__setup("devtmpfs.mount=", mount_param);
61
d401727e
AV
62static struct vfsmount *mnt;
63
64static struct dentry *public_dev_mount(struct file_system_type *fs_type, int flags,
65 const char *dev_name, void *data)
66{
67 struct super_block *s = mnt->mnt_sb;
a6097180
N
68 int err;
69
d401727e
AV
70 atomic_inc(&s->s_active);
71 down_write(&s->s_umount);
a6097180
N
72 err = reconfigure_single(s, flags, data);
73 if (err < 0) {
74 deactivate_locked_super(s);
75 return ERR_PTR(err);
76 }
d401727e
AV
77 return dget(s->s_root);
78}
79
f3235626
DH
80static struct file_system_type internal_fs_type = {
81 .name = "devtmpfs",
da5e4ef7 82#ifdef CONFIG_TMPFS
f3235626 83 .init_fs_context = shmem_init_fs_context,
da5e4ef7 84#else
f3235626 85 .init_fs_context = ramfs_init_fs_context,
da5e4ef7 86#endif
2b2af54a
KS
87 .kill_sb = kill_litter_super,
88};
89
d401727e
AV
90static struct file_system_type dev_fs_type = {
91 .name = "devtmpfs",
92 .mount = public_dev_mount,
93};
94
2b2af54a
KS
95#ifdef CONFIG_BLOCK
96static inline int is_blockdev(struct device *dev)
97{
98 return dev->class == &block_class;
99}
100#else
101static inline int is_blockdev(struct device *dev) { return 0; }
102#endif
103
72a9cc95
RV
104static int devtmpfs_submit_req(struct req *req, const char *tmp)
105{
106 init_completion(&req->done);
107
108 spin_lock(&req_lock);
109 req->next = requests;
110 requests = req;
111 spin_unlock(&req_lock);
112
113 wake_up_process(thread);
114 wait_for_completion(&req->done);
115
116 kfree(tmp);
117
118 return req->err;
119}
120
2780f1ff
AV
121int devtmpfs_create_node(struct device *dev)
122{
123 const char *tmp = NULL;
124 struct req req;
125
126 if (!thread)
127 return 0;
128
129 req.mode = 0;
4e4098a3
GKH
130 req.uid = GLOBAL_ROOT_UID;
131 req.gid = GLOBAL_ROOT_GID;
3c2670e6 132 req.name = device_get_devnode(dev, &req.mode, &req.uid, &req.gid, &tmp);
2780f1ff
AV
133 if (!req.name)
134 return -ENOMEM;
135
136 if (req.mode == 0)
137 req.mode = 0600;
138 if (is_blockdev(dev))
139 req.mode |= S_IFBLK;
140 else
141 req.mode |= S_IFCHR;
142
143 req.dev = dev;
144
72a9cc95 145 return devtmpfs_submit_req(&req, tmp);
2780f1ff
AV
146}
147
148int devtmpfs_delete_node(struct device *dev)
149{
150 const char *tmp = NULL;
151 struct req req;
152
153 if (!thread)
154 return 0;
155
3c2670e6 156 req.name = device_get_devnode(dev, NULL, NULL, NULL, &tmp);
2780f1ff
AV
157 if (!req.name)
158 return -ENOMEM;
159
160 req.mode = 0;
161 req.dev = dev;
162
72a9cc95 163 return devtmpfs_submit_req(&req, tmp);
2780f1ff
AV
164}
165
fbd48a69 166static int dev_mkdir(const char *name, umode_t mode)
2b2af54a 167{
2b2af54a 168 struct dentry *dentry;
69753a0f 169 struct path path;
2b2af54a
KS
170 int err;
171
1ac12b4b 172 dentry = kern_path_create(AT_FDCWD, name, &path, LOOKUP_DIRECTORY);
69753a0f
AV
173 if (IS_ERR(dentry))
174 return PTR_ERR(dentry);
175
abf08576 176 err = vfs_mkdir(&nop_mnt_idmap, d_inode(path.dentry), dentry, mode);
69753a0f
AV
177 if (!err)
178 /* mark as kernel-created inode */
75c3cfa8 179 d_inode(dentry)->i_private = &thread;
921a1650 180 done_path_create(&path, dentry);
2b2af54a
KS
181 return err;
182}
183
184static int create_path(const char *nodepath)
185{
5da4e689
AV
186 char *path;
187 char *s;
9d108d25 188 int err = 0;
2b2af54a 189
5da4e689
AV
190 /* parent directories do not exist, create them */
191 path = kstrdup(nodepath, GFP_KERNEL);
192 if (!path)
193 return -ENOMEM;
194
195 s = path;
196 for (;;) {
197 s = strchr(s, '/');
198 if (!s)
199 break;
200 s[0] = '\0';
201 err = dev_mkdir(path, 0755);
202 if (err && err != -EEXIST)
203 break;
204 s[0] = '/';
205 s++;
2b2af54a 206 }
5da4e689 207 kfree(path);
2b2af54a
KS
208 return err;
209}
210
4e4098a3
GKH
211static int handle_create(const char *nodename, umode_t mode, kuid_t uid,
212 kgid_t gid, struct device *dev)
2b2af54a 213{
2b2af54a 214 struct dentry *dentry;
69753a0f 215 struct path path;
2b2af54a
KS
216 int err;
217
69753a0f
AV
218 dentry = kern_path_create(AT_FDCWD, nodename, &path, 0);
219 if (dentry == ERR_PTR(-ENOENT)) {
2b2af54a 220 create_path(nodename);
69753a0f 221 dentry = kern_path_create(AT_FDCWD, nodename, &path, 0);
2b2af54a 222 }
69753a0f
AV
223 if (IS_ERR(dentry))
224 return PTR_ERR(dentry);
225
abf08576 226 err = vfs_mknod(&nop_mnt_idmap, d_inode(path.dentry), dentry, mode,
6521f891 227 dev->devt);
69753a0f
AV
228 if (!err) {
229 struct iattr newattrs;
230
69753a0f 231 newattrs.ia_mode = mode;
4e4098a3
GKH
232 newattrs.ia_uid = uid;
233 newattrs.ia_gid = gid;
3c2670e6 234 newattrs.ia_valid = ATTR_MODE|ATTR_UID|ATTR_GID;
5955102c 235 inode_lock(d_inode(dentry));
abf08576 236 notify_change(&nop_mnt_idmap, dentry, &newattrs, NULL);
5955102c 237 inode_unlock(d_inode(dentry));
69753a0f
AV
238
239 /* mark as kernel-created inode */
75c3cfa8 240 d_inode(dentry)->i_private = &thread;
2b2af54a 241 }
921a1650 242 done_path_create(&path, dentry);
2b2af54a
KS
243 return err;
244}
245
246static int dev_rmdir(const char *name)
247{
79714f72 248 struct path parent;
2b2af54a
KS
249 struct dentry *dentry;
250 int err;
251
79714f72
AV
252 dentry = kern_path_locked(name, &parent);
253 if (IS_ERR(dentry))
254 return PTR_ERR(dentry);
75c3cfa8
DH
255 if (d_really_is_positive(dentry)) {
256 if (d_inode(dentry)->i_private == &thread)
abf08576 257 err = vfs_rmdir(&nop_mnt_idmap, d_inode(parent.dentry),
6521f891 258 dentry);
79714f72
AV
259 else
260 err = -EPERM;
2b2af54a 261 } else {
79714f72 262 err = -ENOENT;
2b2af54a 263 }
79714f72 264 dput(dentry);
5955102c 265 inode_unlock(d_inode(parent.dentry));
79714f72 266 path_put(&parent);
2b2af54a
KS
267 return err;
268}
269
270static int delete_path(const char *nodepath)
271{
be6b1dfe 272 char *path;
2b2af54a
KS
273 int err = 0;
274
275 path = kstrdup(nodepath, GFP_KERNEL);
276 if (!path)
277 return -ENOMEM;
278
ed413ae6 279 for (;;) {
2b2af54a
KS
280 char *base;
281
282 base = strrchr(path, '/');
283 if (!base)
284 break;
285 base[0] = '\0';
286 err = dev_rmdir(path);
287 if (err)
288 break;
289 }
290
291 kfree(path);
292 return err;
293}
294
295static int dev_mynode(struct device *dev, struct inode *inode, struct kstat *stat)
296{
297 /* did we create it */
2780f1ff 298 if (inode->i_private != &thread)
2b2af54a
KS
299 return 0;
300
301 /* does the dev_t match */
302 if (is_blockdev(dev)) {
303 if (!S_ISBLK(stat->mode))
304 return 0;
305 } else {
306 if (!S_ISCHR(stat->mode))
307 return 0;
308 }
309 if (stat->rdev != dev->devt)
310 return 0;
311
312 /* ours */
313 return 1;
314}
315
2780f1ff 316static int handle_remove(const char *nodename, struct device *dev)
2b2af54a 317{
79714f72 318 struct path parent;
2b2af54a 319 struct dentry *dentry;
fbde7c61 320 int deleted = 0;
2b2af54a
KS
321 int err;
322
79714f72
AV
323 dentry = kern_path_locked(nodename, &parent);
324 if (IS_ERR(dentry))
325 return PTR_ERR(dentry);
326
75c3cfa8 327 if (d_really_is_positive(dentry)) {
79714f72 328 struct kstat stat;
3dadecce 329 struct path p = {.mnt = parent.mnt, .dentry = dentry};
a528d35e
DH
330 err = vfs_getattr(&p, &stat, STATX_TYPE | STATX_MODE,
331 AT_STATX_SYNC_AS_STAT);
75c3cfa8 332 if (!err && dev_mynode(dev, d_inode(dentry), &stat)) {
79714f72
AV
333 struct iattr newattrs;
334 /*
335 * before unlinking this node, reset permissions
336 * of possible references like hardlinks
337 */
91fa2cca
EB
338 newattrs.ia_uid = GLOBAL_ROOT_UID;
339 newattrs.ia_gid = GLOBAL_ROOT_GID;
79714f72
AV
340 newattrs.ia_mode = stat.mode & ~0777;
341 newattrs.ia_valid =
342 ATTR_UID|ATTR_GID|ATTR_MODE;
5955102c 343 inode_lock(d_inode(dentry));
abf08576 344 notify_change(&nop_mnt_idmap, dentry, &newattrs, NULL);
5955102c 345 inode_unlock(d_inode(dentry));
abf08576 346 err = vfs_unlink(&nop_mnt_idmap, d_inode(parent.dentry),
6521f891 347 dentry, NULL);
79714f72
AV
348 if (!err || err == -ENOENT)
349 deleted = 1;
2b2af54a 350 }
2b2af54a 351 } else {
79714f72 352 err = -ENOENT;
2b2af54a 353 }
79714f72 354 dput(dentry);
5955102c 355 inode_unlock(d_inode(parent.dentry));
2b2af54a 356
79714f72 357 path_put(&parent);
2b2af54a
KS
358 if (deleted && strchr(nodename, '/'))
359 delete_path(nodename);
2b2af54a
KS
360 return err;
361}
362
363/*
364 * If configured, or requested by the commandline, devtmpfs will be
365 * auto-mounted after the kernel mounted the root filesystem.
366 */
fad1db8a 367int __init devtmpfs_mount(void)
2b2af54a 368{
2b2af54a
KS
369 int err;
370
fc14f2fe 371 if (!mount_dev)
2b2af54a
KS
372 return 0;
373
2780f1ff 374 if (!thread)
2b2af54a
KS
375 return 0;
376
28f0c335 377 err = init_mount("devtmpfs", "dev", "devtmpfs", DEVTMPFS_MFLAGS, NULL);
2b2af54a
KS
378 if (err)
379 printk(KERN_INFO "devtmpfs: error mounting %i\n", err);
380 else
381 printk(KERN_INFO "devtmpfs: mounted\n");
2b2af54a
KS
382 return err;
383}
384
01085e24 385static __initdata DECLARE_COMPLETION(setup_done);
2780f1ff 386
4e4098a3 387static int handle(const char *name, umode_t mode, kuid_t uid, kgid_t gid,
3c2670e6 388 struct device *dev)
2780f1ff
AV
389{
390 if (mode)
3c2670e6 391 return handle_create(name, mode, uid, gid, dev);
2780f1ff
AV
392 else
393 return handle_remove(name, dev);
394}
395
bcbacc49
CH
396static void __noreturn devtmpfs_work_loop(void)
397{
398 while (1) {
399 spin_lock(&req_lock);
400 while (requests) {
401 struct req *req = requests;
402 requests = NULL;
403 spin_unlock(&req_lock);
404 while (req) {
405 struct req *next = req->next;
406 req->err = handle(req->name, req->mode,
407 req->uid, req->gid, req->dev);
408 complete(&req->done);
409 req = next;
410 }
411 spin_lock(&req_lock);
412 }
413 __set_current_state(TASK_INTERRUPTIBLE);
414 spin_unlock(&req_lock);
415 schedule();
416 }
417}
418
01085e24 419static noinline int __init devtmpfs_setup(void *p)
2780f1ff 420{
c9d6b287
RV
421 int err;
422
423 err = ksys_unshare(CLONE_NEWNS);
424 if (err)
2780f1ff 425 goto out;
28f0c335 426 err = init_mount("devtmpfs", "/", "devtmpfs", DEVTMPFS_MFLAGS, NULL);
c9d6b287 427 if (err)
2780f1ff 428 goto out;
db63f1e3 429 init_chdir("/.."); /* will traverse into overmounted root */
4b7ca501 430 init_chroot(".");
0ff0e95e
RV
431out:
432 *(int *)p = err;
0ff0e95e
RV
433 return err;
434}
435
bcbacc49
CH
436/*
437 * The __ref is because devtmpfs_setup needs to be __init for the routines it
438 * calls. That call is done while devtmpfs_init, which is marked __init,
439 * synchronously waits for it to complete.
440 */
441static int __ref devtmpfsd(void *p)
0ff0e95e
RV
442{
443 int err = devtmpfs_setup(p);
444
38f087de 445 complete(&setup_done);
0ff0e95e
RV
446 if (err)
447 return err;
bcbacc49 448 devtmpfs_work_loop();
2780f1ff 449 return 0;
2780f1ff
AV
450}
451
2b2af54a
KS
452/*
453 * Create devtmpfs instance, driver-core devices will add their device
454 * nodes here.
455 */
456int __init devtmpfs_init(void)
457{
d401727e
AV
458 char opts[] = "mode=0755";
459 int err;
460
461 mnt = vfs_kern_mount(&internal_fs_type, 0, "devtmpfs", opts);
462 if (IS_ERR(mnt)) {
463 printk(KERN_ERR "devtmpfs: unable to create devtmpfs %ld\n",
464 PTR_ERR(mnt));
465 return PTR_ERR(mnt);
466 }
467 err = register_filesystem(&dev_fs_type);
2b2af54a
KS
468 if (err) {
469 printk(KERN_ERR "devtmpfs: unable to register devtmpfs "
470 "type %i\n", err);
471 return err;
472 }
473
2780f1ff
AV
474 thread = kthread_run(devtmpfsd, &err, "kdevtmpfs");
475 if (!IS_ERR(thread)) {
476 wait_for_completion(&setup_done);
477 } else {
478 err = PTR_ERR(thread);
479 thread = NULL;
480 }
481
482 if (err) {
2b2af54a
KS
483 printk(KERN_ERR "devtmpfs: unable to create devtmpfs %i\n", err);
484 unregister_filesystem(&dev_fs_type);
31c779f2 485 thread = NULL;
2b2af54a
KS
486 return err;
487 }
2b2af54a
KS
488
489 printk(KERN_INFO "devtmpfs: initialized\n");
490 return 0;
491}