diff options
Diffstat (limited to 'fs/autofs4/waitq.c')
-rw-r--r-- | fs/autofs4/waitq.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/fs/autofs4/waitq.c b/fs/autofs4/waitq.c index 6d87bb156326..4b67c2a2d77c 100644 --- a/fs/autofs4/waitq.c +++ b/fs/autofs4/waitq.c | |||
@@ -457,6 +457,40 @@ int autofs4_wait(struct autofs_sb_info *sbi, struct dentry *dentry, | |||
457 | 457 | ||
458 | status = wq->status; | 458 | status = wq->status; |
459 | 459 | ||
460 | /* | ||
461 | * For direct and offset mounts we need to track the requester's | ||
462 | * uid and gid in the dentry info struct. This is so it can be | ||
463 | * supplied, on request, by the misc device ioctl interface. | ||
464 | * This is needed during daemon resatart when reconnecting | ||
465 | * to existing, active, autofs mounts. The uid and gid (and | ||
466 | * related string values) may be used for macro substitution | ||
467 | * in autofs mount maps. | ||
468 | */ | ||
469 | if (!status) { | ||
470 | struct autofs_info *ino; | ||
471 | struct dentry *de = NULL; | ||
472 | |||
473 | /* direct mount or browsable map */ | ||
474 | ino = autofs4_dentry_ino(dentry); | ||
475 | if (!ino) { | ||
476 | /* If not lookup actual dentry used */ | ||
477 | de = d_lookup(dentry->d_parent, &dentry->d_name); | ||
478 | if (de) | ||
479 | ino = autofs4_dentry_ino(de); | ||
480 | } | ||
481 | |||
482 | /* Set mount requester */ | ||
483 | if (ino) { | ||
484 | spin_lock(&sbi->fs_lock); | ||
485 | ino->uid = wq->uid; | ||
486 | ino->gid = wq->gid; | ||
487 | spin_unlock(&sbi->fs_lock); | ||
488 | } | ||
489 | |||
490 | if (de) | ||
491 | dput(de); | ||
492 | } | ||
493 | |||
460 | /* Are we the last process to need status? */ | 494 | /* Are we the last process to need status? */ |
461 | mutex_lock(&sbi->wq_mutex); | 495 | mutex_lock(&sbi->wq_mutex); |
462 | if (!--wq->wait_ctr) | 496 | if (!--wq->wait_ctr) |