linux/fs/ocfs2/symlink.c
<<
>>
Prefs
   1/*
   2 *  linux/cluster/ssi/cfs/symlink.c
   3 *
   4 *      This program is free software; you can redistribute it and/or
   5 *      modify it under the terms of the GNU General Public License as
   6 *      published by the Free Software Foundation; either version 2 of
   7 *      the License, or (at your option) any later version.
   8 *
   9 *      This program is distributed in the hope that it will be useful,
  10 *      but WITHOUT ANY WARRANTY; without even the implied warranty of
  11 *      MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE
  12 *      or NON INFRINGEMENT.  See the GNU General Public License for more
  13 *      details.
  14 *
  15 *      You should have received a copy of the GNU General Public License
  16 *      along with this program; if not, write to the Free Software
  17 *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18 *
  19 *      Questions/Comments/Bugfixes to ssic-linux-devel@lists.sourceforge.net
  20 *
  21 *  Copyright (C) 1992  Rick Sladkey
  22 *
  23 *  Optimization changes Copyright (C) 1994 Florian La Roche
  24 *
  25 *  Jun 7 1999, cache symlink lookups in the page cache.  -DaveM
  26 *
  27 *  Portions Copyright (C) 2001 Compaq Computer Corporation
  28 *
  29 *  ocfs2 symlink handling code.
  30 *
  31 *  Copyright (C) 2004, 2005 Oracle.
  32 *
  33 */
  34
  35#include <linux/fs.h>
  36#include <linux/types.h>
  37#include <linux/slab.h>
  38#include <linux/pagemap.h>
  39#include <linux/namei.h>
  40
  41#include <cluster/masklog.h>
  42
  43#include "ocfs2.h"
  44
  45#include "alloc.h"
  46#include "file.h"
  47#include "inode.h"
  48#include "journal.h"
  49#include "symlink.h"
  50#include "xattr.h"
  51
  52#include "buffer_head_io.h"
  53
  54
  55static int ocfs2_fast_symlink_readpage(struct file *unused, struct page *page)
  56{
  57        struct inode *inode = page->mapping->host;
  58        struct buffer_head *bh = NULL;
  59        int status = ocfs2_read_inode_block(inode, &bh);
  60        struct ocfs2_dinode *fe;
  61        const char *link;
  62        void *kaddr;
  63        size_t len;
  64
  65        if (status < 0) {
  66                mlog_errno(status);
  67                return status;
  68        }
  69
  70        fe = (struct ocfs2_dinode *) bh->b_data;
  71        link = (char *) fe->id2.i_symlink;
  72        /* will be less than a page size */
  73        len = strnlen(link, ocfs2_fast_symlink_chars(inode->i_sb));
  74        kaddr = kmap_atomic(page);
  75        memcpy(kaddr, link, len + 1);
  76        kunmap_atomic(kaddr);
  77        SetPageUptodate(page);
  78        unlock_page(page);
  79        brelse(bh);
  80        return 0;
  81}
  82
  83const struct address_space_operations ocfs2_fast_symlink_aops = {
  84        .readpage               = ocfs2_fast_symlink_readpage,
  85};
  86
  87const struct inode_operations ocfs2_symlink_inode_operations = {
  88        .get_link       = page_get_link,
  89        .getattr        = ocfs2_getattr,
  90        .setattr        = ocfs2_setattr,
  91        .listxattr      = ocfs2_listxattr,
  92        .fiemap         = ocfs2_fiemap,
  93};
  94