blob: 62c1229a4d3174369f14f60cb6c28e53b923feb7 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/* -*- c -*- --------------------------------------------------------------- *
2 *
3 * linux/fs/autofs/root.c
4 *
5 * Copyright 1997-1998 Transmeta Corporation -- All Rights Reserved
6 * Copyright 1999-2000 Jeremy Fitzhardinge <jeremy@goop.org>
Ian Kent34ca9592006-03-27 01:14:54 -08007 * Copyright 2001-2006 Ian Kent <raven@themaw.net>
Linus Torvalds1da177e2005-04-16 15:20:36 -07008 *
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
Randy Dunlap16f7e0f2006-01-11 12:17:46 -080015#include <linux/capability.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070016#include <linux/errno.h>
17#include <linux/stat.h>
Tejun Heo5a0e3ad2010-03-24 17:04:11 +090018#include <linux/slab.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070019#include <linux/param.h>
20#include <linux/time.h>
Arnd Bergmannc9243f52010-07-04 00:15:07 +020021#include <linux/compat.h>
Arnd Bergmann00e300e2010-09-14 23:00:34 +020022#include <linux/mutex.h>
Arnd Bergmannc9243f52010-07-04 00:15:07 +020023
Linus Torvalds1da177e2005-04-16 15:20:36 -070024#include "autofs_i.h"
25
Nick Pigginb5c84bf2011-01-07 17:49:38 +110026DEFINE_SPINLOCK(autofs4_lock);
27
Linus Torvalds1da177e2005-04-16 15:20:36 -070028static int autofs4_dir_symlink(struct inode *,struct dentry *,const char *);
29static int autofs4_dir_unlink(struct inode *,struct dentry *);
30static int autofs4_dir_rmdir(struct inode *,struct dentry *);
31static int autofs4_dir_mkdir(struct inode *,struct dentry *,int);
Frederic Weisbecker3663df72010-05-19 15:08:17 +020032static long autofs4_root_ioctl(struct file *,unsigned int,unsigned long);
Felipe Contreras5a44a732010-09-24 15:22:23 +020033#ifdef CONFIG_COMPAT
Arnd Bergmannc9243f52010-07-04 00:15:07 +020034static long autofs4_root_compat_ioctl(struct file *,unsigned int,unsigned long);
Felipe Contreras5a44a732010-09-24 15:22:23 +020035#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -070036static int autofs4_dir_open(struct inode *inode, struct file *file);
Linus Torvalds1da177e2005-04-16 15:20:36 -070037static struct dentry *autofs4_lookup(struct inode *,struct dentry *, struct nameidata *);
Ian Kent71e469d2011-01-14 18:46:19 +000038static struct vfsmount *autofs4_d_automount(struct path *);
39static int autofs4_d_manage(struct dentry *, bool);
Linus Torvalds1da177e2005-04-16 15:20:36 -070040
Arjan van de Ven4b6f5d22006-03-28 01:56:42 -080041const struct file_operations autofs4_root_operations = {
Linus Torvalds1da177e2005-04-16 15:20:36 -070042 .open = dcache_dir_open,
43 .release = dcache_dir_close,
44 .read = generic_read_dir,
Ian Kentaa55ddf2008-07-23 21:30:29 -070045 .readdir = dcache_readdir,
Al Viro59af1582008-08-24 07:24:41 -040046 .llseek = dcache_dir_lseek,
Frederic Weisbecker3663df72010-05-19 15:08:17 +020047 .unlocked_ioctl = autofs4_root_ioctl,
Arnd Bergmannc9243f52010-07-04 00:15:07 +020048#ifdef CONFIG_COMPAT
49 .compat_ioctl = autofs4_root_compat_ioctl,
50#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -070051};
52
Arjan van de Ven4b6f5d22006-03-28 01:56:42 -080053const struct file_operations autofs4_dir_operations = {
Linus Torvalds1da177e2005-04-16 15:20:36 -070054 .open = autofs4_dir_open,
Ian Kentff9cd492008-07-23 21:30:24 -070055 .release = dcache_dir_close,
Linus Torvalds1da177e2005-04-16 15:20:36 -070056 .read = generic_read_dir,
Ian Kentff9cd492008-07-23 21:30:24 -070057 .readdir = dcache_readdir,
Al Viro59af1582008-08-24 07:24:41 -040058 .llseek = dcache_dir_lseek,
Linus Torvalds1da177e2005-04-16 15:20:36 -070059};
60
Arjan van de Ven754661f2007-02-12 00:55:38 -080061const struct inode_operations autofs4_dir_inode_operations = {
Linus Torvalds1da177e2005-04-16 15:20:36 -070062 .lookup = autofs4_lookup,
63 .unlink = autofs4_dir_unlink,
64 .symlink = autofs4_dir_symlink,
65 .mkdir = autofs4_dir_mkdir,
66 .rmdir = autofs4_dir_rmdir,
67};
68
Ian Kent71e469d2011-01-14 18:46:19 +000069/* For dentries that don't initiate mounting */
70const struct dentry_operations autofs4_dentry_operations = {
71 .d_release = autofs4_dentry_release,
72};
73
74/* For dentries that do initiate mounting */
75const struct dentry_operations autofs4_mount_dentry_operations = {
76 .d_automount = autofs4_d_automount,
77 .d_manage = autofs4_d_manage,
78 .d_release = autofs4_dentry_release,
79};
80
Ian Kent4f8427d2009-12-15 16:45:42 -080081static void autofs4_add_active(struct dentry *dentry)
82{
83 struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb);
84 struct autofs_info *ino = autofs4_dentry_ino(dentry);
85 if (ino) {
86 spin_lock(&sbi->lookup_lock);
87 if (!ino->active_count) {
88 if (list_empty(&ino->active))
89 list_add(&ino->active, &sbi->active_list);
90 }
91 ino->active_count++;
92 spin_unlock(&sbi->lookup_lock);
93 }
94 return;
95}
96
97static void autofs4_del_active(struct dentry *dentry)
98{
99 struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb);
100 struct autofs_info *ino = autofs4_dentry_ino(dentry);
101 if (ino) {
102 spin_lock(&sbi->lookup_lock);
103 ino->active_count--;
104 if (!ino->active_count) {
105 if (!list_empty(&ino->active))
106 list_del_init(&ino->active);
107 }
108 spin_unlock(&sbi->lookup_lock);
109 }
110 return;
111}
112
Linus Torvalds1da177e2005-04-16 15:20:36 -0700113static int autofs4_dir_open(struct inode *inode, struct file *file)
114{
Josef "Jeff" Sipeka4669ed2006-12-08 02:36:46 -0800115 struct dentry *dentry = file->f_path.dentry;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700116 struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb);
Ian Kentf360ce32006-03-27 01:14:43 -0800117
Linus Torvalds1da177e2005-04-16 15:20:36 -0700118 DPRINTK("file=%p dentry=%p %.*s",
119 file, dentry, dentry->d_name.len, dentry->d_name.name);
120
121 if (autofs4_oz_mode(sbi))
122 goto out;
123
Ian Kentff9cd492008-07-23 21:30:24 -0700124 /*
125 * An empty directory in an autofs file system is always a
126 * mount point. The daemon must have failed to mount this
127 * during lookup so it doesn't exist. This can happen, for
128 * example, if user space returns an incorrect status for a
129 * mount request. Otherwise we're doing a readdir on the
130 * autofs file system so just let the libfs routines handle
131 * it.
132 */
Nick Pigginb5c84bf2011-01-07 17:49:38 +1100133 spin_lock(&autofs4_lock);
Nick Piggin2fd6b7f2011-01-07 17:49:34 +1100134 spin_lock(&dentry->d_lock);
Ian Kentc42c7f72009-12-15 16:45:48 -0800135 if (!d_mountpoint(dentry) && list_empty(&dentry->d_subdirs)) {
Nick Piggin2fd6b7f2011-01-07 17:49:34 +1100136 spin_unlock(&dentry->d_lock);
Nick Pigginb5c84bf2011-01-07 17:49:38 +1100137 spin_unlock(&autofs4_lock);
Ian Kentff9cd492008-07-23 21:30:24 -0700138 return -ENOENT;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700139 }
Nick Piggin2fd6b7f2011-01-07 17:49:34 +1100140 spin_unlock(&dentry->d_lock);
Nick Pigginb5c84bf2011-01-07 17:49:38 +1100141 spin_unlock(&autofs4_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700142
Ian Kentf360ce32006-03-27 01:14:43 -0800143out:
Ian Kentff9cd492008-07-23 21:30:24 -0700144 return dcache_dir_open(inode, file);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700145}
146
Ian Kent34ca9592006-03-27 01:14:54 -0800147void autofs4_dentry_release(struct dentry *de)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700148{
149 struct autofs_info *inf;
150
151 DPRINTK("releasing %p", de);
152
153 inf = autofs4_dentry_ino(de);
154 de->d_fsdata = NULL;
155
156 if (inf) {
Ian Kentf50b6f82007-02-20 13:58:10 -0800157 struct autofs_sb_info *sbi = autofs4_sbi(de->d_sb);
158
Ian Kentf50b6f82007-02-20 13:58:10 -0800159 if (sbi) {
Ian Kent5f6f4f22008-07-23 21:30:09 -0700160 spin_lock(&sbi->lookup_lock);
Ian Kent25767372008-07-23 21:30:12 -0700161 if (!list_empty(&inf->active))
162 list_del(&inf->active);
Ian Kent5f6f4f22008-07-23 21:30:09 -0700163 if (!list_empty(&inf->expiring))
164 list_del(&inf->expiring);
165 spin_unlock(&sbi->lookup_lock);
Ian Kentf50b6f82007-02-20 13:58:10 -0800166 }
167
Jeff Mahoneyc3724b12007-04-11 23:28:46 -0700168 inf->dentry = NULL;
169 inf->inode = NULL;
170
Linus Torvalds1da177e2005-04-16 15:20:36 -0700171 autofs4_free_ino(inf);
172 }
173}
174
Ian Kent6510c9d2009-12-15 16:45:47 -0800175static struct dentry *autofs4_lookup_active(struct dentry *dentry)
Ian Kent25767372008-07-23 21:30:12 -0700176{
Ian Kent6510c9d2009-12-15 16:45:47 -0800177 struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb);
178 struct dentry *parent = dentry->d_parent;
179 struct qstr *name = &dentry->d_name;
Ian Kent25767372008-07-23 21:30:12 -0700180 unsigned int len = name->len;
181 unsigned int hash = name->hash;
182 const unsigned char *str = name->name;
183 struct list_head *p, *head;
184
Nick Pigginb5c84bf2011-01-07 17:49:38 +1100185 spin_lock(&autofs4_lock);
Ian Kent25767372008-07-23 21:30:12 -0700186 spin_lock(&sbi->lookup_lock);
187 head = &sbi->active_list;
188 list_for_each(p, head) {
189 struct autofs_info *ino;
Ian Kente4d5ade2009-12-15 16:45:49 -0800190 struct dentry *active;
Ian Kent25767372008-07-23 21:30:12 -0700191 struct qstr *qstr;
192
193 ino = list_entry(p, struct autofs_info, active);
Ian Kente4d5ade2009-12-15 16:45:49 -0800194 active = ino->dentry;
Ian Kent25767372008-07-23 21:30:12 -0700195
Ian Kente4d5ade2009-12-15 16:45:49 -0800196 spin_lock(&active->d_lock);
Ian Kent25767372008-07-23 21:30:12 -0700197
198 /* Already gone? */
Nick Pigginb7ab39f2011-01-07 17:49:32 +1100199 if (active->d_count == 0)
Ian Kent25767372008-07-23 21:30:12 -0700200 goto next;
201
Ian Kente4d5ade2009-12-15 16:45:49 -0800202 qstr = &active->d_name;
Ian Kent25767372008-07-23 21:30:12 -0700203
Ian Kente4d5ade2009-12-15 16:45:49 -0800204 if (active->d_name.hash != hash)
Ian Kent25767372008-07-23 21:30:12 -0700205 goto next;
Ian Kente4d5ade2009-12-15 16:45:49 -0800206 if (active->d_parent != parent)
Ian Kent25767372008-07-23 21:30:12 -0700207 goto next;
208
209 if (qstr->len != len)
210 goto next;
211 if (memcmp(qstr->name, str, len))
212 goto next;
213
Al Viro4b1ae272010-03-03 12:58:31 -0500214 if (d_unhashed(active)) {
Nick Pigginb7ab39f2011-01-07 17:49:32 +1100215 dget_dlock(active);
Al Viro4b1ae272010-03-03 12:58:31 -0500216 spin_unlock(&active->d_lock);
217 spin_unlock(&sbi->lookup_lock);
Nick Pigginb5c84bf2011-01-07 17:49:38 +1100218 spin_unlock(&autofs4_lock);
Al Viro4b1ae272010-03-03 12:58:31 -0500219 return active;
220 }
Ian Kent25767372008-07-23 21:30:12 -0700221next:
Ian Kente4d5ade2009-12-15 16:45:49 -0800222 spin_unlock(&active->d_lock);
Ian Kent25767372008-07-23 21:30:12 -0700223 }
224 spin_unlock(&sbi->lookup_lock);
Nick Pigginb5c84bf2011-01-07 17:49:38 +1100225 spin_unlock(&autofs4_lock);
Ian Kent25767372008-07-23 21:30:12 -0700226
227 return NULL;
228}
229
Ian Kent6510c9d2009-12-15 16:45:47 -0800230static struct dentry *autofs4_lookup_expiring(struct dentry *dentry)
Ian Kentf50b6f82007-02-20 13:58:10 -0800231{
Ian Kent6510c9d2009-12-15 16:45:47 -0800232 struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb);
233 struct dentry *parent = dentry->d_parent;
234 struct qstr *name = &dentry->d_name;
Ian Kentf50b6f82007-02-20 13:58:10 -0800235 unsigned int len = name->len;
236 unsigned int hash = name->hash;
237 const unsigned char *str = name->name;
238 struct list_head *p, *head;
239
Nick Pigginb5c84bf2011-01-07 17:49:38 +1100240 spin_lock(&autofs4_lock);
Ian Kent5f6f4f22008-07-23 21:30:09 -0700241 spin_lock(&sbi->lookup_lock);
242 head = &sbi->expiring_list;
Ian Kentf50b6f82007-02-20 13:58:10 -0800243 list_for_each(p, head) {
244 struct autofs_info *ino;
Ian Kentcb4b4922009-12-15 16:45:50 -0800245 struct dentry *expiring;
Ian Kentf50b6f82007-02-20 13:58:10 -0800246 struct qstr *qstr;
247
Ian Kent5f6f4f22008-07-23 21:30:09 -0700248 ino = list_entry(p, struct autofs_info, expiring);
Ian Kentcb4b4922009-12-15 16:45:50 -0800249 expiring = ino->dentry;
Ian Kentf50b6f82007-02-20 13:58:10 -0800250
Ian Kentcb4b4922009-12-15 16:45:50 -0800251 spin_lock(&expiring->d_lock);
Ian Kentf50b6f82007-02-20 13:58:10 -0800252
253 /* Bad luck, we've already been dentry_iput */
Ian Kentcb4b4922009-12-15 16:45:50 -0800254 if (!expiring->d_inode)
Ian Kentf50b6f82007-02-20 13:58:10 -0800255 goto next;
256
Ian Kentcb4b4922009-12-15 16:45:50 -0800257 qstr = &expiring->d_name;
Ian Kentf50b6f82007-02-20 13:58:10 -0800258
Ian Kentcb4b4922009-12-15 16:45:50 -0800259 if (expiring->d_name.hash != hash)
Ian Kentf50b6f82007-02-20 13:58:10 -0800260 goto next;
Ian Kentcb4b4922009-12-15 16:45:50 -0800261 if (expiring->d_parent != parent)
Ian Kentf50b6f82007-02-20 13:58:10 -0800262 goto next;
263
264 if (qstr->len != len)
265 goto next;
266 if (memcmp(qstr->name, str, len))
267 goto next;
268
Al Viro4b1ae272010-03-03 12:58:31 -0500269 if (d_unhashed(expiring)) {
Nick Pigginb7ab39f2011-01-07 17:49:32 +1100270 dget_dlock(expiring);
Al Viro4b1ae272010-03-03 12:58:31 -0500271 spin_unlock(&expiring->d_lock);
272 spin_unlock(&sbi->lookup_lock);
Nick Pigginb5c84bf2011-01-07 17:49:38 +1100273 spin_unlock(&autofs4_lock);
Al Viro4b1ae272010-03-03 12:58:31 -0500274 return expiring;
275 }
Ian Kentf50b6f82007-02-20 13:58:10 -0800276next:
Ian Kentcb4b4922009-12-15 16:45:50 -0800277 spin_unlock(&expiring->d_lock);
Ian Kentf50b6f82007-02-20 13:58:10 -0800278 }
Ian Kent5f6f4f22008-07-23 21:30:09 -0700279 spin_unlock(&sbi->lookup_lock);
Nick Pigginb5c84bf2011-01-07 17:49:38 +1100280 spin_unlock(&autofs4_lock);
Ian Kentf50b6f82007-02-20 13:58:10 -0800281
282 return NULL;
283}
284
Ian Kent10584212011-01-14 18:45:58 +0000285static int autofs4_mount_wait(struct dentry *dentry)
286{
287 struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb);
288 struct autofs_info *ino = autofs4_dentry_ino(dentry);
289 int status;
290
291 if (ino->flags & AUTOFS_INF_PENDING) {
292 DPRINTK("waiting for mount name=%.*s",
293 dentry->d_name.len, dentry->d_name.name);
294 status = autofs4_wait(sbi, dentry, NFY_MOUNT);
295 DPRINTK("mount wait done status=%d", status);
296 ino->last_used = jiffies;
297 return status;
298 }
299 return 0;
300}
301
302static int do_expire_wait(struct dentry *dentry)
303{
304 struct dentry *expiring;
305
306 expiring = autofs4_lookup_expiring(dentry);
307 if (!expiring)
308 return autofs4_expire_wait(dentry);
309 else {
310 /*
311 * If we are racing with expire the request might not
312 * be quite complete, but the directory has been removed
313 * so it must have been successful, just wait for it.
314 */
315 autofs4_expire_wait(expiring);
316 autofs4_del_expiring(expiring);
317 dput(expiring);
318 }
319 return 0;
320}
321
322static struct dentry *autofs4_mountpoint_changed(struct path *path)
323{
324 struct dentry *dentry = path->dentry;
325 struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb);
326
327 /*
328 * If this is an indirect mount the dentry could have gone away
329 * as a result of an expire and a new one created.
330 */
331 if (autofs_type_indirect(sbi->type) && d_unhashed(dentry)) {
332 struct dentry *parent = dentry->d_parent;
333 struct dentry *new = d_lookup(parent, &dentry->d_name);
334 if (!new)
335 return NULL;
336 dput(path->dentry);
337 path->dentry = new;
338 }
339 return path->dentry;
340}
341
Ian Kent71e469d2011-01-14 18:46:19 +0000342static struct vfsmount *autofs4_d_automount(struct path *path)
Ian Kent10584212011-01-14 18:45:58 +0000343{
344 struct dentry *dentry = path->dentry;
345 struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb);
346 struct autofs_info *ino = autofs4_dentry_ino(dentry);
347 int status;
348
349 DPRINTK("dentry=%p %.*s",
350 dentry, dentry->d_name.len, dentry->d_name.name);
351
Ian Kentb5b80172011-01-14 18:46:03 +0000352 /*
353 * Someone may have manually umounted this or it was a submount
354 * that has gone away.
355 */
356 spin_lock(&dentry->d_lock);
357 if (!d_mountpoint(dentry) && list_empty(&dentry->d_subdirs)) {
358 if (!(dentry->d_flags & DCACHE_MANAGE_TRANSIT) &&
359 (dentry->d_flags & DCACHE_NEED_AUTOMOUNT))
360 __managed_dentry_set_transit(path->dentry);
361 }
362 spin_unlock(&dentry->d_lock);
363
Ian Kent10584212011-01-14 18:45:58 +0000364 /* The daemon never triggers a mount. */
365 if (autofs4_oz_mode(sbi))
366 return NULL;
367
368 /*
369 * If an expire request is pending everyone must wait.
370 * If the expire fails we're still mounted so continue
371 * the follow and return. A return of -EAGAIN (which only
372 * happens with indirect mounts) means the expire completed
373 * and the directory was removed, so just go ahead and try
374 * the mount.
375 */
376 status = do_expire_wait(dentry);
377 if (status && status != -EAGAIN)
378 return NULL;
379
380 /* Callback to the daemon to perform the mount or wait */
381 spin_lock(&sbi->fs_lock);
382 if (ino->flags & AUTOFS_INF_PENDING) {
383 spin_unlock(&sbi->fs_lock);
384 status = autofs4_mount_wait(dentry);
385 if (status)
386 return ERR_PTR(status);
387 spin_lock(&sbi->fs_lock);
388 goto done;
389 }
390
391 /*
392 * If the dentry is a symlink it's equivalent to a directory
Ian Kentb5b80172011-01-14 18:46:03 +0000393 * having d_mountpoint() true, so there's no need to call back
Ian Kent10584212011-01-14 18:45:58 +0000394 * to the daemon.
395 */
396 if (dentry->d_inode && S_ISLNK(dentry->d_inode->i_mode))
397 goto done;
Ian Kentb5b80172011-01-14 18:46:03 +0000398 if (!d_mountpoint(dentry)) {
399 /*
400 * It's possible that user space hasn't removed directories
401 * after umounting a rootless multi-mount, although it
402 * should. For v5 have_submounts() is sufficient to handle
403 * this because the leaves of the directory tree under the
404 * mount never trigger mounts themselves (they have an autofs
405 * trigger mount mounted on them). But v4 pseudo direct mounts
406 * do need the leaves to to trigger mounts. In this case we
407 * have no choice but to use the list_empty() check and
408 * require user space behave.
409 */
410 if (sbi->version > 4) {
411 if (have_submounts(dentry))
412 goto done;
413 } else {
414 spin_lock(&dentry->d_lock);
415 if (!list_empty(&dentry->d_subdirs)) {
416 spin_unlock(&dentry->d_lock);
417 goto done;
418 }
419 spin_unlock(&dentry->d_lock);
420 }
Ian Kent10584212011-01-14 18:45:58 +0000421 ino->flags |= AUTOFS_INF_PENDING;
Ian Kent10584212011-01-14 18:45:58 +0000422 spin_unlock(&sbi->fs_lock);
423 status = autofs4_mount_wait(dentry);
424 if (status)
425 return ERR_PTR(status);
426 spin_lock(&sbi->fs_lock);
427 ino->flags &= ~AUTOFS_INF_PENDING;
Ian Kent10584212011-01-14 18:45:58 +0000428 }
Ian Kent10584212011-01-14 18:45:58 +0000429done:
Ian Kentb5b80172011-01-14 18:46:03 +0000430 if (!(ino->flags & AUTOFS_INF_EXPIRING)) {
431 /*
432 * Any needed mounting has been completed and the path updated
433 * so turn this into a normal dentry so we don't continually
434 * call ->d_automount() and ->d_manage().
435 */
436 spin_lock(&dentry->d_lock);
437 __managed_dentry_clear_transit(dentry);
438 /*
439 * Only clear DMANAGED_AUTOMOUNT for rootless multi-mounts and
440 * symlinks as in all other cases the dentry will be covered by
441 * an actual mount so ->d_automount() won't be called during
442 * the follow.
443 */
444 if ((!d_mountpoint(dentry) &&
445 !list_empty(&dentry->d_subdirs)) ||
446 (dentry->d_inode && S_ISLNK(dentry->d_inode->i_mode)))
447 __managed_dentry_clear_automount(dentry);
448 spin_unlock(&dentry->d_lock);
449 }
Ian Kent10584212011-01-14 18:45:58 +0000450 spin_unlock(&sbi->fs_lock);
451
452 /* Mount succeeded, check if we ended up with a new dentry */
453 dentry = autofs4_mountpoint_changed(path);
454 if (!dentry)
455 return ERR_PTR(-ENOENT);
456
457 return NULL;
458}
459
Ian Kentb5b80172011-01-14 18:46:03 +0000460int autofs4_d_manage(struct dentry *dentry, bool mounting_here)
461{
462 struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb);
463
464 DPRINTK("dentry=%p %.*s",
465 dentry, dentry->d_name.len, dentry->d_name.name);
466
467 /* The daemon never waits. */
468 if (autofs4_oz_mode(sbi) || mounting_here) {
469 if (!d_mountpoint(dentry))
470 return -EISDIR;
471 return 0;
472 }
473
474 /* Wait for pending expires */
475 do_expire_wait(dentry);
476
477 /*
478 * This dentry may be under construction so wait on mount
479 * completion.
480 */
481 return autofs4_mount_wait(dentry);
482}
483
Linus Torvalds1da177e2005-04-16 15:20:36 -0700484/* Lookups in the root directory */
485static struct dentry *autofs4_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd)
486{
487 struct autofs_sb_info *sbi;
Ian Kent25767372008-07-23 21:30:12 -0700488 struct autofs_info *ino;
Ian Kent10584212011-01-14 18:45:58 +0000489 struct dentry *active;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700490
Ian Kent10584212011-01-14 18:45:58 +0000491 DPRINTK("name = %.*s", dentry->d_name.len, dentry->d_name.name);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700492
Ian Kent718c6042006-03-27 01:14:42 -0800493 /* File name too long to exist */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700494 if (dentry->d_name.len > NAME_MAX)
Ian Kent718c6042006-03-27 01:14:42 -0800495 return ERR_PTR(-ENAMETOOLONG);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700496
497 sbi = autofs4_sbi(dir->i_sb);
Ian Kent718c6042006-03-27 01:14:42 -0800498
Linus Torvalds1da177e2005-04-16 15:20:36 -0700499 DPRINTK("pid = %u, pgrp = %u, catatonic = %d, oz_mode = %d",
Ian Kent10584212011-01-14 18:45:58 +0000500 current->pid, task_pgrp_nr(current), sbi->catatonic, oz_mode);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700501
Ian Kent6510c9d2009-12-15 16:45:47 -0800502 active = autofs4_lookup_active(dentry);
Ian Kent90387c92009-12-15 16:45:46 -0800503 if (active) {
Ian Kent10584212011-01-14 18:45:58 +0000504 return active;
Ian Kentaa952eb2009-12-15 16:45:45 -0800505 } else {
Ian Kent71e469d2011-01-14 18:46:19 +0000506 d_set_d_op(dentry, &autofs4_dentry_operations);
Al Viro4b1ae272010-03-03 12:58:31 -0500507
508 /*
Ian Kent10584212011-01-14 18:45:58 +0000509 * A dentry that is not within the root can never trigger a
510 * mount operation, unless the directory already exists, so we
511 * can return fail immediately. The daemon however does need
512 * to create directories within the file system.
Al Viro4b1ae272010-03-03 12:58:31 -0500513 */
Ian Kent10584212011-01-14 18:45:58 +0000514 if (!autofs4_oz_mode(sbi) && !IS_ROOT(dentry->d_parent))
515 return ERR_PTR(-ENOENT);
516
517 /* Mark entries in the root as mount triggers */
518 if (autofs_type_indirect(sbi->type) && IS_ROOT(dentry->d_parent)) {
Ian Kent71e469d2011-01-14 18:46:19 +0000519 d_set_d_op(dentry, &autofs4_mount_dentry_operations);
Ian Kentb5b80172011-01-14 18:46:03 +0000520 __managed_dentry_set_managed(dentry);
Ian Kent10584212011-01-14 18:45:58 +0000521 }
522
Al Viro4b1ae272010-03-03 12:58:31 -0500523 ino = autofs4_init_ino(NULL, sbi, 0555);
524 if (!ino)
525 return ERR_PTR(-ENOMEM);
526
527 dentry->d_fsdata = ino;
528 ino->dentry = dentry;
529
530 autofs4_add_active(dentry);
531
532 d_instantiate(dentry, NULL);
Ian Kent25767372008-07-23 21:30:12 -0700533 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700534 return NULL;
535}
536
537static int autofs4_dir_symlink(struct inode *dir,
538 struct dentry *dentry,
539 const char *symname)
540{
541 struct autofs_sb_info *sbi = autofs4_sbi(dir->i_sb);
542 struct autofs_info *ino = autofs4_dentry_ino(dentry);
Ian Kent1aff3c82006-03-27 01:14:46 -0800543 struct autofs_info *p_ino;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700544 struct inode *inode;
545 char *cp;
546
547 DPRINTK("%s <- %.*s", symname,
548 dentry->d_name.len, dentry->d_name.name);
549
550 if (!autofs4_oz_mode(sbi))
551 return -EACCES;
552
553 ino = autofs4_init_ino(ino, sbi, S_IFLNK | 0555);
Ian Kent25767372008-07-23 21:30:12 -0700554 if (!ino)
555 return -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700556
Al Viro4b1ae272010-03-03 12:58:31 -0500557 autofs4_del_active(dentry);
558
Ian Kentef581a72008-07-23 21:30:13 -0700559 ino->size = strlen(symname);
Ian Kent25767372008-07-23 21:30:12 -0700560 cp = kmalloc(ino->size + 1, GFP_KERNEL);
561 if (!cp) {
562 if (!dentry->d_fsdata)
563 kfree(ino);
564 return -ENOMEM;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700565 }
566
567 strcpy(cp, symname);
568
569 inode = autofs4_get_inode(dir->i_sb, ino);
Ian Kent25767372008-07-23 21:30:12 -0700570 if (!inode) {
571 kfree(cp);
572 if (!dentry->d_fsdata)
573 kfree(ino);
574 return -ENOMEM;
575 }
Ian Kent1864f7b2007-08-22 14:01:54 -0700576 d_add(dentry, inode);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700577
Ian Kent71e469d2011-01-14 18:46:19 +0000578 d_set_d_op(dentry, &autofs4_dentry_operations);
579
Linus Torvalds1da177e2005-04-16 15:20:36 -0700580 dentry->d_fsdata = ino;
581 ino->dentry = dget(dentry);
Ian Kent1aff3c82006-03-27 01:14:46 -0800582 atomic_inc(&ino->count);
583 p_ino = autofs4_dentry_ino(dentry->d_parent);
584 if (p_ino && dentry->d_parent != dentry)
585 atomic_inc(&p_ino->count);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700586 ino->inode = inode;
587
Ian Kent25767372008-07-23 21:30:12 -0700588 ino->u.symlink = cp;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700589 dir->i_mtime = CURRENT_TIME;
590
591 return 0;
592}
593
594/*
595 * NOTE!
596 *
597 * Normal filesystems would do a "d_delete()" to tell the VFS dcache
598 * that the file no longer exists. However, doing that means that the
599 * VFS layer can turn the dentry into a negative dentry. We don't want
Ian Kentf50b6f82007-02-20 13:58:10 -0800600 * this, because the unlink is probably the result of an expire.
Ian Kent5f6f4f22008-07-23 21:30:09 -0700601 * We simply d_drop it and add it to a expiring list in the super block,
602 * which allows the dentry lookup to check for an incomplete expire.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700603 *
604 * If a process is blocked on the dentry waiting for the expire to finish,
605 * it will invalidate the dentry and try to mount with a new one.
606 *
607 * Also see autofs4_dir_rmdir()..
608 */
609static int autofs4_dir_unlink(struct inode *dir, struct dentry *dentry)
610{
611 struct autofs_sb_info *sbi = autofs4_sbi(dir->i_sb);
612 struct autofs_info *ino = autofs4_dentry_ino(dentry);
Ian Kent1aff3c82006-03-27 01:14:46 -0800613 struct autofs_info *p_ino;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700614
615 /* This allows root to remove symlinks */
Sukadev Bhattiprolud78e53c2007-05-10 22:23:06 -0700616 if (!autofs4_oz_mode(sbi) && !capable(CAP_SYS_ADMIN))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700617 return -EACCES;
618
Ian Kent1aff3c82006-03-27 01:14:46 -0800619 if (atomic_dec_and_test(&ino->count)) {
620 p_ino = autofs4_dentry_ino(dentry->d_parent);
621 if (p_ino && dentry->d_parent != dentry)
622 atomic_dec(&p_ino->count);
623 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700624 dput(ino->dentry);
625
626 dentry->d_inode->i_size = 0;
Dave Hansence71ec32006-09-30 23:29:06 -0700627 clear_nlink(dentry->d_inode);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700628
629 dir->i_mtime = CURRENT_TIME;
630
Nick Pigginb5c84bf2011-01-07 17:49:38 +1100631 spin_lock(&autofs4_lock);
Al Viro4b1ae272010-03-03 12:58:31 -0500632 autofs4_add_expiring(dentry);
Ian Kentf50b6f82007-02-20 13:58:10 -0800633 spin_lock(&dentry->d_lock);
634 __d_drop(dentry);
635 spin_unlock(&dentry->d_lock);
Nick Pigginb5c84bf2011-01-07 17:49:38 +1100636 spin_unlock(&autofs4_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700637
638 return 0;
639}
640
641static int autofs4_dir_rmdir(struct inode *dir, struct dentry *dentry)
642{
643 struct autofs_sb_info *sbi = autofs4_sbi(dir->i_sb);
644 struct autofs_info *ino = autofs4_dentry_ino(dentry);
Ian Kent1aff3c82006-03-27 01:14:46 -0800645 struct autofs_info *p_ino;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700646
Ian Kentf50b6f82007-02-20 13:58:10 -0800647 DPRINTK("dentry %p, removing %.*s",
648 dentry, dentry->d_name.len, dentry->d_name.name);
649
Linus Torvalds1da177e2005-04-16 15:20:36 -0700650 if (!autofs4_oz_mode(sbi))
651 return -EACCES;
652
Nick Pigginb5c84bf2011-01-07 17:49:38 +1100653 spin_lock(&autofs4_lock);
Nick Piggin2fd6b7f2011-01-07 17:49:34 +1100654 spin_lock(&sbi->lookup_lock);
655 spin_lock(&dentry->d_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700656 if (!list_empty(&dentry->d_subdirs)) {
Nick Piggin2fd6b7f2011-01-07 17:49:34 +1100657 spin_unlock(&dentry->d_lock);
658 spin_unlock(&sbi->lookup_lock);
Nick Pigginb5c84bf2011-01-07 17:49:38 +1100659 spin_unlock(&autofs4_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700660 return -ENOTEMPTY;
661 }
Nick Piggin2fd6b7f2011-01-07 17:49:34 +1100662 __autofs4_add_expiring(dentry);
663 spin_unlock(&sbi->lookup_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700664 __d_drop(dentry);
665 spin_unlock(&dentry->d_lock);
Nick Pigginb5c84bf2011-01-07 17:49:38 +1100666 spin_unlock(&autofs4_lock);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700667
Ian Kent1aff3c82006-03-27 01:14:46 -0800668 if (atomic_dec_and_test(&ino->count)) {
669 p_ino = autofs4_dentry_ino(dentry->d_parent);
670 if (p_ino && dentry->d_parent != dentry)
671 atomic_dec(&p_ino->count);
672 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700673 dput(ino->dentry);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700674 dentry->d_inode->i_size = 0;
Dave Hansence71ec32006-09-30 23:29:06 -0700675 clear_nlink(dentry->d_inode);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700676
677 if (dir->i_nlink)
Dave Hansen9a53c3a2006-09-30 23:29:03 -0700678 drop_nlink(dir);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700679
680 return 0;
681}
682
683static int autofs4_dir_mkdir(struct inode *dir, struct dentry *dentry, int mode)
684{
685 struct autofs_sb_info *sbi = autofs4_sbi(dir->i_sb);
686 struct autofs_info *ino = autofs4_dentry_ino(dentry);
Ian Kent1aff3c82006-03-27 01:14:46 -0800687 struct autofs_info *p_ino;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700688 struct inode *inode;
689
Sukadev Bhattiprolud78e53c2007-05-10 22:23:06 -0700690 if (!autofs4_oz_mode(sbi))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700691 return -EACCES;
692
693 DPRINTK("dentry %p, creating %.*s",
694 dentry, dentry->d_name.len, dentry->d_name.name);
695
696 ino = autofs4_init_ino(ino, sbi, S_IFDIR | 0555);
Ian Kent25767372008-07-23 21:30:12 -0700697 if (!ino)
698 return -ENOMEM;
699
Al Viro4b1ae272010-03-03 12:58:31 -0500700 autofs4_del_active(dentry);
701
Linus Torvalds1da177e2005-04-16 15:20:36 -0700702 inode = autofs4_get_inode(dir->i_sb, ino);
Ian Kent25767372008-07-23 21:30:12 -0700703 if (!inode) {
704 if (!dentry->d_fsdata)
705 kfree(ino);
706 return -ENOMEM;
707 }
Ian Kent1864f7b2007-08-22 14:01:54 -0700708 d_add(dentry, inode);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700709
Linus Torvalds1da177e2005-04-16 15:20:36 -0700710 dentry->d_fsdata = ino;
711 ino->dentry = dget(dentry);
Ian Kent1aff3c82006-03-27 01:14:46 -0800712 atomic_inc(&ino->count);
713 p_ino = autofs4_dentry_ino(dentry->d_parent);
714 if (p_ino && dentry->d_parent != dentry)
715 atomic_inc(&p_ino->count);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700716 ino->inode = inode;
Dave Hansend8c76e62006-09-30 23:29:04 -0700717 inc_nlink(dir);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700718 dir->i_mtime = CURRENT_TIME;
719
720 return 0;
721}
722
723/* Get/set timeout ioctl() operation */
Arnd Bergmannc9243f52010-07-04 00:15:07 +0200724#ifdef CONFIG_COMPAT
725static inline int autofs4_compat_get_set_timeout(struct autofs_sb_info *sbi,
726 compat_ulong_t __user *p)
727{
728 int rv;
729 unsigned long ntimeout;
730
731 if ((rv = get_user(ntimeout, p)) ||
732 (rv = put_user(sbi->exp_timeout/HZ, p)))
733 return rv;
734
735 if (ntimeout > UINT_MAX/HZ)
736 sbi->exp_timeout = 0;
737 else
738 sbi->exp_timeout = ntimeout * HZ;
739
740 return 0;
741}
742#endif
743
Linus Torvalds1da177e2005-04-16 15:20:36 -0700744static inline int autofs4_get_set_timeout(struct autofs_sb_info *sbi,
745 unsigned long __user *p)
746{
747 int rv;
748 unsigned long ntimeout;
749
Sukadev Bhattiprolud78e53c2007-05-10 22:23:06 -0700750 if ((rv = get_user(ntimeout, p)) ||
751 (rv = put_user(sbi->exp_timeout/HZ, p)))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700752 return rv;
753
Sukadev Bhattiprolud78e53c2007-05-10 22:23:06 -0700754 if (ntimeout > ULONG_MAX/HZ)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700755 sbi->exp_timeout = 0;
756 else
757 sbi->exp_timeout = ntimeout * HZ;
758
759 return 0;
760}
761
762/* Return protocol version */
763static inline int autofs4_get_protover(struct autofs_sb_info *sbi, int __user *p)
764{
765 return put_user(sbi->version, p);
766}
767
768/* Return protocol sub version */
769static inline int autofs4_get_protosubver(struct autofs_sb_info *sbi, int __user *p)
770{
771 return put_user(sbi->sub_version, p);
772}
773
774/*
Linus Torvalds1da177e2005-04-16 15:20:36 -0700775* Tells the daemon whether it can umount the autofs mount.
776*/
777static inline int autofs4_ask_umount(struct vfsmount *mnt, int __user *p)
778{
779 int status = 0;
780
Ian Kente3474a82006-03-27 01:14:51 -0800781 if (may_umount(mnt))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700782 status = 1;
783
784 DPRINTK("returning %d", status);
785
786 status = put_user(status, p);
787
788 return status;
789}
790
791/* Identify autofs4_dentries - this is so we can tell if there's
792 an extra dentry refcount or not. We only hold a refcount on the
793 dentry if its non-negative (ie, d_inode != NULL)
794*/
795int is_autofs4_dentry(struct dentry *dentry)
796{
797 return dentry && dentry->d_inode &&
Ian Kent71e469d2011-01-14 18:46:19 +0000798 (dentry->d_op == &autofs4_mount_dentry_operations ||
Linus Torvalds1da177e2005-04-16 15:20:36 -0700799 dentry->d_op == &autofs4_dentry_operations) &&
800 dentry->d_fsdata != NULL;
801}
802
803/*
804 * ioctl()'s on the root directory is the chief method for the daemon to
805 * generate kernel reactions
806 */
Frederic Weisbecker3663df72010-05-19 15:08:17 +0200807static int autofs4_root_ioctl_unlocked(struct inode *inode, struct file *filp,
808 unsigned int cmd, unsigned long arg)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700809{
810 struct autofs_sb_info *sbi = autofs4_sbi(inode->i_sb);
811 void __user *p = (void __user *)arg;
812
813 DPRINTK("cmd = 0x%08x, arg = 0x%08lx, sbi = %p, pgrp = %u",
Pavel Emelianova47afb02007-10-18 23:39:46 -0700814 cmd,arg,sbi,task_pgrp_nr(current));
Linus Torvalds1da177e2005-04-16 15:20:36 -0700815
Sukadev Bhattiprolud78e53c2007-05-10 22:23:06 -0700816 if (_IOC_TYPE(cmd) != _IOC_TYPE(AUTOFS_IOC_FIRST) ||
817 _IOC_NR(cmd) - _IOC_NR(AUTOFS_IOC_FIRST) >= AUTOFS_IOC_COUNT)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700818 return -ENOTTY;
819
Sukadev Bhattiprolud78e53c2007-05-10 22:23:06 -0700820 if (!autofs4_oz_mode(sbi) && !capable(CAP_SYS_ADMIN))
Linus Torvalds1da177e2005-04-16 15:20:36 -0700821 return -EPERM;
822
823 switch(cmd) {
824 case AUTOFS_IOC_READY: /* Wait queue: go ahead and retry */
825 return autofs4_wait_release(sbi,(autofs_wqt_t)arg,0);
826 case AUTOFS_IOC_FAIL: /* Wait queue: fail with ENOENT */
827 return autofs4_wait_release(sbi,(autofs_wqt_t)arg,-ENOENT);
828 case AUTOFS_IOC_CATATONIC: /* Enter catatonic mode (daemon shutdown) */
829 autofs4_catatonic_mode(sbi);
830 return 0;
831 case AUTOFS_IOC_PROTOVER: /* Get protocol version */
832 return autofs4_get_protover(sbi, p);
833 case AUTOFS_IOC_PROTOSUBVER: /* Get protocol sub version */
834 return autofs4_get_protosubver(sbi, p);
835 case AUTOFS_IOC_SETTIMEOUT:
836 return autofs4_get_set_timeout(sbi, p);
Arnd Bergmannc9243f52010-07-04 00:15:07 +0200837#ifdef CONFIG_COMPAT
838 case AUTOFS_IOC_SETTIMEOUT32:
839 return autofs4_compat_get_set_timeout(sbi, p);
840#endif
Linus Torvalds1da177e2005-04-16 15:20:36 -0700841
Linus Torvalds1da177e2005-04-16 15:20:36 -0700842 case AUTOFS_IOC_ASKUMOUNT:
Josef "Jeff" Sipeka4669ed2006-12-08 02:36:46 -0800843 return autofs4_ask_umount(filp->f_path.mnt, p);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700844
845 /* return a single thing to expire */
846 case AUTOFS_IOC_EXPIRE:
Josef "Jeff" Sipeka4669ed2006-12-08 02:36:46 -0800847 return autofs4_expire_run(inode->i_sb,filp->f_path.mnt,sbi, p);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700848 /* same as above, but can send multiple expires through pipe */
849 case AUTOFS_IOC_EXPIRE_MULTI:
Josef "Jeff" Sipeka4669ed2006-12-08 02:36:46 -0800850 return autofs4_expire_multi(inode->i_sb,filp->f_path.mnt,sbi, p);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700851
852 default:
853 return -ENOSYS;
854 }
855}
Frederic Weisbecker3663df72010-05-19 15:08:17 +0200856
857static long autofs4_root_ioctl(struct file *filp,
858 unsigned int cmd, unsigned long arg)
859{
Frederic Weisbecker3663df72010-05-19 15:08:17 +0200860 struct inode *inode = filp->f_dentry->d_inode;
Ian Kentde47de72010-12-07 13:04:00 +0800861 return autofs4_root_ioctl_unlocked(inode, filp, cmd, arg);
Frederic Weisbecker3663df72010-05-19 15:08:17 +0200862}
Arnd Bergmannc9243f52010-07-04 00:15:07 +0200863
864#ifdef CONFIG_COMPAT
865static long autofs4_root_compat_ioctl(struct file *filp,
866 unsigned int cmd, unsigned long arg)
867{
868 struct inode *inode = filp->f_path.dentry->d_inode;
869 int ret;
870
Arnd Bergmannc9243f52010-07-04 00:15:07 +0200871 if (cmd == AUTOFS_IOC_READY || cmd == AUTOFS_IOC_FAIL)
872 ret = autofs4_root_ioctl_unlocked(inode, filp, cmd, arg);
873 else
874 ret = autofs4_root_ioctl_unlocked(inode, filp, cmd,
875 (unsigned long)compat_ptr(arg));
Arnd Bergmannc9243f52010-07-04 00:15:07 +0200876
877 return ret;
878}
879#endif