diff options
Diffstat (limited to 'fs/autofs4')
-rw-r--r-- | fs/autofs4/autofs_i.h | 3 | ||||
-rw-r--r-- | fs/autofs4/inode.c | 2 | ||||
-rw-r--r-- | fs/autofs4/waitq.c | 34 |
3 files changed, 39 insertions, 0 deletions
diff --git a/fs/autofs4/autofs_i.h b/fs/autofs4/autofs_i.h index ea024d8e37ed..fa76d18be082 100644 --- a/fs/autofs4/autofs_i.h +++ b/fs/autofs4/autofs_i.h | |||
@@ -63,6 +63,9 @@ struct autofs_info { | |||
63 | unsigned long last_used; | 63 | unsigned long last_used; |
64 | atomic_t count; | 64 | atomic_t count; |
65 | 65 | ||
66 | uid_t uid; | ||
67 | gid_t gid; | ||
68 | |||
66 | mode_t mode; | 69 | mode_t mode; |
67 | size_t size; | 70 | size_t size; |
68 | 71 | ||
diff --git a/fs/autofs4/inode.c b/fs/autofs4/inode.c index 7303099fcc1a..c7e65bb30ba0 100644 --- a/fs/autofs4/inode.c +++ b/fs/autofs4/inode.c | |||
@@ -53,6 +53,8 @@ struct autofs_info *autofs4_init_ino(struct autofs_info *ino, | |||
53 | atomic_set(&ino->count, 0); | 53 | atomic_set(&ino->count, 0); |
54 | } | 54 | } |
55 | 55 | ||
56 | ino->uid = 0; | ||
57 | ino->gid = 0; | ||
56 | ino->mode = mode; | 58 | ino->mode = mode; |
57 | ino->last_used = jiffies; | 59 | ino->last_used = jiffies; |
58 | 60 | ||
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) |