linux/fs/freevxfs/vxfs_immed.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2000-2001 Christoph Hellwig.
   3 * All rights reserved.
   4 *
   5 * Redistribution and use in source and binary forms, with or without
   6 * modification, are permitted provided that the following conditions
   7 * are met:
   8 * 1. Redistributions of source code must retain the above copyright
   9 *    notice, this list of conditions, and the following disclaimer,
  10 *    without modification.
  11 * 2. The name of the author may not be used to endorse or promote products
  12 *    derived from this software without specific prior written permission.
  13 *
  14 * Alternatively, this software may be distributed under the terms of the
  15 * GNU General Public License ("GPL").
  16 *
  17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
  18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
  21 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  27 * SUCH DAMAGE.
  28 */
  29
  30/*
  31 * Veritas filesystem driver - support for 'immed' inodes.
  32 */
  33#include <linux/fs.h>
  34#include <linux/pagemap.h>
  35#include <linux/namei.h>
  36
  37#include "vxfs.h"
  38#include "vxfs_inode.h"
  39
  40
  41static void *   vxfs_immed_follow_link(struct dentry *, struct nameidata *);
  42
  43static int      vxfs_immed_readpage(struct file *, struct page *);
  44
  45/*
  46 * Inode operations for immed symlinks.
  47 *
  48 * Unliked all other operations we do not go through the pagecache,
  49 * but do all work directly on the inode.
  50 */
  51const struct inode_operations vxfs_immed_symlink_iops = {
  52        .readlink =             generic_readlink,
  53        .follow_link =          vxfs_immed_follow_link,
  54};
  55
  56/*
  57 * Adress space operations for immed files and directories.
  58 */
  59const struct address_space_operations vxfs_immed_aops = {
  60        .readpage =             vxfs_immed_readpage,
  61};
  62
  63/**
  64 * vxfs_immed_follow_link - follow immed symlink
  65 * @dp:         dentry for the link
  66 * @np:         pathname lookup data for the current path walk
  67 *
  68 * Description:
  69 *   vxfs_immed_follow_link restarts the pathname lookup with
  70 *   the data obtained from @dp.
  71 *
  72 * Returns:
  73 *   Zero on success, else a negative error code.
  74 */
  75static void *
  76vxfs_immed_follow_link(struct dentry *dp, struct nameidata *np)
  77{
  78        struct vxfs_inode_info          *vip = VXFS_INO(dp->d_inode);
  79        nd_set_link(np, vip->vii_immed.vi_immed);
  80        return NULL;
  81}
  82
  83/**
  84 * vxfs_immed_readpage - read part of an immed inode into pagecache
  85 * @file:       file context (unused)
  86 * @page:       page frame to fill in.
  87 *
  88 * Description:
  89 *   vxfs_immed_readpage reads a part of the immed area of the
  90 *   file that hosts @pp into the pagecache.
  91 *
  92 * Returns:
  93 *   Zero on success, else a negative error code.
  94 *
  95 * Locking status:
  96 *   @page is locked and will be unlocked.
  97 */
  98static int
  99vxfs_immed_readpage(struct file *fp, struct page *pp)
 100{
 101        struct vxfs_inode_info  *vip = VXFS_INO(pp->mapping->host);
 102        u_int64_t       offset = (u_int64_t)pp->index << PAGE_CACHE_SHIFT;
 103        caddr_t         kaddr;
 104
 105        kaddr = kmap(pp);
 106        memcpy(kaddr, vip->vii_immed.vi_immed + offset, PAGE_CACHE_SIZE);
 107        kunmap(pp);
 108        
 109        flush_dcache_page(pp);
 110        SetPageUptodate(pp);
 111        unlock_page(pp);
 112
 113        return 0;
 114}
 115