Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/fs/autofs4/root.c
15109 views
1
/* -*- c -*- --------------------------------------------------------------- *
2
*
3
* linux/fs/autofs/root.c
4
*
5
* Copyright 1997-1998 Transmeta Corporation -- All Rights Reserved
6
* Copyright 1999-2000 Jeremy Fitzhardinge <[email protected]>
7
* Copyright 2001-2006 Ian Kent <[email protected]>
8
*
9
* This file is part of the Linux kernel and is made available under
10
* the terms of the GNU General Public License, version 2, or at your
11
* option, any later version, incorporated herein by reference.
12
*
13
* ------------------------------------------------------------------------- */
14
15
#include <linux/capability.h>
16
#include <linux/errno.h>
17
#include <linux/stat.h>
18
#include <linux/slab.h>
19
#include <linux/param.h>
20
#include <linux/time.h>
21
#include <linux/compat.h>
22
#include <linux/mutex.h>
23
24
#include "autofs_i.h"
25
26
static int autofs4_dir_symlink(struct inode *,struct dentry *,const char *);
27
static int autofs4_dir_unlink(struct inode *,struct dentry *);
28
static int autofs4_dir_rmdir(struct inode *,struct dentry *);
29
static int autofs4_dir_mkdir(struct inode *,struct dentry *,int);
30
static long autofs4_root_ioctl(struct file *,unsigned int,unsigned long);
31
#ifdef CONFIG_COMPAT
32
static long autofs4_root_compat_ioctl(struct file *,unsigned int,unsigned long);
33
#endif
34
static int autofs4_dir_open(struct inode *inode, struct file *file);
35
static struct dentry *autofs4_lookup(struct inode *,struct dentry *, struct nameidata *);
36
static struct vfsmount *autofs4_d_automount(struct path *);
37
static int autofs4_d_manage(struct dentry *, bool);
38
static void autofs4_dentry_release(struct dentry *);
39
40
const struct file_operations autofs4_root_operations = {
41
.open = dcache_dir_open,
42
.release = dcache_dir_close,
43
.read = generic_read_dir,
44
.readdir = dcache_readdir,
45
.llseek = dcache_dir_lseek,
46
.unlocked_ioctl = autofs4_root_ioctl,
47
#ifdef CONFIG_COMPAT
48
.compat_ioctl = autofs4_root_compat_ioctl,
49
#endif
50
};
51
52
const struct file_operations autofs4_dir_operations = {
53
.open = autofs4_dir_open,
54
.release = dcache_dir_close,
55
.read = generic_read_dir,
56
.readdir = dcache_readdir,
57
.llseek = dcache_dir_lseek,
58
};
59
60
const struct inode_operations autofs4_dir_inode_operations = {
61
.lookup = autofs4_lookup,
62
.unlink = autofs4_dir_unlink,
63
.symlink = autofs4_dir_symlink,
64
.mkdir = autofs4_dir_mkdir,
65
.rmdir = autofs4_dir_rmdir,
66
};
67
68
const struct dentry_operations autofs4_dentry_operations = {
69
.d_automount = autofs4_d_automount,
70
.d_manage = autofs4_d_manage,
71
.d_release = autofs4_dentry_release,
72
};
73
74
static void autofs4_add_active(struct dentry *dentry)
75
{
76
struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb);
77
struct autofs_info *ino = autofs4_dentry_ino(dentry);
78
if (ino) {
79
spin_lock(&sbi->lookup_lock);
80
if (!ino->active_count) {
81
if (list_empty(&ino->active))
82
list_add(&ino->active, &sbi->active_list);
83
}
84
ino->active_count++;
85
spin_unlock(&sbi->lookup_lock);
86
}
87
return;
88
}
89
90
static void autofs4_del_active(struct dentry *dentry)
91
{
92
struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb);
93
struct autofs_info *ino = autofs4_dentry_ino(dentry);
94
if (ino) {
95
spin_lock(&sbi->lookup_lock);
96
ino->active_count--;
97
if (!ino->active_count) {
98
if (!list_empty(&ino->active))
99
list_del_init(&ino->active);
100
}
101
spin_unlock(&sbi->lookup_lock);
102
}
103
return;
104
}
105
106
static int autofs4_dir_open(struct inode *inode, struct file *file)
107
{
108
struct dentry *dentry = file->f_path.dentry;
109
struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb);
110
111
DPRINTK("file=%p dentry=%p %.*s",
112
file, dentry, dentry->d_name.len, dentry->d_name.name);
113
114
if (autofs4_oz_mode(sbi))
115
goto out;
116
117
/*
118
* An empty directory in an autofs file system is always a
119
* mount point. The daemon must have failed to mount this
120
* during lookup so it doesn't exist. This can happen, for
121
* example, if user space returns an incorrect status for a
122
* mount request. Otherwise we're doing a readdir on the
123
* autofs file system so just let the libfs routines handle
124
* it.
125
*/
126
spin_lock(&sbi->lookup_lock);
127
spin_lock(&dentry->d_lock);
128
if (!d_mountpoint(dentry) && list_empty(&dentry->d_subdirs)) {
129
spin_unlock(&dentry->d_lock);
130
spin_unlock(&sbi->lookup_lock);
131
return -ENOENT;
132
}
133
spin_unlock(&dentry->d_lock);
134
spin_unlock(&sbi->lookup_lock);
135
136
out:
137
return dcache_dir_open(inode, file);
138
}
139
140
static void autofs4_dentry_release(struct dentry *de)
141
{
142
struct autofs_info *ino = autofs4_dentry_ino(de);
143
struct autofs_sb_info *sbi = autofs4_sbi(de->d_sb);
144
145
DPRINTK("releasing %p", de);
146
147
if (!ino)
148
return;
149
150
if (sbi) {
151
spin_lock(&sbi->lookup_lock);
152
if (!list_empty(&ino->active))
153
list_del(&ino->active);
154
if (!list_empty(&ino->expiring))
155
list_del(&ino->expiring);
156
spin_unlock(&sbi->lookup_lock);
157
}
158
159
autofs4_free_ino(ino);
160
}
161
162
static struct dentry *autofs4_lookup_active(struct dentry *dentry)
163
{
164
struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb);
165
struct dentry *parent = dentry->d_parent;
166
struct qstr *name = &dentry->d_name;
167
unsigned int len = name->len;
168
unsigned int hash = name->hash;
169
const unsigned char *str = name->name;
170
struct list_head *p, *head;
171
172
spin_lock(&sbi->lookup_lock);
173
head = &sbi->active_list;
174
list_for_each(p, head) {
175
struct autofs_info *ino;
176
struct dentry *active;
177
struct qstr *qstr;
178
179
ino = list_entry(p, struct autofs_info, active);
180
active = ino->dentry;
181
182
spin_lock(&active->d_lock);
183
184
/* Already gone? */
185
if (active->d_count == 0)
186
goto next;
187
188
qstr = &active->d_name;
189
190
if (active->d_name.hash != hash)
191
goto next;
192
if (active->d_parent != parent)
193
goto next;
194
195
if (qstr->len != len)
196
goto next;
197
if (memcmp(qstr->name, str, len))
198
goto next;
199
200
if (d_unhashed(active)) {
201
dget_dlock(active);
202
spin_unlock(&active->d_lock);
203
spin_unlock(&sbi->lookup_lock);
204
return active;
205
}
206
next:
207
spin_unlock(&active->d_lock);
208
}
209
spin_unlock(&sbi->lookup_lock);
210
211
return NULL;
212
}
213
214
static struct dentry *autofs4_lookup_expiring(struct dentry *dentry)
215
{
216
struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb);
217
struct dentry *parent = dentry->d_parent;
218
struct qstr *name = &dentry->d_name;
219
unsigned int len = name->len;
220
unsigned int hash = name->hash;
221
const unsigned char *str = name->name;
222
struct list_head *p, *head;
223
224
spin_lock(&sbi->lookup_lock);
225
head = &sbi->expiring_list;
226
list_for_each(p, head) {
227
struct autofs_info *ino;
228
struct dentry *expiring;
229
struct qstr *qstr;
230
231
ino = list_entry(p, struct autofs_info, expiring);
232
expiring = ino->dentry;
233
234
spin_lock(&expiring->d_lock);
235
236
/* Bad luck, we've already been dentry_iput */
237
if (!expiring->d_inode)
238
goto next;
239
240
qstr = &expiring->d_name;
241
242
if (expiring->d_name.hash != hash)
243
goto next;
244
if (expiring->d_parent != parent)
245
goto next;
246
247
if (qstr->len != len)
248
goto next;
249
if (memcmp(qstr->name, str, len))
250
goto next;
251
252
if (d_unhashed(expiring)) {
253
dget_dlock(expiring);
254
spin_unlock(&expiring->d_lock);
255
spin_unlock(&sbi->lookup_lock);
256
return expiring;
257
}
258
next:
259
spin_unlock(&expiring->d_lock);
260
}
261
spin_unlock(&sbi->lookup_lock);
262
263
return NULL;
264
}
265
266
static int autofs4_mount_wait(struct dentry *dentry)
267
{
268
struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb);
269
struct autofs_info *ino = autofs4_dentry_ino(dentry);
270
int status = 0;
271
272
if (ino->flags & AUTOFS_INF_PENDING) {
273
DPRINTK("waiting for mount name=%.*s",
274
dentry->d_name.len, dentry->d_name.name);
275
status = autofs4_wait(sbi, dentry, NFY_MOUNT);
276
DPRINTK("mount wait done status=%d", status);
277
}
278
ino->last_used = jiffies;
279
return status;
280
}
281
282
static int do_expire_wait(struct dentry *dentry)
283
{
284
struct dentry *expiring;
285
286
expiring = autofs4_lookup_expiring(dentry);
287
if (!expiring)
288
return autofs4_expire_wait(dentry);
289
else {
290
/*
291
* If we are racing with expire the request might not
292
* be quite complete, but the directory has been removed
293
* so it must have been successful, just wait for it.
294
*/
295
autofs4_expire_wait(expiring);
296
autofs4_del_expiring(expiring);
297
dput(expiring);
298
}
299
return 0;
300
}
301
302
static struct dentry *autofs4_mountpoint_changed(struct path *path)
303
{
304
struct dentry *dentry = path->dentry;
305
struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb);
306
307
/*
308
* If this is an indirect mount the dentry could have gone away
309
* as a result of an expire and a new one created.
310
*/
311
if (autofs_type_indirect(sbi->type) && d_unhashed(dentry)) {
312
struct dentry *parent = dentry->d_parent;
313
struct autofs_info *ino;
314
struct dentry *new = d_lookup(parent, &dentry->d_name);
315
if (!new)
316
return NULL;
317
ino = autofs4_dentry_ino(new);
318
ino->last_used = jiffies;
319
dput(path->dentry);
320
path->dentry = new;
321
}
322
return path->dentry;
323
}
324
325
static struct vfsmount *autofs4_d_automount(struct path *path)
326
{
327
struct dentry *dentry = path->dentry;
328
struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb);
329
struct autofs_info *ino = autofs4_dentry_ino(dentry);
330
int status;
331
332
DPRINTK("dentry=%p %.*s",
333
dentry, dentry->d_name.len, dentry->d_name.name);
334
335
/* The daemon never triggers a mount. */
336
if (autofs4_oz_mode(sbi))
337
return NULL;
338
339
/*
340
* If an expire request is pending everyone must wait.
341
* If the expire fails we're still mounted so continue
342
* the follow and return. A return of -EAGAIN (which only
343
* happens with indirect mounts) means the expire completed
344
* and the directory was removed, so just go ahead and try
345
* the mount.
346
*/
347
status = do_expire_wait(dentry);
348
if (status && status != -EAGAIN)
349
return NULL;
350
351
/* Callback to the daemon to perform the mount or wait */
352
spin_lock(&sbi->fs_lock);
353
if (ino->flags & AUTOFS_INF_PENDING) {
354
spin_unlock(&sbi->fs_lock);
355
status = autofs4_mount_wait(dentry);
356
if (status)
357
return ERR_PTR(status);
358
spin_lock(&sbi->fs_lock);
359
goto done;
360
}
361
362
/*
363
* If the dentry is a symlink it's equivalent to a directory
364
* having d_mountpoint() true, so there's no need to call back
365
* to the daemon.
366
*/
367
if (dentry->d_inode && S_ISLNK(dentry->d_inode->i_mode))
368
goto done;
369
if (!d_mountpoint(dentry)) {
370
/*
371
* It's possible that user space hasn't removed directories
372
* after umounting a rootless multi-mount, although it
373
* should. For v5 have_submounts() is sufficient to handle
374
* this because the leaves of the directory tree under the
375
* mount never trigger mounts themselves (they have an autofs
376
* trigger mount mounted on them). But v4 pseudo direct mounts
377
* do need the leaves to to trigger mounts. In this case we
378
* have no choice but to use the list_empty() check and
379
* require user space behave.
380
*/
381
if (sbi->version > 4) {
382
if (have_submounts(dentry))
383
goto done;
384
} else {
385
spin_lock(&dentry->d_lock);
386
if (!list_empty(&dentry->d_subdirs)) {
387
spin_unlock(&dentry->d_lock);
388
goto done;
389
}
390
spin_unlock(&dentry->d_lock);
391
}
392
ino->flags |= AUTOFS_INF_PENDING;
393
spin_unlock(&sbi->fs_lock);
394
status = autofs4_mount_wait(dentry);
395
if (status)
396
return ERR_PTR(status);
397
spin_lock(&sbi->fs_lock);
398
ino->flags &= ~AUTOFS_INF_PENDING;
399
}
400
done:
401
if (!(ino->flags & AUTOFS_INF_EXPIRING)) {
402
/*
403
* Any needed mounting has been completed and the path
404
* updated so clear DCACHE_NEED_AUTOMOUNT so we don't
405
* call ->d_automount() on rootless multi-mounts since
406
* it can lead to an incorrect ELOOP error return.
407
*
408
* Only clear DMANAGED_AUTOMOUNT for rootless multi-mounts and
409
* symlinks as in all other cases the dentry will be covered by
410
* an actual mount so ->d_automount() won't be called during
411
* the follow.
412
*/
413
spin_lock(&dentry->d_lock);
414
if ((!d_mountpoint(dentry) &&
415
!list_empty(&dentry->d_subdirs)) ||
416
(dentry->d_inode && S_ISLNK(dentry->d_inode->i_mode)))
417
__managed_dentry_clear_automount(dentry);
418
spin_unlock(&dentry->d_lock);
419
}
420
spin_unlock(&sbi->fs_lock);
421
422
/* Mount succeeded, check if we ended up with a new dentry */
423
dentry = autofs4_mountpoint_changed(path);
424
if (!dentry)
425
return ERR_PTR(-ENOENT);
426
427
return NULL;
428
}
429
430
int autofs4_d_manage(struct dentry *dentry, bool rcu_walk)
431
{
432
struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb);
433
434
DPRINTK("dentry=%p %.*s",
435
dentry, dentry->d_name.len, dentry->d_name.name);
436
437
/* The daemon never waits. */
438
if (autofs4_oz_mode(sbi)) {
439
if (rcu_walk)
440
return 0;
441
if (!d_mountpoint(dentry))
442
return -EISDIR;
443
return 0;
444
}
445
446
/* We need to sleep, so we need pathwalk to be in ref-mode */
447
if (rcu_walk)
448
return -ECHILD;
449
450
/* Wait for pending expires */
451
do_expire_wait(dentry);
452
453
/*
454
* This dentry may be under construction so wait on mount
455
* completion.
456
*/
457
return autofs4_mount_wait(dentry);
458
}
459
460
/* Lookups in the root directory */
461
static struct dentry *autofs4_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd)
462
{
463
struct autofs_sb_info *sbi;
464
struct autofs_info *ino;
465
struct dentry *active;
466
467
DPRINTK("name = %.*s", dentry->d_name.len, dentry->d_name.name);
468
469
/* File name too long to exist */
470
if (dentry->d_name.len > NAME_MAX)
471
return ERR_PTR(-ENAMETOOLONG);
472
473
sbi = autofs4_sbi(dir->i_sb);
474
475
DPRINTK("pid = %u, pgrp = %u, catatonic = %d, oz_mode = %d",
476
current->pid, task_pgrp_nr(current), sbi->catatonic,
477
autofs4_oz_mode(sbi));
478
479
active = autofs4_lookup_active(dentry);
480
if (active) {
481
return active;
482
} else {
483
/*
484
* A dentry that is not within the root can never trigger a
485
* mount operation, unless the directory already exists, so we
486
* can return fail immediately. The daemon however does need
487
* to create directories within the file system.
488
*/
489
if (!autofs4_oz_mode(sbi) && !IS_ROOT(dentry->d_parent))
490
return ERR_PTR(-ENOENT);
491
492
/* Mark entries in the root as mount triggers */
493
if (autofs_type_indirect(sbi->type) && IS_ROOT(dentry->d_parent))
494
__managed_dentry_set_managed(dentry);
495
496
ino = autofs4_new_ino(sbi);
497
if (!ino)
498
return ERR_PTR(-ENOMEM);
499
500
dentry->d_fsdata = ino;
501
ino->dentry = dentry;
502
503
autofs4_add_active(dentry);
504
505
d_instantiate(dentry, NULL);
506
}
507
return NULL;
508
}
509
510
static int autofs4_dir_symlink(struct inode *dir,
511
struct dentry *dentry,
512
const char *symname)
513
{
514
struct autofs_sb_info *sbi = autofs4_sbi(dir->i_sb);
515
struct autofs_info *ino = autofs4_dentry_ino(dentry);
516
struct autofs_info *p_ino;
517
struct inode *inode;
518
size_t size = strlen(symname);
519
char *cp;
520
521
DPRINTK("%s <- %.*s", symname,
522
dentry->d_name.len, dentry->d_name.name);
523
524
if (!autofs4_oz_mode(sbi))
525
return -EACCES;
526
527
BUG_ON(!ino);
528
529
autofs4_clean_ino(ino);
530
531
autofs4_del_active(dentry);
532
533
cp = kmalloc(size + 1, GFP_KERNEL);
534
if (!cp)
535
return -ENOMEM;
536
537
strcpy(cp, symname);
538
539
inode = autofs4_get_inode(dir->i_sb, S_IFLNK | 0555);
540
if (!inode) {
541
kfree(cp);
542
if (!dentry->d_fsdata)
543
kfree(ino);
544
return -ENOMEM;
545
}
546
inode->i_private = cp;
547
inode->i_size = size;
548
d_add(dentry, inode);
549
550
dget(dentry);
551
atomic_inc(&ino->count);
552
p_ino = autofs4_dentry_ino(dentry->d_parent);
553
if (p_ino && dentry->d_parent != dentry)
554
atomic_inc(&p_ino->count);
555
556
dir->i_mtime = CURRENT_TIME;
557
558
return 0;
559
}
560
561
/*
562
* NOTE!
563
*
564
* Normal filesystems would do a "d_delete()" to tell the VFS dcache
565
* that the file no longer exists. However, doing that means that the
566
* VFS layer can turn the dentry into a negative dentry. We don't want
567
* this, because the unlink is probably the result of an expire.
568
* We simply d_drop it and add it to a expiring list in the super block,
569
* which allows the dentry lookup to check for an incomplete expire.
570
*
571
* If a process is blocked on the dentry waiting for the expire to finish,
572
* it will invalidate the dentry and try to mount with a new one.
573
*
574
* Also see autofs4_dir_rmdir()..
575
*/
576
static int autofs4_dir_unlink(struct inode *dir, struct dentry *dentry)
577
{
578
struct autofs_sb_info *sbi = autofs4_sbi(dir->i_sb);
579
struct autofs_info *ino = autofs4_dentry_ino(dentry);
580
struct autofs_info *p_ino;
581
582
/* This allows root to remove symlinks */
583
if (!autofs4_oz_mode(sbi) && !capable(CAP_SYS_ADMIN))
584
return -EACCES;
585
586
if (atomic_dec_and_test(&ino->count)) {
587
p_ino = autofs4_dentry_ino(dentry->d_parent);
588
if (p_ino && dentry->d_parent != dentry)
589
atomic_dec(&p_ino->count);
590
}
591
dput(ino->dentry);
592
593
dentry->d_inode->i_size = 0;
594
clear_nlink(dentry->d_inode);
595
596
dir->i_mtime = CURRENT_TIME;
597
598
spin_lock(&sbi->lookup_lock);
599
__autofs4_add_expiring(dentry);
600
spin_lock(&dentry->d_lock);
601
__d_drop(dentry);
602
spin_unlock(&dentry->d_lock);
603
spin_unlock(&sbi->lookup_lock);
604
605
return 0;
606
}
607
608
/*
609
* Version 4 of autofs provides a pseudo direct mount implementation
610
* that relies on directories at the leaves of a directory tree under
611
* an indirect mount to trigger mounts. To allow for this we need to
612
* set the DMANAGED_AUTOMOUNT and DMANAGED_TRANSIT flags on the leaves
613
* of the directory tree. There is no need to clear the automount flag
614
* following a mount or restore it after an expire because these mounts
615
* are always covered. However, it is necessary to ensure that these
616
* flags are clear on non-empty directories to avoid unnecessary calls
617
* during path walks.
618
*/
619
static void autofs_set_leaf_automount_flags(struct dentry *dentry)
620
{
621
struct dentry *parent;
622
623
/* root and dentrys in the root are already handled */
624
if (IS_ROOT(dentry->d_parent))
625
return;
626
627
managed_dentry_set_managed(dentry);
628
629
parent = dentry->d_parent;
630
/* only consider parents below dentrys in the root */
631
if (IS_ROOT(parent->d_parent))
632
return;
633
managed_dentry_clear_managed(parent);
634
return;
635
}
636
637
static void autofs_clear_leaf_automount_flags(struct dentry *dentry)
638
{
639
struct list_head *d_child;
640
struct dentry *parent;
641
642
/* flags for dentrys in the root are handled elsewhere */
643
if (IS_ROOT(dentry->d_parent))
644
return;
645
646
managed_dentry_clear_managed(dentry);
647
648
parent = dentry->d_parent;
649
/* only consider parents below dentrys in the root */
650
if (IS_ROOT(parent->d_parent))
651
return;
652
d_child = &dentry->d_u.d_child;
653
/* Set parent managed if it's becoming empty */
654
if (d_child->next == &parent->d_subdirs &&
655
d_child->prev == &parent->d_subdirs)
656
managed_dentry_set_managed(parent);
657
return;
658
}
659
660
static int autofs4_dir_rmdir(struct inode *dir, struct dentry *dentry)
661
{
662
struct autofs_sb_info *sbi = autofs4_sbi(dir->i_sb);
663
struct autofs_info *ino = autofs4_dentry_ino(dentry);
664
struct autofs_info *p_ino;
665
666
DPRINTK("dentry %p, removing %.*s",
667
dentry, dentry->d_name.len, dentry->d_name.name);
668
669
if (!autofs4_oz_mode(sbi))
670
return -EACCES;
671
672
spin_lock(&sbi->lookup_lock);
673
spin_lock(&dentry->d_lock);
674
if (!list_empty(&dentry->d_subdirs)) {
675
spin_unlock(&dentry->d_lock);
676
spin_unlock(&sbi->lookup_lock);
677
return -ENOTEMPTY;
678
}
679
__autofs4_add_expiring(dentry);
680
__d_drop(dentry);
681
spin_unlock(&dentry->d_lock);
682
spin_unlock(&sbi->lookup_lock);
683
684
if (sbi->version < 5)
685
autofs_clear_leaf_automount_flags(dentry);
686
687
if (atomic_dec_and_test(&ino->count)) {
688
p_ino = autofs4_dentry_ino(dentry->d_parent);
689
if (p_ino && dentry->d_parent != dentry)
690
atomic_dec(&p_ino->count);
691
}
692
dput(ino->dentry);
693
dentry->d_inode->i_size = 0;
694
clear_nlink(dentry->d_inode);
695
696
if (dir->i_nlink)
697
drop_nlink(dir);
698
699
return 0;
700
}
701
702
static int autofs4_dir_mkdir(struct inode *dir, struct dentry *dentry, int mode)
703
{
704
struct autofs_sb_info *sbi = autofs4_sbi(dir->i_sb);
705
struct autofs_info *ino = autofs4_dentry_ino(dentry);
706
struct autofs_info *p_ino;
707
struct inode *inode;
708
709
if (!autofs4_oz_mode(sbi))
710
return -EACCES;
711
712
DPRINTK("dentry %p, creating %.*s",
713
dentry, dentry->d_name.len, dentry->d_name.name);
714
715
BUG_ON(!ino);
716
717
autofs4_clean_ino(ino);
718
719
autofs4_del_active(dentry);
720
721
inode = autofs4_get_inode(dir->i_sb, S_IFDIR | 0555);
722
if (!inode)
723
return -ENOMEM;
724
d_add(dentry, inode);
725
726
if (sbi->version < 5)
727
autofs_set_leaf_automount_flags(dentry);
728
729
dget(dentry);
730
atomic_inc(&ino->count);
731
p_ino = autofs4_dentry_ino(dentry->d_parent);
732
if (p_ino && dentry->d_parent != dentry)
733
atomic_inc(&p_ino->count);
734
inc_nlink(dir);
735
dir->i_mtime = CURRENT_TIME;
736
737
return 0;
738
}
739
740
/* Get/set timeout ioctl() operation */
741
#ifdef CONFIG_COMPAT
742
static inline int autofs4_compat_get_set_timeout(struct autofs_sb_info *sbi,
743
compat_ulong_t __user *p)
744
{
745
int rv;
746
unsigned long ntimeout;
747
748
if ((rv = get_user(ntimeout, p)) ||
749
(rv = put_user(sbi->exp_timeout/HZ, p)))
750
return rv;
751
752
if (ntimeout > UINT_MAX/HZ)
753
sbi->exp_timeout = 0;
754
else
755
sbi->exp_timeout = ntimeout * HZ;
756
757
return 0;
758
}
759
#endif
760
761
static inline int autofs4_get_set_timeout(struct autofs_sb_info *sbi,
762
unsigned long __user *p)
763
{
764
int rv;
765
unsigned long ntimeout;
766
767
if ((rv = get_user(ntimeout, p)) ||
768
(rv = put_user(sbi->exp_timeout/HZ, p)))
769
return rv;
770
771
if (ntimeout > ULONG_MAX/HZ)
772
sbi->exp_timeout = 0;
773
else
774
sbi->exp_timeout = ntimeout * HZ;
775
776
return 0;
777
}
778
779
/* Return protocol version */
780
static inline int autofs4_get_protover(struct autofs_sb_info *sbi, int __user *p)
781
{
782
return put_user(sbi->version, p);
783
}
784
785
/* Return protocol sub version */
786
static inline int autofs4_get_protosubver(struct autofs_sb_info *sbi, int __user *p)
787
{
788
return put_user(sbi->sub_version, p);
789
}
790
791
/*
792
* Tells the daemon whether it can umount the autofs mount.
793
*/
794
static inline int autofs4_ask_umount(struct vfsmount *mnt, int __user *p)
795
{
796
int status = 0;
797
798
if (may_umount(mnt))
799
status = 1;
800
801
DPRINTK("returning %d", status);
802
803
status = put_user(status, p);
804
805
return status;
806
}
807
808
/* Identify autofs4_dentries - this is so we can tell if there's
809
an extra dentry refcount or not. We only hold a refcount on the
810
dentry if its non-negative (ie, d_inode != NULL)
811
*/
812
int is_autofs4_dentry(struct dentry *dentry)
813
{
814
return dentry && dentry->d_inode &&
815
dentry->d_op == &autofs4_dentry_operations &&
816
dentry->d_fsdata != NULL;
817
}
818
819
/*
820
* ioctl()'s on the root directory is the chief method for the daemon to
821
* generate kernel reactions
822
*/
823
static int autofs4_root_ioctl_unlocked(struct inode *inode, struct file *filp,
824
unsigned int cmd, unsigned long arg)
825
{
826
struct autofs_sb_info *sbi = autofs4_sbi(inode->i_sb);
827
void __user *p = (void __user *)arg;
828
829
DPRINTK("cmd = 0x%08x, arg = 0x%08lx, sbi = %p, pgrp = %u",
830
cmd,arg,sbi,task_pgrp_nr(current));
831
832
if (_IOC_TYPE(cmd) != _IOC_TYPE(AUTOFS_IOC_FIRST) ||
833
_IOC_NR(cmd) - _IOC_NR(AUTOFS_IOC_FIRST) >= AUTOFS_IOC_COUNT)
834
return -ENOTTY;
835
836
if (!autofs4_oz_mode(sbi) && !capable(CAP_SYS_ADMIN))
837
return -EPERM;
838
839
switch(cmd) {
840
case AUTOFS_IOC_READY: /* Wait queue: go ahead and retry */
841
return autofs4_wait_release(sbi,(autofs_wqt_t)arg,0);
842
case AUTOFS_IOC_FAIL: /* Wait queue: fail with ENOENT */
843
return autofs4_wait_release(sbi,(autofs_wqt_t)arg,-ENOENT);
844
case AUTOFS_IOC_CATATONIC: /* Enter catatonic mode (daemon shutdown) */
845
autofs4_catatonic_mode(sbi);
846
return 0;
847
case AUTOFS_IOC_PROTOVER: /* Get protocol version */
848
return autofs4_get_protover(sbi, p);
849
case AUTOFS_IOC_PROTOSUBVER: /* Get protocol sub version */
850
return autofs4_get_protosubver(sbi, p);
851
case AUTOFS_IOC_SETTIMEOUT:
852
return autofs4_get_set_timeout(sbi, p);
853
#ifdef CONFIG_COMPAT
854
case AUTOFS_IOC_SETTIMEOUT32:
855
return autofs4_compat_get_set_timeout(sbi, p);
856
#endif
857
858
case AUTOFS_IOC_ASKUMOUNT:
859
return autofs4_ask_umount(filp->f_path.mnt, p);
860
861
/* return a single thing to expire */
862
case AUTOFS_IOC_EXPIRE:
863
return autofs4_expire_run(inode->i_sb,filp->f_path.mnt,sbi, p);
864
/* same as above, but can send multiple expires through pipe */
865
case AUTOFS_IOC_EXPIRE_MULTI:
866
return autofs4_expire_multi(inode->i_sb,filp->f_path.mnt,sbi, p);
867
868
default:
869
return -ENOSYS;
870
}
871
}
872
873
static long autofs4_root_ioctl(struct file *filp,
874
unsigned int cmd, unsigned long arg)
875
{
876
struct inode *inode = filp->f_dentry->d_inode;
877
return autofs4_root_ioctl_unlocked(inode, filp, cmd, arg);
878
}
879
880
#ifdef CONFIG_COMPAT
881
static long autofs4_root_compat_ioctl(struct file *filp,
882
unsigned int cmd, unsigned long arg)
883
{
884
struct inode *inode = filp->f_path.dentry->d_inode;
885
int ret;
886
887
if (cmd == AUTOFS_IOC_READY || cmd == AUTOFS_IOC_FAIL)
888
ret = autofs4_root_ioctl_unlocked(inode, filp, cmd, arg);
889
else
890
ret = autofs4_root_ioctl_unlocked(inode, filp, cmd,
891
(unsigned long)compat_ptr(arg));
892
893
return ret;
894
}
895
#endif
896
897