vxfs_immed.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:4k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  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. #ident "$Id: vxfs_immed.c,v 1.10 2001/04/25 18:11:23 hch Exp hch $"
  30. /*
  31.  * Veritas filesystem driver - support for 'immed' inodes.
  32.  */
  33. #include <linux/fs.h>
  34. #include <linux/pagemap.h>
  35. #include "vxfs.h"
  36. #include "vxfs_inode.h"
  37. static int vxfs_immed_readlink(struct dentry *, char *, int);
  38. static int vxfs_immed_follow_link(struct dentry *, struct nameidata *);
  39. static int vxfs_immed_readpage(struct file *, struct page *);
  40. /*
  41.  * Inode operations for immed symlinks.
  42.  *
  43.  * Unliked all other operations we do not go through the pagecache,
  44.  * but do all work directly on the inode.
  45.  */
  46. struct inode_operations vxfs_immed_symlink_iops = {
  47. .readlink = vxfs_immed_readlink,
  48. .follow_link = vxfs_immed_follow_link,
  49. };
  50. /*
  51.  * Adress space operations for immed files and directories.
  52.  */
  53. struct address_space_operations vxfs_immed_aops = {
  54. .readpage = vxfs_immed_readpage,
  55. };
  56. /**
  57.  * vxfs_immed_readlink - read immed symlink
  58.  * @dp: dentry for the link
  59.  * @bp: output buffer
  60.  * @buflen: length of @bp
  61.  *
  62.  * Description:
  63.  *   vxfs_immed_readlink calls vfs_readlink to read the link
  64.  *   described by @dp into userspace.
  65.  *
  66.  * Returns:
  67.  *   Number of bytes successfully copied to userspace.
  68.  */
  69. static int
  70. vxfs_immed_readlink(struct dentry *dp, char *bp, int buflen)
  71. {
  72. struct vxfs_inode_info *vip = VXFS_INO(dp->d_inode);
  73. return (vfs_readlink(dp, bp, buflen, vip->vii_immed.vi_immed));
  74. }
  75. /**
  76.  * vxfs_immed_follow_link - follow immed symlink
  77.  * @dp: dentry for the link
  78.  * @np: pathname lookup data for the current path walk
  79.  *
  80.  * Description:
  81.  *   vxfs_immed_follow_link restarts the pathname lookup with
  82.  *   the data obtained from @dp.
  83.  *
  84.  * Returns:
  85.  *   Zero on success, else a negative error code.
  86.  */
  87. static int
  88. vxfs_immed_follow_link(struct dentry *dp, struct nameidata *np)
  89. {
  90. struct vxfs_inode_info *vip = VXFS_INO(dp->d_inode);
  91. return (vfs_follow_link(np, vip->vii_immed.vi_immed));
  92. }
  93. /**
  94.  * vxfs_immed_readpage - read part of an immed inode into pagecache
  95.  * @file: file context (unused)
  96.  * @page: page frame to fill in.
  97.  *
  98.  * Description:
  99.  *   vxfs_immed_readpage reads a part of the immed area of the
  100.  *   file that hosts @pp into the pagecache.
  101.  *
  102.  * Returns:
  103.  *   Zero on success, else a negative error code.
  104.  *
  105.  * Locking status:
  106.  *   @page is locked and will be unlocked.
  107.  */
  108. static int
  109. vxfs_immed_readpage(struct file *fp, struct page *pp)
  110. {
  111. struct vxfs_inode_info *vip = VXFS_INO(pp->mapping->host);
  112. u_int64_t offset = pp->index << PAGE_CACHE_SHIFT;
  113. caddr_t kaddr;
  114. kaddr = kmap(pp);
  115. memcpy(kaddr, vip->vii_immed.vi_immed + offset, PAGE_CACHE_SIZE);
  116. kunmap(pp);
  117. flush_dcache_page(pp);
  118. SetPageUptodate(pp);
  119.         UnlockPage(pp);
  120. return 0;
  121. }