linux/fs/nfs/symlink.c
<<
>>
Prefs
   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