blob: bfc780c682fb8b0fdd2301398263964fe07f69a7 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
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>
Linus Torvalds1da177e2005-04-16 15:20:36 -070035
36#include "vxfs.h"
Adrian Bunk8b1919a2008-04-29 00:58:54 -070037#include "vxfs_extern.h"
Linus Torvalds1da177e2005-04-16 15:20:36 -070038#include "vxfs_inode.h"
39
40
Linus Torvalds1da177e2005-04-16 15:20:36 -070041static int vxfs_immed_readpage(struct file *, struct page *);
42
43/*
Joe Perchesc78bad12008-02-03 17:33:42 +020044 * Address space operations for immed files and directories.
Linus Torvalds1da177e2005-04-16 15:20:36 -070045 */
Christoph Hellwigf5e54d62006-06-28 04:26:44 -070046const struct address_space_operations vxfs_immed_aops = {
Linus Torvalds1da177e2005-04-16 15:20:36 -070047 .readpage = vxfs_immed_readpage,
48};
49
50/**
Linus Torvalds1da177e2005-04-16 15:20:36 -070051 * vxfs_immed_readpage - read part of an immed inode into pagecache
52 * @file: file context (unused)
53 * @page: page frame to fill in.
54 *
55 * Description:
56 * vxfs_immed_readpage reads a part of the immed area of the
57 * file that hosts @pp into the pagecache.
58 *
59 * Returns:
60 * Zero on success, else a negative error code.
61 *
62 * Locking status:
63 * @page is locked and will be unlocked.
64 */
65static int
66vxfs_immed_readpage(struct file *fp, struct page *pp)
67{
68 struct vxfs_inode_info *vip = VXFS_INO(pp->mapping->host);
Kirill A. Shutemov09cbfea2016-04-01 15:29:47 +030069 u_int64_t offset = (u_int64_t)pp->index << PAGE_SHIFT;
Andrew Morton54b21a72006-01-08 01:03:05 -080070 caddr_t kaddr;
Linus Torvalds1da177e2005-04-16 15:20:36 -070071
72 kaddr = kmap(pp);
Kirill A. Shutemov09cbfea2016-04-01 15:29:47 +030073 memcpy(kaddr, vip->vii_immed.vi_immed + offset, PAGE_SIZE);
Linus Torvalds1da177e2005-04-16 15:20:36 -070074 kunmap(pp);
75
76 flush_dcache_page(pp);
77 SetPageUptodate(pp);
78 unlock_page(pp);
79
80 return 0;
81}