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 28 static 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 39 error: 40 SetPageError(page); 41 unlock_page(page); 42 return -EIO; 43 } 44 45 static 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 */ 65 const 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