/** * vxfs_get_fake_inode - get fake inode structure * @sbp: filesystem superblock * @vip: fspriv inode * * Description: * vxfs_fake_inode gets a fake inode (not in the inode hash) for a * superblock, vxfs_inode pair. * Returns the filled VFS inode. */ struct inode * vxfs_get_fake_inode(struct super_block *sbp, struct vxfs_inode_info *vip) { struct inode *ip = NULL; if ((ip = new_inode(sbp))) { vxfs_iinit(ip, vip); ip->i_mapping->a_ops = &vxfs_aops; } return (ip); }
/** * vxfs_iget - get an inode * @sbp: the superblock to get the inode for * @ino: the number of the inode to get * * Description: * vxfs_read_inode creates an inode, reads the disk inode for @ino and fills * in all relevant fields in the new inode. */ struct inode * vxfs_iget(struct super_block *sbp, ino_t ino) { struct vxfs_inode_info *vip; const struct address_space_operations *aops; struct inode *ip; ip = iget_locked(sbp, ino); if (!ip) return ERR_PTR(-ENOMEM); if (!(ip->i_state & I_NEW)) return ip; vip = __vxfs_iget(ino, VXFS_SBI(sbp)->vsi_ilist); if (IS_ERR(vip)) { iget_failed(ip); return ERR_CAST(vip); } vxfs_iinit(ip, vip); if (VXFS_ISIMMED(vip)) aops = &vxfs_immed_aops; else aops = &vxfs_aops; if (S_ISREG(ip->i_mode)) { ip->i_fop = &generic_ro_fops; ip->i_mapping->a_ops = aops; } else if (S_ISDIR(ip->i_mode)) { ip->i_op = &vxfs_dir_inode_ops; ip->i_fop = &vxfs_dir_operations; ip->i_mapping->a_ops = aops; } else if (S_ISLNK(ip->i_mode)) { if (!VXFS_ISIMMED(vip)) { ip->i_op = &page_symlink_inode_operations; inode_nohighmem(ip); ip->i_mapping->a_ops = &vxfs_aops; } else { ip->i_op = &simple_symlink_inode_operations; ip->i_link = vip->vii_immed.vi_immed; nd_terminate_link(ip->i_link, ip->i_size, sizeof(vip->vii_immed.vi_immed) - 1); } } else init_special_inode(ip, ip->i_mode, old_decode_dev(vip->vii_rdev)); unlock_new_inode(ip); return ip; }
/** * vxfs_read_inode - fill in inode information * @ip: inode pointer to fill * * Description: * vxfs_read_inode reads the disk inode for @ip and fills * in all relevant fields in @ip. */ void vxfs_read_inode(struct inode *ip) { struct super_block *sbp = ip->i_sb; struct vxfs_inode_info *vip; struct address_space_operations *aops; ino_t ino = ip->i_ino; if (!(vip = __vxfs_iget(ino, VXFS_SBI(sbp)->vsi_ilist))) return; vxfs_iinit(ip, vip); if (VXFS_ISIMMED(vip)) aops = &vxfs_immed_aops; else aops = &vxfs_aops; if (S_ISREG(ip->i_mode)) { ip->i_fop = &vxfs_file_operations; ip->i_mapping->a_ops = aops; } else if (S_ISDIR(ip->i_mode)) { ip->i_op = &vxfs_dir_inode_ops; ip->i_fop = &vxfs_dir_operations; ip->i_mapping->a_ops = aops; } else if (S_ISLNK(ip->i_mode)) { if (!VXFS_ISIMMED(vip)) { ip->i_op = &page_symlink_inode_operations; ip->i_mapping->a_ops = &vxfs_aops; } else ip->i_op = &vxfs_immed_symlink_iops; } else init_special_inode(ip, ip->i_mode, vip->vii_rdev); return; }