aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIan Kent <raven@themaw.net>2009-12-15 19:45:51 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2009-12-16 10:19:58 -0500
commit213614d583748d00967a91cacd656f417efb36ce (patch)
treef24b85cb8192af7f6723f3886fba3da55ccfbe0d
parentcb4b492ac7595aad10756fe0b04691f0965e0cfc (diff)
autofs4: always use lookup for lookup
We need to be able to cope with the directory mutex being held during ->d_revalidate() in some cases, but not all cases, and not necessarily by us. Because we need to release the mutex when we call back to the daemon to do perform a mount we must be sure that it is us who holds the mutex so we must redirect mount requests to ->lookup() if the mutex is held. Signed-off-by: Ian Kent <raven@themaw.net> Cc: Sage Weil <sage@newdream.net> Cc: Al Viro <viro@ZenIV.linux.org.uk> Cc: Andreas Dilger <adilger@sun.com> Cc: Christoph Hellwig <hch@infradead.org> Cc: Yehuda Saheh <yehuda@newdream.net> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--fs/autofs4/autofs_i.h7
-rw-r--r--fs/autofs4/expire.c6
-rw-r--r--fs/autofs4/inode.c1
-rw-r--r--fs/autofs4/root.c474
4 files changed, 330 insertions, 158 deletions
diff --git a/fs/autofs4/autofs_i.h b/fs/autofs4/autofs_i.h
index 3d283abf67d..0118d67221b 100644
--- a/fs/autofs4/autofs_i.h
+++ b/fs/autofs4/autofs_i.h
@@ -60,6 +60,11 @@ do { \
60 current->pid, __func__, ##args); \ 60 current->pid, __func__, ##args); \
61} while (0) 61} while (0)
62 62
63struct rehash_entry {
64 struct task_struct *task;
65 struct list_head list;
66};
67
63/* Unified info structure. This is pointed to by both the dentry and 68/* Unified info structure. This is pointed to by both the dentry and
64 inode structures. Each file in the filesystem has an instance of this 69 inode structures. Each file in the filesystem has an instance of this
65 structure. It holds a reference to the dentry, so dentries are never 70 structure. It holds a reference to the dentry, so dentries are never
@@ -76,6 +81,7 @@ struct autofs_info {
76 81
77 struct list_head active; 82 struct list_head active;
78 int active_count; 83 int active_count;
84 struct list_head rehash_list;
79 85
80 struct list_head expiring; 86 struct list_head expiring;
81 87
@@ -98,6 +104,7 @@ struct autofs_info {
98#define AUTOFS_INF_EXPIRING (1<<0) /* dentry is in the process of expiring */ 104#define AUTOFS_INF_EXPIRING (1<<0) /* dentry is in the process of expiring */
99#define AUTOFS_INF_MOUNTPOINT (1<<1) /* mountpoint status for direct expire */ 105#define AUTOFS_INF_MOUNTPOINT (1<<1) /* mountpoint status for direct expire */
100#define AUTOFS_INF_PENDING (1<<2) /* dentry pending mount */ 106#define AUTOFS_INF_PENDING (1<<2) /* dentry pending mount */
107#define AUTOFS_INF_REHASH (1<<3) /* dentry in transit to ->lookup() */
101 108
102struct autofs_wait_queue { 109struct autofs_wait_queue {
103 wait_queue_head_t queue; 110 wait_queue_head_t queue;
diff --git a/fs/autofs4/expire.c b/fs/autofs4/expire.c
index a796c9417fb..74bc9aa6df3 100644
--- a/fs/autofs4/expire.c
+++ b/fs/autofs4/expire.c
@@ -279,6 +279,7 @@ struct dentry *autofs4_expire_direct(struct super_block *sb,
279 root->d_mounted--; 279 root->d_mounted--;
280 } 280 }
281 ino->flags |= AUTOFS_INF_EXPIRING; 281 ino->flags |= AUTOFS_INF_EXPIRING;
282 autofs4_add_expiring(root);
282 init_completion(&ino->expire_complete); 283 init_completion(&ino->expire_complete);
283 spin_unlock(&sbi->fs_lock); 284 spin_unlock(&sbi->fs_lock);
284 return root; 285 return root;
@@ -406,6 +407,7 @@ found:
406 expired, (int)expired->d_name.len, expired->d_name.name); 407 expired, (int)expired->d_name.len, expired->d_name.name);
407 ino = autofs4_dentry_ino(expired); 408 ino = autofs4_dentry_ino(expired);
408 ino->flags |= AUTOFS_INF_EXPIRING; 409 ino->flags |= AUTOFS_INF_EXPIRING;
410 autofs4_add_expiring(expired);
409 init_completion(&ino->expire_complete); 411 init_completion(&ino->expire_complete);
410 spin_unlock(&sbi->fs_lock); 412 spin_unlock(&sbi->fs_lock);
411 spin_lock(&dcache_lock); 413 spin_lock(&dcache_lock);
@@ -433,7 +435,7 @@ int autofs4_expire_wait(struct dentry *dentry)
433 435
434 DPRINTK("expire done status=%d", status); 436 DPRINTK("expire done status=%d", status);
435 437
436 if (d_unhashed(dentry)) 438 if (d_unhashed(dentry) && IS_DEADDIR(dentry->d_inode))
437 return -EAGAIN; 439 return -EAGAIN;
438 440
439 return status; 441 return status;
@@ -473,6 +475,7 @@ int autofs4_expire_run(struct super_block *sb,
473 spin_lock(&sbi->fs_lock); 475 spin_lock(&sbi->fs_lock);
474 ino = autofs4_dentry_ino(dentry); 476 ino = autofs4_dentry_ino(dentry);
475 ino->flags &= ~AUTOFS_INF_EXPIRING; 477 ino->flags &= ~AUTOFS_INF_EXPIRING;
478 autofs4_del_expiring(dentry);
476 complete_all(&ino->expire_complete); 479 complete_all(&ino->expire_complete);
477 spin_unlock(&sbi->fs_lock); 480 spin_unlock(&sbi->fs_lock);
478 481
@@ -503,6 +506,7 @@ int autofs4_do_expire_multi(struct super_block *sb, struct vfsmount *mnt,
503 ino->flags &= ~AUTOFS_INF_MOUNTPOINT; 506 ino->flags &= ~AUTOFS_INF_MOUNTPOINT;
504 } 507 }
505 ino->flags &= ~AUTOFS_INF_EXPIRING; 508 ino->flags &= ~AUTOFS_INF_EXPIRING;
509 autofs4_del_expiring(dentry);
506 complete_all(&ino->expire_complete); 510 complete_all(&ino->expire_complete);
507 spin_unlock(&sbi->fs_lock); 511 spin_unlock(&sbi->fs_lock);
508 dput(dentry); 512 dput(dentry);
diff --git a/fs/autofs4/inode.c b/fs/autofs4/inode.c
index 4670a7818ea..d0a3de24745 100644
--- a/fs/autofs4/inode.c
+++ b/fs/autofs4/inode.c
@@ -49,6 +49,7 @@ struct autofs_info *autofs4_init_ino(struct autofs_info *ino,
49 ino->dentry = NULL; 49 ino->dentry = NULL;
50 ino->size = 0; 50 ino->size = 0;
51 INIT_LIST_HEAD(&ino->active); 51 INIT_LIST_HEAD(&ino->active);
52 INIT_LIST_HEAD(&ino->rehash_list);
52 ino->active_count = 0; 53 ino->active_count = 0;
53 INIT_LIST_HEAD(&ino->expiring); 54 INIT_LIST_HEAD(&ino->expiring);
54 atomic_set(&ino->count, 0); 55 atomic_set(&ino->count, 0);
diff --git a/fs/autofs4/root.c b/fs/autofs4/root.c
index a015b49891d..30cc9ddf4b7 100644
--- a/fs/autofs4/root.c
+++ b/fs/autofs4/root.c
@@ -104,6 +104,99 @@ static void autofs4_del_active(struct dentry *dentry)
104 return; 104 return;
105} 105}
106 106
107static void autofs4_add_rehash_entry(struct autofs_info *ino,
108 struct rehash_entry *entry)
109{
110 entry->task = current;
111 INIT_LIST_HEAD(&entry->list);
112 list_add(&entry->list, &ino->rehash_list);
113 return;
114}
115
116static void autofs4_remove_rehash_entry(struct autofs_info *ino)
117{
118 struct list_head *head = &ino->rehash_list;
119 struct rehash_entry *entry;
120 list_for_each_entry(entry, head, list) {
121 if (entry->task == current) {
122 list_del(&entry->list);
123 kfree(entry);
124 break;
125 }
126 }
127 return;
128}
129
130static void autofs4_remove_rehash_entrys(struct autofs_info *ino)
131{
132 struct autofs_sb_info *sbi = ino->sbi;
133 struct rehash_entry *entry, *next;
134 struct list_head *head;
135
136 spin_lock(&sbi->fs_lock);
137 spin_lock(&sbi->lookup_lock);
138 if (!(ino->flags & AUTOFS_INF_REHASH)) {
139 spin_unlock(&sbi->lookup_lock);
140 spin_unlock(&sbi->fs_lock);
141 return;
142 }
143 ino->flags &= ~AUTOFS_INF_REHASH;
144 head = &ino->rehash_list;
145 list_for_each_entry_safe(entry, next, head, list) {
146 list_del(&entry->list);
147 kfree(entry);
148 }
149 spin_unlock(&sbi->lookup_lock);
150 spin_unlock(&sbi->fs_lock);
151 dput(ino->dentry);
152
153 return;
154}
155
156static void autofs4_revalidate_drop(struct dentry *dentry,
157 struct rehash_entry *entry)
158{
159 struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb);
160 struct autofs_info *ino = autofs4_dentry_ino(dentry);
161 /*
162 * Add to the active list so we can pick this up in
163 * ->lookup(). Also add an entry to a rehash list so
164 * we know when there are no dentrys in flight so we
165 * know when we can rehash the dentry.
166 */
167 spin_lock(&sbi->lookup_lock);
168 if (list_empty(&ino->active))
169 list_add(&ino->active, &sbi->active_list);
170 autofs4_add_rehash_entry(ino, entry);
171 spin_unlock(&sbi->lookup_lock);
172 if (!(ino->flags & AUTOFS_INF_REHASH)) {
173 ino->flags |= AUTOFS_INF_REHASH;
174 dget(dentry);
175 spin_lock(&dentry->d_lock);
176 __d_drop(dentry);
177 spin_unlock(&dentry->d_lock);
178 }
179 return;
180}
181
182static void autofs4_revalidate_rehash(struct dentry *dentry)
183{
184 struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb);
185 struct autofs_info *ino = autofs4_dentry_ino(dentry);
186 if (ino->flags & AUTOFS_INF_REHASH) {
187 spin_lock(&sbi->lookup_lock);
188 autofs4_remove_rehash_entry(ino);
189 if (list_empty(&ino->rehash_list)) {
190 spin_unlock(&sbi->lookup_lock);
191 ino->flags &= ~AUTOFS_INF_REHASH;
192 d_rehash(dentry);
193 dput(ino->dentry);
194 } else
195 spin_unlock(&sbi->lookup_lock);
196 }
197 return;
198}
199
107static unsigned int autofs4_need_mount(unsigned int flags) 200static unsigned int autofs4_need_mount(unsigned int flags)
108{ 201{
109 unsigned int res = 0; 202 unsigned int res = 0;
@@ -143,7 +236,7 @@ out:
143 return dcache_dir_open(inode, file); 236 return dcache_dir_open(inode, file);
144} 237}
145 238
146static int try_to_fill_dentry(struct dentry *dentry, int flags) 239static int try_to_fill_dentry(struct dentry *dentry)
147{ 240{
148 struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb); 241 struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb);
149 struct autofs_info *ino = autofs4_dentry_ino(dentry); 242 struct autofs_info *ino = autofs4_dentry_ino(dentry);
@@ -156,55 +249,17 @@ static int try_to_fill_dentry(struct dentry *dentry, int flags)
156 * Wait for a pending mount, triggering one if there 249 * Wait for a pending mount, triggering one if there
157 * isn't one already 250 * isn't one already
158 */ 251 */
159 if (dentry->d_inode == NULL) { 252 DPRINTK("waiting for mount name=%.*s",
160 DPRINTK("waiting for mount name=%.*s", 253 dentry->d_name.len, dentry->d_name.name);
161 dentry->d_name.len, dentry->d_name.name);
162 254
163 status = autofs4_wait(sbi, dentry, NFY_MOUNT); 255 status = autofs4_wait(sbi, dentry, NFY_MOUNT);
164 256
165 DPRINTK("mount done status=%d", status); 257 DPRINTK("mount done status=%d", status);
166
167 /* Turn this into a real negative dentry? */
168 if (status == -ENOENT) {
169 spin_lock(&sbi->fs_lock);
170 ino->flags &= ~AUTOFS_INF_PENDING;
171 spin_unlock(&sbi->fs_lock);
172 return status;
173 } else if (status) {
174 /* Return a negative dentry, but leave it "pending" */
175 return status;
176 }
177 /* Trigger mount for path component or follow link */
178 } else if (ino->flags & AUTOFS_INF_PENDING ||
179 autofs4_need_mount(flags) ||
180 current->link_count) {
181 DPRINTK("waiting for mount name=%.*s",
182 dentry->d_name.len, dentry->d_name.name);
183 258
184 spin_lock(&sbi->fs_lock); 259 /* Update expiry counter */
185 ino->flags |= AUTOFS_INF_PENDING; 260 ino->last_used = jiffies;
186 spin_unlock(&sbi->fs_lock);
187 status = autofs4_wait(sbi, dentry, NFY_MOUNT);
188 261
189 DPRINTK("mount done status=%d", status); 262 return status;
190
191 if (status) {
192 spin_lock(&sbi->fs_lock);
193 ino->flags &= ~AUTOFS_INF_PENDING;
194 spin_unlock(&sbi->fs_lock);
195 return status;
196 }
197 }
198
199 /* Initialize expiry counter after successful mount */
200 if (ino)
201 ino->last_used = jiffies;
202
203 spin_lock(&sbi->fs_lock);
204 ino->flags &= ~AUTOFS_INF_PENDING;
205 spin_unlock(&sbi->fs_lock);
206
207 return 0;
208} 263}
209 264
210/* For autofs direct mounts the follow link triggers the mount */ 265/* For autofs direct mounts the follow link triggers the mount */
@@ -258,10 +313,16 @@ static void *autofs4_follow_link(struct dentry *dentry, struct nameidata *nd)
258 */ 313 */
259 if (ino->flags & AUTOFS_INF_PENDING || 314 if (ino->flags & AUTOFS_INF_PENDING ||
260 (!d_mountpoint(dentry) && list_empty(&dentry->d_subdirs))) { 315 (!d_mountpoint(dentry) && list_empty(&dentry->d_subdirs))) {
316 ino->flags |= AUTOFS_INF_PENDING;
261 spin_unlock(&dcache_lock); 317 spin_unlock(&dcache_lock);
262 spin_unlock(&sbi->fs_lock); 318 spin_unlock(&sbi->fs_lock);
263 319
264 status = try_to_fill_dentry(dentry, 0); 320 status = try_to_fill_dentry(dentry);
321
322 spin_lock(&sbi->fs_lock);
323 ino->flags &= ~AUTOFS_INF_PENDING;
324 spin_unlock(&sbi->fs_lock);
325
265 if (status) 326 if (status)
266 goto out_error; 327 goto out_error;
267 328
@@ -300,18 +361,47 @@ static int autofs4_revalidate(struct dentry *dentry, struct nameidata *nd)
300{ 361{
301 struct inode *dir = dentry->d_parent->d_inode; 362 struct inode *dir = dentry->d_parent->d_inode;
302 struct autofs_sb_info *sbi = autofs4_sbi(dir->i_sb); 363 struct autofs_sb_info *sbi = autofs4_sbi(dir->i_sb);
303 int oz_mode = autofs4_oz_mode(sbi); 364 struct autofs_info *ino = autofs4_dentry_ino(dentry);
365 struct rehash_entry *entry;
304 int flags = nd ? nd->flags : 0; 366 int flags = nd ? nd->flags : 0;
305 int status = 1; 367 unsigned int mutex_aquired;
368
369 DPRINTK("name = %.*s oz_mode = %d",
370 dentry->d_name.len, dentry->d_name.name, oz_mode);
371
372 /* Daemon never causes a mount to trigger */
373 if (autofs4_oz_mode(sbi))
374 return 1;
375
376 entry = kmalloc(sizeof(struct rehash_entry), GFP_KERNEL);
377 if (!entry)
378 return -ENOMEM;
379
380 mutex_aquired = mutex_trylock(&dir->i_mutex);
306 381
307 /* Pending dentry */
308 spin_lock(&sbi->fs_lock); 382 spin_lock(&sbi->fs_lock);
383 spin_lock(&dcache_lock);
384 /* Pending dentry */
309 if (autofs4_ispending(dentry)) { 385 if (autofs4_ispending(dentry)) {
310 /* The daemon never causes a mount to trigger */ 386 int status;
311 spin_unlock(&sbi->fs_lock);
312 387
313 if (oz_mode) 388 /*
314 return 1; 389 * We can only unhash and send this to ->lookup() if
390 * the directory mutex is held over d_revalidate() and
391 * ->lookup(). This prevents the VFS from incorrectly
392 * seeing the dentry as non-existent.
393 */
394 ino->flags |= AUTOFS_INF_PENDING;
395 if (!mutex_aquired) {
396 autofs4_revalidate_drop(dentry, entry);
397 spin_unlock(&dcache_lock);
398 spin_unlock(&sbi->fs_lock);
399 return 0;
400 }
401 spin_unlock(&dcache_lock);
402 spin_unlock(&sbi->fs_lock);
403 mutex_unlock(&dir->i_mutex);
404 kfree(entry);
315 405
316 /* 406 /*
317 * If the directory has gone away due to an expire 407 * If the directory has gone away due to an expire
@@ -325,45 +415,82 @@ static int autofs4_revalidate(struct dentry *dentry, struct nameidata *nd)
325 * A zero status is success otherwise we have a 415 * A zero status is success otherwise we have a
326 * negative error code. 416 * negative error code.
327 */ 417 */
328 status = try_to_fill_dentry(dentry, flags); 418 status = try_to_fill_dentry(dentry);
419
420 spin_lock(&sbi->fs_lock);
421 ino->flags &= ~AUTOFS_INF_PENDING;
422 spin_unlock(&sbi->fs_lock);
423
329 if (status == 0) 424 if (status == 0)
330 return 1; 425 return 1;
331 426
332 return status; 427 return status;
333 } 428 }
334 spin_unlock(&sbi->fs_lock);
335
336 /* Negative dentry.. invalidate if "old" */
337 if (dentry->d_inode == NULL)
338 return 0;
339 429
340 /* Check for a non-mountpoint directory with no contents */ 430 /* Check for a non-mountpoint directory with no contents */
341 spin_lock(&dcache_lock);
342 if (S_ISDIR(dentry->d_inode->i_mode) && 431 if (S_ISDIR(dentry->d_inode->i_mode) &&
343 !d_mountpoint(dentry) && list_empty(&dentry->d_subdirs)) { 432 !d_mountpoint(dentry) && list_empty(&dentry->d_subdirs)) {
344 DPRINTK("dentry=%p %.*s, emptydir", 433 DPRINTK("dentry=%p %.*s, emptydir",
345 dentry, dentry->d_name.len, dentry->d_name.name); 434 dentry, dentry->d_name.len, dentry->d_name.name);
346 spin_unlock(&dcache_lock);
347 435
348 /* The daemon never causes a mount to trigger */ 436 if (autofs4_need_mount(flags) || current->link_count) {
349 if (oz_mode) 437 int status;
350 return 1;
351 438
352 /* 439 /*
353 * A zero status is success otherwise we have a 440 * We can only unhash and send this to ->lookup() if
354 * negative error code. 441 * the directory mutex is held over d_revalidate() and
355 */ 442 * ->lookup(). This prevents the VFS from incorrectly
356 status = try_to_fill_dentry(dentry, flags); 443 * seeing the dentry as non-existent.
357 if (status == 0) 444 */
358 return 1; 445 ino->flags |= AUTOFS_INF_PENDING;
446 if (!mutex_aquired) {
447 autofs4_revalidate_drop(dentry, entry);
448 spin_unlock(&dcache_lock);
449 spin_unlock(&sbi->fs_lock);
450 return 0;
451 }
452 spin_unlock(&dcache_lock);
453 spin_unlock(&sbi->fs_lock);
454 mutex_unlock(&dir->i_mutex);
455 kfree(entry);
359 456
360 return status; 457 /*
458 * A zero status is success otherwise we have a
459 * negative error code.
460 */
461 status = try_to_fill_dentry(dentry);
462
463 spin_lock(&sbi->fs_lock);
464 ino->flags &= ~AUTOFS_INF_PENDING;
465 spin_unlock(&sbi->fs_lock);
466
467 if (status == 0)
468 return 1;
469
470 return status;
471 }
361 } 472 }
362 spin_unlock(&dcache_lock); 473 spin_unlock(&dcache_lock);
474 spin_unlock(&sbi->fs_lock);
475
476 if (mutex_aquired)
477 mutex_unlock(&dir->i_mutex);
478
479 kfree(entry);
363 480
364 return 1; 481 return 1;
365} 482}
366 483
484static void autofs4_free_rehash_entrys(struct autofs_info *inf)
485{
486 struct list_head *head = &inf->rehash_list;
487 struct rehash_entry *entry, *next;
488 list_for_each_entry_safe(entry, next, head, list) {
489 list_del(&entry->list);
490 kfree(entry);
491 }
492}
493
367void autofs4_dentry_release(struct dentry *de) 494void autofs4_dentry_release(struct dentry *de)
368{ 495{
369 struct autofs_info *inf; 496 struct autofs_info *inf;
@@ -382,6 +509,8 @@ void autofs4_dentry_release(struct dentry *de)
382 list_del(&inf->active); 509 list_del(&inf->active);
383 if (!list_empty(&inf->expiring)) 510 if (!list_empty(&inf->expiring))
384 list_del(&inf->expiring); 511 list_del(&inf->expiring);
512 if (!list_empty(&inf->rehash_list))
513 autofs4_free_rehash_entrys(inf);
385 spin_unlock(&sbi->lookup_lock); 514 spin_unlock(&sbi->lookup_lock);
386 } 515 }
387 516
@@ -414,6 +543,7 @@ static struct dentry *autofs4_lookup_active(struct dentry *dentry)
414 const unsigned char *str = name->name; 543 const unsigned char *str = name->name;
415 struct list_head *p, *head; 544 struct list_head *p, *head;
416 545
546restart:
417 spin_lock(&dcache_lock); 547 spin_lock(&dcache_lock);
418 spin_lock(&sbi->lookup_lock); 548 spin_lock(&sbi->lookup_lock);
419 head = &sbi->active_list; 549 head = &sbi->active_list;
@@ -431,6 +561,19 @@ static struct dentry *autofs4_lookup_active(struct dentry *dentry)
431 if (atomic_read(&active->d_count) == 0) 561 if (atomic_read(&active->d_count) == 0)
432 goto next; 562 goto next;
433 563
564 if (active->d_inode && IS_DEADDIR(active->d_inode)) {
565 if (!list_empty(&ino->rehash_list)) {
566 dget(active);
567 spin_unlock(&active->d_lock);
568 spin_unlock(&sbi->lookup_lock);
569 spin_unlock(&dcache_lock);
570 autofs4_remove_rehash_entrys(ino);
571 dput(active);
572 goto restart;
573 }
574 goto next;
575 }
576
434 qstr = &active->d_name; 577 qstr = &active->d_name;
435 578
436 if (active->d_name.hash != hash) 579 if (active->d_name.hash != hash)
@@ -443,13 +586,11 @@ static struct dentry *autofs4_lookup_active(struct dentry *dentry)
443 if (memcmp(qstr->name, str, len)) 586 if (memcmp(qstr->name, str, len))
444 goto next; 587 goto next;
445 588
446 if (d_unhashed(active)) { 589 dget(active);
447 dget(active); 590 spin_unlock(&active->d_lock);
448 spin_unlock(&active->d_lock); 591 spin_unlock(&sbi->lookup_lock);
449 spin_unlock(&sbi->lookup_lock); 592 spin_unlock(&dcache_lock);
450 spin_unlock(&dcache_lock); 593 return active;
451 return active;
452 }
453next: 594next:
454 spin_unlock(&active->d_lock); 595 spin_unlock(&active->d_lock);
455 } 596 }
@@ -498,13 +639,11 @@ static struct dentry *autofs4_lookup_expiring(struct dentry *dentry)
498 if (memcmp(qstr->name, str, len)) 639 if (memcmp(qstr->name, str, len))
499 goto next; 640 goto next;
500 641
501 if (d_unhashed(expiring)) { 642 dget(expiring);
502 dget(expiring); 643 spin_unlock(&expiring->d_lock);
503 spin_unlock(&expiring->d_lock); 644 spin_unlock(&sbi->lookup_lock);
504 spin_unlock(&sbi->lookup_lock); 645 spin_unlock(&dcache_lock);
505 spin_unlock(&dcache_lock); 646 return expiring;
506 return expiring;
507 }
508next: 647next:
509 spin_unlock(&expiring->d_lock); 648 spin_unlock(&expiring->d_lock);
510 } 649 }
@@ -514,6 +653,48 @@ next:
514 return NULL; 653 return NULL;
515} 654}
516 655
656static struct autofs_info *init_new_dentry(struct autofs_sb_info *sbi,
657 struct dentry *dentry, int oz_mode)
658{
659 struct autofs_info *ino;
660
661 /*
662 * Mark the dentry incomplete but don't hash it. We do this
663 * to serialize our inode creation operations (symlink and
664 * mkdir) which prevents deadlock during the callback to
665 * the daemon. Subsequent user space lookups for the same
666 * dentry are placed on the wait queue while the daemon
667 * itself is allowed passage unresticted so the create
668 * operation itself can then hash the dentry. Finally,
669 * we check for the hashed dentry and return the newly
670 * hashed dentry.
671 */
672 dentry->d_op = &autofs4_root_dentry_operations;
673
674 /*
675 * And we need to ensure that the same dentry is used for
676 * all following lookup calls until it is hashed so that
677 * the dentry flags are persistent throughout the request.
678 */
679 ino = autofs4_init_ino(NULL, sbi, 0555);
680 if (!ino)
681 return ERR_PTR(-ENOMEM);
682
683 dentry->d_fsdata = ino;
684 ino->dentry = dentry;
685
686 /*
687 * Only set the mount pending flag for new dentrys not created
688 * by the daemon.
689 */
690 if (!oz_mode)
691 ino->flags |= AUTOFS_INF_PENDING;
692
693 d_instantiate(dentry, NULL);
694
695 return ino;
696}
697
517/* Lookups in the root directory */ 698/* Lookups in the root directory */
518static struct dentry *autofs4_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd) 699static struct dentry *autofs4_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd)
519{ 700{
@@ -521,6 +702,7 @@ static struct dentry *autofs4_lookup(struct inode *dir, struct dentry *dentry, s
521 struct autofs_info *ino; 702 struct autofs_info *ino;
522 struct dentry *expiring, *active; 703 struct dentry *expiring, *active;
523 int oz_mode; 704 int oz_mode;
705 int status = 0;
524 706
525 DPRINTK("name = %.*s", 707 DPRINTK("name = %.*s",
526 dentry->d_name.len, dentry->d_name.name); 708 dentry->d_name.len, dentry->d_name.name);
@@ -535,44 +717,26 @@ static struct dentry *autofs4_lookup(struct inode *dir, struct dentry *dentry, s
535 DPRINTK("pid = %u, pgrp = %u, catatonic = %d, oz_mode = %d", 717 DPRINTK("pid = %u, pgrp = %u, catatonic = %d, oz_mode = %d",
536 current->pid, task_pgrp_nr(current), sbi->catatonic, oz_mode); 718 current->pid, task_pgrp_nr(current), sbi->catatonic, oz_mode);
537 719
720 spin_lock(&sbi->fs_lock);
538 active = autofs4_lookup_active(dentry); 721 active = autofs4_lookup_active(dentry);
539 if (active) { 722 if (active) {
540 dentry = active; 723 dentry = active;
541 ino = autofs4_dentry_ino(dentry); 724 ino = autofs4_dentry_ino(dentry);
725 /* If this came from revalidate, rehash it */
726 autofs4_revalidate_rehash(dentry);
727 spin_unlock(&sbi->fs_lock);
542 } else { 728 } else {
543 /* 729 spin_unlock(&sbi->fs_lock);
544 * Mark the dentry incomplete but don't hash it. We do this 730 ino = init_new_dentry(sbi, dentry, oz_mode);
545 * to serialize our inode creation operations (symlink and 731 if (IS_ERR(ino))
546 * mkdir) which prevents deadlock during the callback to 732 return (struct dentry *) ino;
547 * the daemon. Subsequent user space lookups for the same
548 * dentry are placed on the wait queue while the daemon
549 * itself is allowed passage unresticted so the create
550 * operation itself can then hash the dentry. Finally,
551 * we check for the hashed dentry and return the newly
552 * hashed dentry.
553 */
554 dentry->d_op = &autofs4_root_dentry_operations;
555
556 /*
557 * And we need to ensure that the same dentry is used for
558 * all following lookup calls until it is hashed so that
559 * the dentry flags are persistent throughout the request.
560 */
561 ino = autofs4_init_ino(NULL, sbi, 0555);
562 if (!ino)
563 return ERR_PTR(-ENOMEM);
564
565 dentry->d_fsdata = ino;
566 ino->dentry = dentry;
567
568 autofs4_add_active(dentry);
569
570 d_instantiate(dentry, NULL);
571 } 733 }
572 734
735 autofs4_add_active(dentry);
736
573 if (!oz_mode) { 737 if (!oz_mode) {
574 mutex_unlock(&dir->i_mutex);
575 expiring = autofs4_lookup_expiring(dentry); 738 expiring = autofs4_lookup_expiring(dentry);
739 mutex_unlock(&dir->i_mutex);
576 if (expiring) { 740 if (expiring) {
577 /* 741 /*
578 * If we are racing with expire the request might not 742 * If we are racing with expire the request might not
@@ -580,23 +744,22 @@ static struct dentry *autofs4_lookup(struct inode *dir, struct dentry *dentry, s
580 * so it must have been successful, so just wait for it. 744 * so it must have been successful, so just wait for it.
581 */ 745 */
582 autofs4_expire_wait(expiring); 746 autofs4_expire_wait(expiring);
583 autofs4_del_expiring(expiring);
584 dput(expiring); 747 dput(expiring);
585 } 748 }
586 749 status = try_to_fill_dentry(dentry);
750 mutex_lock(&dir->i_mutex);
587 spin_lock(&sbi->fs_lock); 751 spin_lock(&sbi->fs_lock);
588 ino->flags |= AUTOFS_INF_PENDING; 752 ino->flags &= ~AUTOFS_INF_PENDING;
589 spin_unlock(&sbi->fs_lock); 753 spin_unlock(&sbi->fs_lock);
590 if (dentry->d_op && dentry->d_op->d_revalidate)
591 (dentry->d_op->d_revalidate)(dentry, nd);
592 mutex_lock(&dir->i_mutex);
593 } 754 }
594 755
756 autofs4_del_active(dentry);
757
595 /* 758 /*
596 * If we are still pending, check if we had to handle 759 * If we had a mount fail, check if we had to handle
597 * a signal. If so we can force a restart.. 760 * a signal. If so we can force a restart..
598 */ 761 */
599 if (ino->flags & AUTOFS_INF_PENDING) { 762 if (status) {
600 /* See if we were interrupted */ 763 /* See if we were interrupted */
601 if (signal_pending(current)) { 764 if (signal_pending(current)) {
602 sigset_t *sigset = &current->pending.signal; 765 sigset_t *sigset = &current->pending.signal;
@@ -608,43 +771,46 @@ static struct dentry *autofs4_lookup(struct inode *dir, struct dentry *dentry, s
608 return ERR_PTR(-ERESTARTNOINTR); 771 return ERR_PTR(-ERESTARTNOINTR);
609 } 772 }
610 } 773 }
611 if (!oz_mode) {
612 spin_lock(&sbi->fs_lock);
613 ino->flags &= ~AUTOFS_INF_PENDING;
614 spin_unlock(&sbi->fs_lock);
615 }
616 } 774 }
617 775
618 /* 776 /*
619 * If this dentry is unhashed, then we shouldn't honour this 777 * User space can (and has done in the past) remove and re-create
620 * lookup. Returning ENOENT here doesn't do the right thing 778 * this directory during the callback. This can leave us with an
621 * for all system calls, but it should be OK for the operations 779 * unhashed dentry, but a successful mount! So we need to
622 * we permit from an autofs. 780 * perform another cached lookup in case the dentry now exists.
623 */ 781 */
624 if (!oz_mode && d_unhashed(dentry)) { 782 if (!oz_mode && !have_submounts(dentry)) {
625 /* 783 struct dentry *new;
626 * A user space application can (and has done in the past) 784 new = d_lookup(dentry->d_parent, &dentry->d_name);
627 * remove and re-create this directory during the callback. 785 if (new) {
628 * This can leave us with an unhashed dentry, but a 786 if (active)
629 * successful mount! So we need to perform another 787 dput(active);
630 * cached lookup in case the dentry now exists. 788 return new;
631 */ 789 } else {
632 struct dentry *parent = dentry->d_parent; 790 if (!status)
633 struct dentry *new = d_lookup(parent, &dentry->d_name); 791 status = -ENOENT;
634 if (new != NULL) 792 }
635 dentry = new; 793 }
636 else
637 dentry = ERR_PTR(-ENOENT);
638 794
795 /*
796 * If we had a mount failure, return status to user space.
797 * If the mount succeeded and we used a dentry from the active queue
798 * return it.
799 */
800 if (status) {
801 dentry = ERR_PTR(status);
639 if (active) 802 if (active)
640 dput(active); 803 dput(active);
641
642 return dentry; 804 return dentry;
805 } else {
806 /*
807 * Valid successful mount, return active dentry or NULL
808 * for a new dentry.
809 */
810 if (active)
811 return active;
643 } 812 }
644 813
645 if (active)
646 return active;
647
648 return NULL; 814 return NULL;
649} 815}
650 816
@@ -668,8 +834,6 @@ static int autofs4_dir_symlink(struct inode *dir,
668 if (!ino) 834 if (!ino)
669 return -ENOMEM; 835 return -ENOMEM;
670 836
671 autofs4_del_active(dentry);
672
673 ino->size = strlen(symname); 837 ino->size = strlen(symname);
674 cp = kmalloc(ino->size + 1, GFP_KERNEL); 838 cp = kmalloc(ino->size + 1, GFP_KERNEL);
675 if (!cp) { 839 if (!cp) {
@@ -746,7 +910,6 @@ static int autofs4_dir_unlink(struct inode *dir, struct dentry *dentry)
746 dir->i_mtime = CURRENT_TIME; 910 dir->i_mtime = CURRENT_TIME;
747 911
748 spin_lock(&dcache_lock); 912 spin_lock(&dcache_lock);
749 autofs4_add_expiring(dentry);
750 spin_lock(&dentry->d_lock); 913 spin_lock(&dentry->d_lock);
751 __d_drop(dentry); 914 __d_drop(dentry);
752 spin_unlock(&dentry->d_lock); 915 spin_unlock(&dentry->d_lock);
@@ -772,7 +935,6 @@ static int autofs4_dir_rmdir(struct inode *dir, struct dentry *dentry)
772 spin_unlock(&dcache_lock); 935 spin_unlock(&dcache_lock);
773 return -ENOTEMPTY; 936 return -ENOTEMPTY;
774 } 937 }
775 autofs4_add_expiring(dentry);
776 spin_lock(&dentry->d_lock); 938 spin_lock(&dentry->d_lock);
777 __d_drop(dentry); 939 __d_drop(dentry);
778 spin_unlock(&dentry->d_lock); 940 spin_unlock(&dentry->d_lock);
@@ -810,8 +972,6 @@ static int autofs4_dir_mkdir(struct inode *dir, struct dentry *dentry, int mode)
810 if (!ino) 972 if (!ino)
811 return -ENOMEM; 973 return -ENOMEM;
812 974
813 autofs4_del_active(dentry);
814
815 inode = autofs4_get_inode(dir->i_sb, ino); 975 inode = autofs4_get_inode(dir->i_sb, ino);
816 if (!inode) { 976 if (!inode) {
817 if (!dentry->d_fsdata) 977 if (!dentry->d_fsdata)