fix LOOKUP_FOLLOW on automount "symlinks"
Make sure that automount "symlinks" are followed regardless of LOOKUP_FOLLOW; it should have no effect on them. Cc: stable@kernel.org Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Родитель
f8b55f2510
Коммит
ac278a9c50
14
fs/namei.c
14
fs/namei.c
|
@ -822,6 +822,17 @@ fail:
|
||||||
return PTR_ERR(dentry);
|
return PTR_ERR(dentry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is a temporary kludge to deal with "automount" symlinks; proper
|
||||||
|
* solution is to trigger them on follow_mount(), so that do_lookup()
|
||||||
|
* would DTRT. To be killed before 2.6.34-final.
|
||||||
|
*/
|
||||||
|
static inline int follow_on_final(struct inode *inode, unsigned lookup_flags)
|
||||||
|
{
|
||||||
|
return inode && unlikely(inode->i_op->follow_link) &&
|
||||||
|
((lookup_flags & LOOKUP_FOLLOW) || S_ISDIR(inode->i_mode));
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Name resolution.
|
* Name resolution.
|
||||||
* This is the basic name resolution function, turning a pathname into
|
* This is the basic name resolution function, turning a pathname into
|
||||||
|
@ -942,8 +953,7 @@ last_component:
|
||||||
if (err)
|
if (err)
|
||||||
break;
|
break;
|
||||||
inode = next.dentry->d_inode;
|
inode = next.dentry->d_inode;
|
||||||
if ((lookup_flags & LOOKUP_FOLLOW)
|
if (follow_on_final(inode, lookup_flags)) {
|
||||||
&& inode && inode->i_op->follow_link) {
|
|
||||||
err = do_follow_link(&next, nd);
|
err = do_follow_link(&next, nd);
|
||||||
if (err)
|
if (err)
|
||||||
goto return_err;
|
goto return_err;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче