diff options
| author | Ian Kent <raven@themaw.net> | 2008-10-16 01:02:52 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-10-16 14:21:39 -0400 |
| commit | c0f54d3e54fd7ac6723b2125d881f1b25d21ed16 (patch) | |
| tree | 3215eeae82b4c81094227b78ad668943c69b46e5 | |
| parent | bb979d7fc360bc37cbaff43a6fafceb897cb5e47 (diff) | |
autofs4: track uid and gid of last mount requester
Track the uid and gid of the last process to request a mount for on an
autofs dentry.
[akpm@linux-foundation.org: fix tpyo in comment]
Signed-off-by: Ian Kent <raven@themaw.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.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) |
