diff options
author | Al Viro <viro@www.linux.org.uk> | 2005-06-06 13:36:06 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-06-06 14:42:26 -0700 |
commit | e13b210f6f7bdc44dfee0a9bbd633a32db0d6333 (patch) | |
tree | f957ec2fc24f8a9eb84dcffe76341262c1acedf0 /fs/buffer.c | |
parent | 463ffb2e9d39c2a3fd8c3c1d4a34e01f2078f972 (diff) | |
download | blackbird-op-linux-e13b210f6f7bdc44dfee0a9bbd633a32db0d6333.tar.gz blackbird-op-linux-e13b210f6f7bdc44dfee0a9bbd633a32db0d6333.zip |
[PATCH] namei fixes (10/19)
In open_namei(), __follow_down() loop turned into __follow_mount().
Instead of
if we are on a mountpoint dentry
if O_NOFOLLOW checks fail
drop path.dentry
drop nd
return
do equivalent of follow_mount(&path.mnt, &path.dentry)
nd->mnt = path.mnt
we do
if __follow_mount(path) had, indeed, traversed mountpoint
/* now both nd->mnt and path.mnt are pinned down */
if O_NOFOLLOW checks fail
drop path.dentry
drop path.mnt
drop nd
return
mntput(nd->mnt)
nd->mnt = path.mnt
Now __follow_down() can be folded into follow_down() - no other callers left.
We need to reorder dput()/mntput() there - same problem as in follow_mount().
Equivalent transformation + fix for a bug in O_NOFOLLOW handling - we used to
get -ELOOP if we had the same fs mounted on /foo and /bar, had something bound
on /bar/baz and tried to open /foo/baz with O_NOFOLLOW. And fix of
too-early-mntput() race in follow_down()
Signed-off-by: Al Viro <viro@parcelfarce.linux.theplanet.co.uk>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'fs/buffer.c')
0 files changed, 0 insertions, 0 deletions