mirror of
https://github.com/torvalds/linux.git
synced 2024-11-24 21:21:41 +00:00
cc314eef01
This bug could cause oopses and page state corruption, because ncpfs used the generic page-cache symlink handlign functions. But those functions only work if the page cache is guaranteed to be "stable", ie a page that was installed when the symlink walk was started has to still be installed in the page cache at the end of the walk. We could have fixed ncpfs to not use the generic helper routines, but it is in many ways much cleaner to instead improve on the symlink walking helper routines so that they don't require that absolute stability. We do this by allowing "follow_link()" to return a error-pointer as a cookie, which is fed back to the cleanup "put_link()" routine. This also simplifies NFS symlink handling. Signed-off-by: Linus Torvalds <torvalds@osdl.org>
53 lines
1.3 KiB
C
53 lines
1.3 KiB
C
/*
|
|
* linux/fs/ext2/symlink.c
|
|
*
|
|
* Only fast symlinks left here - the rest is done by generic code. AV, 1999
|
|
*
|
|
* Copyright (C) 1992, 1993, 1994, 1995
|
|
* Remy Card (card@masi.ibp.fr)
|
|
* Laboratoire MASI - Institut Blaise Pascal
|
|
* Universite Pierre et Marie Curie (Paris VI)
|
|
*
|
|
* from
|
|
*
|
|
* linux/fs/minix/symlink.c
|
|
*
|
|
* Copyright (C) 1991, 1992 Linus Torvalds
|
|
*
|
|
* ext2 symlink handling code
|
|
*/
|
|
|
|
#include "ext2.h"
|
|
#include "xattr.h"
|
|
#include <linux/namei.h>
|
|
|
|
static void *ext2_follow_link(struct dentry *dentry, struct nameidata *nd)
|
|
{
|
|
struct ext2_inode_info *ei = EXT2_I(dentry->d_inode);
|
|
nd_set_link(nd, (char *)ei->i_data);
|
|
return NULL;
|
|
}
|
|
|
|
struct inode_operations ext2_symlink_inode_operations = {
|
|
.readlink = generic_readlink,
|
|
.follow_link = page_follow_link_light,
|
|
.put_link = page_put_link,
|
|
#ifdef CONFIG_EXT2_FS_XATTR
|
|
.setxattr = generic_setxattr,
|
|
.getxattr = generic_getxattr,
|
|
.listxattr = ext2_listxattr,
|
|
.removexattr = generic_removexattr,
|
|
#endif
|
|
};
|
|
|
|
struct inode_operations ext2_fast_symlink_inode_operations = {
|
|
.readlink = generic_readlink,
|
|
.follow_link = ext2_follow_link,
|
|
#ifdef CONFIG_EXT2_FS_XATTR
|
|
.setxattr = generic_setxattr,
|
|
.getxattr = generic_getxattr,
|
|
.listxattr = ext2_listxattr,
|
|
.removexattr = generic_removexattr,
|
|
#endif
|
|
};
|