153 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * Copyright (c) 2000-2001 Christoph Hellwig.4 */5 6/*7 * Veritas filesystem driver - shared subroutines.8 */9#include <linux/fs.h>10#include <linux/buffer_head.h>11#include <linux/kernel.h>12#include <linux/pagemap.h>13 14#include "vxfs_extern.h"15 16 17static int vxfs_read_folio(struct file *, struct folio *);18static sector_t vxfs_bmap(struct address_space *, sector_t);19 20const struct address_space_operations vxfs_aops = {21 .read_folio = vxfs_read_folio,22 .bmap = vxfs_bmap,23};24 25inline void26vxfs_put_page(struct page *pp)27{28 kunmap(pp);29 put_page(pp);30}31 32/**33 * vxfs_get_page - read a page into memory.34 * @mapping: mapping to read from35 * @n: page number36 *37 * Description:38 * vxfs_get_page reads the @n th page of @ip into the pagecache.39 *40 * Returns:41 * The wanted page on success, else a NULL pointer.42 */43struct page *44vxfs_get_page(struct address_space *mapping, u_long n)45{46 struct page * pp;47 48 pp = read_mapping_page(mapping, n, NULL);49 50 if (!IS_ERR(pp)) {51 kmap(pp);52 /** if (!PageChecked(pp)) **/53 /** vxfs_check_page(pp); **/54 }55 56 return (pp);57}58 59/**60 * vxfs_bread - read buffer for a give inode,block tuple61 * @ip: inode62 * @block: logical block63 *64 * Description:65 * The vxfs_bread function reads block no @block of66 * @ip into the buffercache.67 *68 * Returns:69 * The resulting &struct buffer_head.70 */71struct buffer_head *72vxfs_bread(struct inode *ip, int block)73{74 struct buffer_head *bp;75 daddr_t pblock;76 77 pblock = vxfs_bmap1(ip, block);78 bp = sb_bread(ip->i_sb, pblock);79 80 return (bp);81}82 83/**84 * vxfs_getblk - locate buffer for given inode,block tuple85 * @ip: inode86 * @iblock: logical block87 * @bp: buffer skeleton88 * @create: %TRUE if blocks may be newly allocated.89 *90 * Description:91 * The vxfs_getblk function fills @bp with the right physical92 * block and device number to perform a lowlevel read/write on93 * it.94 *95 * Returns:96 * Zero on success, else a negativ error code (-EIO).97 */98static int99vxfs_getblk(struct inode *ip, sector_t iblock,100 struct buffer_head *bp, int create)101{102 daddr_t pblock;103 104 pblock = vxfs_bmap1(ip, iblock);105 if (pblock != 0) {106 map_bh(bp, ip->i_sb, pblock);107 return 0;108 }109 110 return -EIO;111}112 113/**114 * vxfs_read_folio - read one page synchronously into the pagecache115 * @file: file context (unused)116 * @folio: folio to fill in.117 *118 * Description:119 * The vxfs_read_folio routine reads @folio synchronously into the120 * pagecache.121 *122 * Returns:123 * Zero on success, else a negative error code.124 *125 * Locking status:126 * @folio is locked and will be unlocked.127 */128static int vxfs_read_folio(struct file *file, struct folio *folio)129{130 return block_read_full_folio(folio, vxfs_getblk);131}132 133/**134 * vxfs_bmap - perform logical to physical block mapping135 * @mapping: logical to physical mapping to use136 * @block: logical block (relative to @mapping).137 *138 * Description:139 * Vxfs_bmap find out the corresponding phsical block to the140 * @mapping, @block pair.141 *142 * Returns:143 * Physical block number on success, else Zero.144 *145 * Locking status:146 * We are under the bkl.147 */148static sector_t149vxfs_bmap(struct address_space *mapping, sector_t block)150{151 return generic_block_bmap(mapping, block, vxfs_getblk);152}153