1/* 2 * linux/fs/nfs/symlink.c 3 * 4 * Copyright (C) 1992 Rick Sladkey 5 * 6 * Optimization changes Copyright (C) 1994 Florian La Roche 7 * 8 * Jun 7 1999, cache symlink lookups in the page cache. -DaveM 9 * 10 * nfs symlink handling code 11 */ 12 13#include <linux/time.h> 14#include <linux/errno.h> 15#include <linux/sunrpc/clnt.h> 16#include <linux/nfs.h> 17#include <linux/nfs2.h> 18#include <linux/nfs_fs.h> 19#include <linux/pagemap.h> 20#include <linux/stat.h> 21#include <linux/mm.h> 22#include <linux/string.h> 23 24/* Symlink caching in the page cache is even more simplistic 25 * and straight-forward than readdir caching. 26 */ 27 28static int nfs_symlink_filler(struct inode *inode, struct page *page) 29{ 30 int error; 31 32 error = NFS_PROTO(inode)->readlink(inode, page, 0, PAGE_SIZE); 33 if (error < 0) 34 goto error; 35 SetPageUptodate(page); 36 unlock_page(page); 37 return 0; 38 39error: 40 SetPageError(page); 41 unlock_page(page); 42 return -EIO; 43} 44 45static const char *nfs_follow_link(struct dentry *dentry, void **cookie) 46{ 47 struct inode *inode = d_inode(dentry); 48 struct page *page; 49 void *err; 50 51 err = ERR_PTR(nfs_revalidate_mapping(inode, inode->i_mapping)); 52 if (err) 53 return err; 54 page = read_cache_page(&inode->i_data, 0, 55 (filler_t *)nfs_symlink_filler, inode); 56 if (IS_ERR(page)) 57 return ERR_CAST(page); 58 *cookie = page; 59 return kmap(page); 60} 61 62/* 63 * symlinks can't do much... 64 */ 65const struct inode_operations nfs_symlink_inode_operations = { 66 .readlink = generic_readlink, 67 .follow_link = nfs_follow_link, 68 .put_link = page_put_link, 69 .getattr = nfs_getattr, 70 .setattr = nfs_setattr, 71}; 72