^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) }