diff options
| author | Jeff Garzik <jeff@garzik.org> | 2006-04-12 16:54:16 -0400 | 
|---|---|---|
| committer | Jeff Garzik <jeff@garzik.org> | 2006-04-12 16:54:16 -0400 | 
| commit | 875999c5539999f61a45620aae0c3e5fb1d2b035 (patch) | |
| tree | 4535032a8a10f5782c0aef6a620b1a624ea9f863 /fs/proc/base.c | |
| parent | 79072f38909e3d9883317238887460c39ddcc4cb (diff) | |
| parent | 26ec634c31a11a003040e10b4d650495158632fd (diff) | |
Merge branch 'upstream'
Diffstat (limited to 'fs/proc/base.c')
| -rw-r--r-- | fs/proc/base.c | 13 | 
1 files changed, 8 insertions, 5 deletions
| diff --git a/fs/proc/base.c b/fs/proc/base.c index 8f1f49ceebec..a3a3eecef689 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
| @@ -534,12 +534,15 @@ static int proc_oom_score(struct task_struct *task, char *buffer) | |||
| 534 | 534 | ||
| 535 | /* If the process being read is separated by chroot from the reading process, | 535 | /* If the process being read is separated by chroot from the reading process, | 
| 536 | * don't let the reader access the threads. | 536 | * don't let the reader access the threads. | 
| 537 | * | ||
| 538 | * note: this does dput(root) and mntput(vfsmnt) on exit. | ||
| 537 | */ | 539 | */ | 
| 538 | static int proc_check_chroot(struct dentry *root, struct vfsmount *vfsmnt) | 540 | static int proc_check_chroot(struct dentry *root, struct vfsmount *vfsmnt) | 
| 539 | { | 541 | { | 
| 540 | struct dentry *de, *base; | 542 | struct dentry *de, *base; | 
| 541 | struct vfsmount *our_vfsmnt, *mnt; | 543 | struct vfsmount *our_vfsmnt, *mnt; | 
| 542 | int res = 0; | 544 | int res = 0; | 
| 545 | |||
| 543 | read_lock(¤t->fs->lock); | 546 | read_lock(¤t->fs->lock); | 
| 544 | our_vfsmnt = mntget(current->fs->rootmnt); | 547 | our_vfsmnt = mntget(current->fs->rootmnt); | 
| 545 | base = dget(current->fs->root); | 548 | base = dget(current->fs->root); | 
| @@ -549,11 +552,11 @@ static int proc_check_chroot(struct dentry *root, struct vfsmount *vfsmnt) | |||
| 549 | de = root; | 552 | de = root; | 
| 550 | mnt = vfsmnt; | 553 | mnt = vfsmnt; | 
| 551 | 554 | ||
| 552 | while (vfsmnt != our_vfsmnt) { | 555 | while (mnt != our_vfsmnt) { | 
| 553 | if (vfsmnt == vfsmnt->mnt_parent) | 556 | if (mnt == mnt->mnt_parent) | 
| 554 | goto out; | 557 | goto out; | 
| 555 | de = vfsmnt->mnt_mountpoint; | 558 | de = mnt->mnt_mountpoint; | 
| 556 | vfsmnt = vfsmnt->mnt_parent; | 559 | mnt = mnt->mnt_parent; | 
| 557 | } | 560 | } | 
| 558 | 561 | ||
| 559 | if (!is_subdir(de, base)) | 562 | if (!is_subdir(de, base)) | 
| @@ -564,7 +567,7 @@ exit: | |||
| 564 | dput(base); | 567 | dput(base); | 
| 565 | mntput(our_vfsmnt); | 568 | mntput(our_vfsmnt); | 
| 566 | dput(root); | 569 | dput(root); | 
| 567 | mntput(mnt); | 570 | mntput(vfsmnt); | 
| 568 | return res; | 571 | return res; | 
| 569 | out: | 572 | out: | 
| 570 | spin_unlock(&vfsmount_lock); | 573 | spin_unlock(&vfsmount_lock); | 
