2005-04-17 02:20:36 +04:00
/*
* linux / fs / nfs / symlink . c
*
* Copyright ( C ) 1992 Rick Sladkey
*
* Optimization changes Copyright ( C ) 1994 Florian La Roche
*
* Jun 7 1999 , cache symlink lookups in the page cache . - DaveM
*
* nfs symlink handling code
*/
# include <linux/time.h>
# include <linux/errno.h>
# include <linux/sunrpc/clnt.h>
# include <linux/nfs.h>
# include <linux/nfs2.h>
# include <linux/nfs_fs.h>
# include <linux/pagemap.h>
# include <linux/stat.h>
# include <linux/mm.h>
# include <linux/string.h>
/* Symlink caching in the page cache is even more simplistic
* and straight - forward than readdir caching .
*/
static int nfs_symlink_filler ( struct inode * inode , struct page * page )
{
int error ;
2005-08-20 05:02:56 +04:00
error = NFS_PROTO ( inode ) - > readlink ( inode , page , 0 , PAGE_SIZE ) ;
2005-04-17 02:20:36 +04:00
if ( error < 0 )
goto error ;
SetPageUptodate ( page ) ;
unlock_page ( page ) ;
return 0 ;
error :
SetPageError ( page ) ;
unlock_page ( page ) ;
return - EIO ;
}
2015-05-02 20:37:52 +03:00
static const char * nfs_follow_link ( struct dentry * dentry , void * * cookie )
2005-04-17 02:20:36 +04:00
{
2015-03-18 01:25:59 +03:00
struct inode * inode = d_inode ( dentry ) ;
2005-04-17 02:20:36 +04:00
struct page * page ;
2007-01-24 22:54:55 +03:00
void * err ;
2010-02-20 04:03:30 +03:00
err = ERR_PTR ( nfs_revalidate_mapping ( inode , inode - > i_mapping ) ) ;
2005-04-17 02:20:36 +04:00
if ( err )
2015-05-02 20:32:22 +03:00
return err ;
2005-04-17 02:20:36 +04:00
page = read_cache_page ( & inode - > i_data , 0 ,
( filler_t * ) nfs_symlink_filler , inode ) ;
2015-05-02 20:32:22 +03:00
if ( IS_ERR ( page ) )
return ERR_CAST ( page ) ;
* cookie = page ;
return kmap ( page ) ;
2005-04-17 02:20:36 +04:00
}
/*
* symlinks can ' t do much . . .
*/
2007-02-12 11:55:39 +03:00
const struct inode_operations nfs_symlink_inode_operations = {
2005-04-17 02:20:36 +04:00
. readlink = generic_readlink ,
. follow_link = nfs_follow_link ,
2006-06-25 13:41:28 +04:00
. put_link = page_put_link ,
2005-04-17 02:20:36 +04:00
. getattr = nfs_getattr ,
. setattr = nfs_setattr ,
} ;