Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2)  * Copyright (c) 2000-2001 Christoph Hellwig.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  * Copyright (c) 2016 Krzysztof Blaszkowski
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  * All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  * Redistribution and use in source and binary forms, with or without
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7)  * modification, are permitted provided that the following conditions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8)  * are met:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9)  * 1. Redistributions of source code must retain the above copyright
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10)  *    notice, this list of conditions, and the following disclaimer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11)  *    without modification.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12)  * 2. The name of the author may not be used to endorse or promote products
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13)  *    derived from this software without specific prior written permission.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15)  * Alternatively, this software may be distributed under the terms of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16)  * GNU General Public License ("GPL").
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18)  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19)  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20)  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21)  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22)  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23)  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24)  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25)  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26)  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27)  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28)  * SUCH DAMAGE.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32)  * Veritas filesystem driver - inode routines.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) #include <linux/fs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) #include <linux/buffer_head.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) #include <linux/pagemap.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) #include <linux/namei.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) #include "vxfs.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) #include "vxfs_inode.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) #include "vxfs_extern.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) #ifdef DIAGNOSTIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48)  * Dump inode contents (partially).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) vxfs_dumpi(struct vxfs_inode_info *vip, ino_t ino)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 	printk(KERN_DEBUG "\n\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 	if (ino)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 		printk(KERN_DEBUG "dumping vxfs inode %ld\n", ino);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 		printk(KERN_DEBUG "dumping unknown vxfs inode\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 	printk(KERN_DEBUG "---------------------------\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 	printk(KERN_DEBUG "mode is %x\n", vip->vii_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 	printk(KERN_DEBUG "nlink:%u, uid:%u, gid:%u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 			vip->vii_nlink, vip->vii_uid, vip->vii_gid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 	printk(KERN_DEBUG "size:%Lx, blocks:%u\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 			vip->vii_size, vip->vii_blocks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 	printk(KERN_DEBUG "orgtype:%u\n", vip->vii_orgtype);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70)  * vxfs_transmod - mode for a VxFS inode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71)  * @vip:	VxFS inode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73)  * Description:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74)  *  vxfs_transmod returns a Linux mode_t for a given
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75)  *  VxFS inode structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) static __inline__ umode_t
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) vxfs_transmod(struct vxfs_inode_info *vip)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 	umode_t			ret = vip->vii_mode & ~VXFS_TYPE_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 	if (VXFS_ISFIFO(vip))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 		ret |= S_IFIFO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 	if (VXFS_ISCHR(vip))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 		ret |= S_IFCHR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 	if (VXFS_ISDIR(vip))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 		ret |= S_IFDIR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 	if (VXFS_ISBLK(vip))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 		ret |= S_IFBLK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 	if (VXFS_ISLNK(vip))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 		ret |= S_IFLNK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 	if (VXFS_ISREG(vip))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 		ret |= S_IFREG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 	if (VXFS_ISSOC(vip))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 		ret |= S_IFSOCK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 	return (ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) static inline void dip2vip_cpy(struct vxfs_sb_info *sbi,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 		struct vxfs_inode_info *vip, struct vxfs_dinode *dip)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 	struct inode *inode = &vip->vfs_inode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 	vip->vii_mode = fs32_to_cpu(sbi, dip->vdi_mode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 	vip->vii_nlink = fs32_to_cpu(sbi, dip->vdi_nlink);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 	vip->vii_uid = fs32_to_cpu(sbi, dip->vdi_uid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 	vip->vii_gid = fs32_to_cpu(sbi, dip->vdi_gid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 	vip->vii_size = fs64_to_cpu(sbi, dip->vdi_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 	vip->vii_atime = fs32_to_cpu(sbi, dip->vdi_atime);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 	vip->vii_autime = fs32_to_cpu(sbi, dip->vdi_autime);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 	vip->vii_mtime = fs32_to_cpu(sbi, dip->vdi_mtime);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 	vip->vii_mutime = fs32_to_cpu(sbi, dip->vdi_mutime);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 	vip->vii_ctime = fs32_to_cpu(sbi, dip->vdi_ctime);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 	vip->vii_cutime = fs32_to_cpu(sbi, dip->vdi_cutime);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 	vip->vii_orgtype = dip->vdi_orgtype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 	vip->vii_blocks = fs32_to_cpu(sbi, dip->vdi_blocks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 	vip->vii_gen = fs32_to_cpu(sbi, dip->vdi_gen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 	if (VXFS_ISDIR(vip))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 		vip->vii_dotdot = fs32_to_cpu(sbi, dip->vdi_dotdot);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 	else if (!VXFS_ISREG(vip) && !VXFS_ISLNK(vip))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 		vip->vii_rdev = fs32_to_cpu(sbi, dip->vdi_rdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 	/* don't endian swap the fields that differ by orgtype */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 	memcpy(&vip->vii_org, &dip->vdi_org, sizeof(vip->vii_org));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 	inode->i_mode = vxfs_transmod(vip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 	i_uid_write(inode, (uid_t)vip->vii_uid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 	i_gid_write(inode, (gid_t)vip->vii_gid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 	set_nlink(inode, vip->vii_nlink);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 	inode->i_size = vip->vii_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 	inode->i_atime.tv_sec = vip->vii_atime;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 	inode->i_ctime.tv_sec = vip->vii_ctime;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 	inode->i_mtime.tv_sec = vip->vii_mtime;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 	inode->i_atime.tv_nsec = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 	inode->i_ctime.tv_nsec = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 	inode->i_mtime.tv_nsec = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 	inode->i_blocks = vip->vii_blocks;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 	inode->i_generation = vip->vii_gen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148)  * vxfs_blkiget - find inode based on extent #
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149)  * @sbp:	superblock of the filesystem we search in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150)  * @extent:	number of the extent to search
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151)  * @ino:	inode number to search
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153)  * Description:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154)  *  vxfs_blkiget searches inode @ino in the filesystem described by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155)  *  @sbp in the extent @extent.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156)  *  Returns the matching VxFS inode on success, else a NULL pointer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158)  * NOTE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159)  *  While __vxfs_iget uses the pagecache vxfs_blkiget uses the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160)  *  buffercache.  This function should not be used outside the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)  *  read_super() method, otherwise the data may be incoherent.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) struct inode *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) vxfs_blkiget(struct super_block *sbp, u_long extent, ino_t ino)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 	struct buffer_head		*bp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 	struct inode			*inode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 	u_long				block, offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 	inode = new_inode(sbp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 	if (!inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 		return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 	inode->i_ino = get_next_ino();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 	block = extent + ((ino * VXFS_ISIZE) / sbp->s_blocksize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 	offset = ((ino % (sbp->s_blocksize / VXFS_ISIZE)) * VXFS_ISIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 	bp = sb_bread(sbp, block);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 	if (bp && buffer_mapped(bp)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 		struct vxfs_inode_info	*vip = VXFS_INO(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 		struct vxfs_dinode	*dip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 		dip = (struct vxfs_dinode *)(bp->b_data + offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 		dip2vip_cpy(VXFS_SBI(sbp), vip, dip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 		vip->vfs_inode.i_mapping->a_ops = &vxfs_aops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) #ifdef DIAGNOSTIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 		vxfs_dumpi(vip, ino);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 		brelse(bp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 		return inode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 	printk(KERN_WARNING "vxfs: unable to read block %ld\n", block);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 	brelse(bp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 	iput(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 	return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200)  * __vxfs_iget - generic find inode facility
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201)  * @ilistp:		inode list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202)  * @vip:		VxFS inode to fill in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203)  * @ino:		inode number
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205)  * Description:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206)  *  Search the for inode number @ino in the filesystem
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207)  *  described by @sbp.  Use the specified inode table (@ilistp).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208)  *  Returns the matching inode on success, else an error code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) __vxfs_iget(struct inode *ilistp, struct vxfs_inode_info *vip, ino_t ino)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 	struct page			*pp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 	u_long				offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 	offset = (ino % (PAGE_SIZE / VXFS_ISIZE)) * VXFS_ISIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) 	pp = vxfs_get_page(ilistp->i_mapping, ino * VXFS_ISIZE / PAGE_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 	if (!IS_ERR(pp)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 		struct vxfs_dinode	*dip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 		caddr_t			kaddr = (char *)page_address(pp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 		dip = (struct vxfs_dinode *)(kaddr + offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 		dip2vip_cpy(VXFS_SBI(ilistp->i_sb), vip, dip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) 		vip->vfs_inode.i_mapping->a_ops = &vxfs_aops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) #ifdef DIAGNOSTIC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 		vxfs_dumpi(vip, ino);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) 		vxfs_put_page(pp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 		return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) 	printk(KERN_WARNING "vxfs: error on page 0x%p for inode %ld\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) 		pp, (unsigned long)ino);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) 	return PTR_ERR(pp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239)  * vxfs_stiget - find inode using the structural inode list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240)  * @sbp:	VFS superblock
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241)  * @ino:	inode #
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243)  * Description:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244)  *  Find inode @ino in the filesystem described by @sbp using
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245)  *  the structural inode list.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246)  *  Returns the matching inode on success, else a NULL pointer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) struct inode *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) vxfs_stiget(struct super_block *sbp, ino_t ino)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) 	struct inode *inode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) 	int error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) 	inode = new_inode(sbp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) 	if (!inode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) 		return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) 	inode->i_ino = get_next_ino();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) 	error = __vxfs_iget(VXFS_SBI(sbp)->vsi_stilist, VXFS_INO(inode), ino);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) 	if (error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) 		iput(inode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) 		return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) 	return inode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269)  * vxfs_iget - get an inode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270)  * @sbp:	the superblock to get the inode for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271)  * @ino:	the number of the inode to get
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273)  * Description:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274)  *  vxfs_read_inode creates an inode, reads the disk inode for @ino and fills
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275)  *  in all relevant fields in the new inode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) struct inode *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) vxfs_iget(struct super_block *sbp, ino_t ino)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) 	struct vxfs_inode_info		*vip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) 	const struct address_space_operations	*aops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) 	struct inode *ip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) 	int error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) 	ip = iget_locked(sbp, ino);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) 	if (!ip)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) 		return ERR_PTR(-ENOMEM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) 	if (!(ip->i_state & I_NEW))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) 		return ip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) 	vip = VXFS_INO(ip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) 	error = __vxfs_iget(VXFS_SBI(sbp)->vsi_ilist, vip, ino);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) 	if (error) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) 		iget_failed(ip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) 		return ERR_PTR(error);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) 	if (VXFS_ISIMMED(vip))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) 		aops = &vxfs_immed_aops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) 		aops = &vxfs_aops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) 	if (S_ISREG(ip->i_mode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) 		ip->i_fop = &generic_ro_fops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) 		ip->i_mapping->a_ops = aops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) 	} else if (S_ISDIR(ip->i_mode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) 		ip->i_op = &vxfs_dir_inode_ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) 		ip->i_fop = &vxfs_dir_operations;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) 		ip->i_mapping->a_ops = aops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) 	} else if (S_ISLNK(ip->i_mode)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) 		if (!VXFS_ISIMMED(vip)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) 			ip->i_op = &page_symlink_inode_operations;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) 			inode_nohighmem(ip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) 			ip->i_mapping->a_ops = &vxfs_aops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) 			ip->i_op = &simple_symlink_inode_operations;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) 			ip->i_link = vip->vii_immed.vi_immed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) 			nd_terminate_link(ip->i_link, ip->i_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) 					  sizeof(vip->vii_immed.vi_immed) - 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) 	} else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) 		init_special_inode(ip, ip->i_mode, old_decode_dev(vip->vii_rdev));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) 	unlock_new_inode(ip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) 	return ip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329)  * vxfs_evict_inode - remove inode from main memory
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330)  * @ip:		inode to discard.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332)  * Description:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333)  *  vxfs_evict_inode() is called on the final iput and frees the private
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334)  *  inode area.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) vxfs_evict_inode(struct inode *ip)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) 	truncate_inode_pages_final(&ip->i_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) 	clear_inode(ip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) }