xref: /openbmc/linux/fs/freevxfs/vxfs_immed.c (revision 0b1e987c56640f6b3e2e39db973e823ce1d01417)
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