1*0b1e987cSChristoph Hellwig // SPDX-License-Identifier: GPL-2.0-only 21da177e4SLinus Torvalds /* 31da177e4SLinus Torvalds * Copyright (c) 2000-2001 Christoph Hellwig. 41da177e4SLinus Torvalds */ 51da177e4SLinus Torvalds 61da177e4SLinus Torvalds /* 71da177e4SLinus Torvalds * Veritas filesystem driver - support for 'immed' inodes. 81da177e4SLinus Torvalds */ 91da177e4SLinus Torvalds #include <linux/fs.h> 101da177e4SLinus Torvalds #include <linux/pagemap.h> 111da177e4SLinus Torvalds 121da177e4SLinus Torvalds #include "vxfs.h" 138b1919a1SAdrian Bunk #include "vxfs_extern.h" 141da177e4SLinus Torvalds #include "vxfs_inode.h" 151da177e4SLinus Torvalds 161da177e4SLinus Torvalds 171da177e4SLinus Torvalds static int vxfs_immed_readpage(struct file *, struct page *); 181da177e4SLinus Torvalds 191da177e4SLinus Torvalds /* 20c78bad11SJoe Perches * Address space operations for immed files and directories. 211da177e4SLinus Torvalds */ 22f5e54d6eSChristoph Hellwig const struct address_space_operations vxfs_immed_aops = { 231da177e4SLinus Torvalds .readpage = vxfs_immed_readpage, 241da177e4SLinus Torvalds }; 251da177e4SLinus Torvalds 261da177e4SLinus Torvalds /** 271da177e4SLinus Torvalds * vxfs_immed_readpage - read part of an immed inode into pagecache 281da177e4SLinus Torvalds * @file: file context (unused) 291da177e4SLinus Torvalds * @page: page frame to fill in. 301da177e4SLinus Torvalds * 311da177e4SLinus Torvalds * Description: 321da177e4SLinus Torvalds * vxfs_immed_readpage reads a part of the immed area of the 331da177e4SLinus Torvalds * file that hosts @pp into the pagecache. 341da177e4SLinus Torvalds * 351da177e4SLinus Torvalds * Returns: 361da177e4SLinus Torvalds * Zero on success, else a negative error code. 371da177e4SLinus Torvalds * 381da177e4SLinus Torvalds * Locking status: 391da177e4SLinus Torvalds * @page is locked and will be unlocked. 401da177e4SLinus Torvalds */ 411da177e4SLinus Torvalds static int 421da177e4SLinus Torvalds vxfs_immed_readpage(struct file *fp, struct page *pp) 431da177e4SLinus Torvalds { 441da177e4SLinus Torvalds struct vxfs_inode_info *vip = VXFS_INO(pp->mapping->host); 4509cbfeafSKirill A. Shutemov u_int64_t offset = (u_int64_t)pp->index << PAGE_SHIFT; 461da177e4SLinus Torvalds caddr_t kaddr; 471da177e4SLinus Torvalds 481da177e4SLinus Torvalds kaddr = kmap(pp); 4909cbfeafSKirill A. Shutemov memcpy(kaddr, vip->vii_immed.vi_immed + offset, PAGE_SIZE); 501da177e4SLinus Torvalds kunmap(pp); 511da177e4SLinus Torvalds 521da177e4SLinus Torvalds flush_dcache_page(pp); 531da177e4SLinus Torvalds SetPageUptodate(pp); 541da177e4SLinus Torvalds unlock_page(pp); 551da177e4SLinus Torvalds 561da177e4SLinus Torvalds return 0; 571da177e4SLinus Torvalds } 58