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