Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8985f53e authored by Krzysztof Błaszkowski's avatar Krzysztof Błaszkowski Committed by Christoph Hellwig
Browse files

freevxfs: move VFS inode allocation into vxfs_blkiget and vxfs_stiget



Signed-off-by: default avatarKrzysztof Błaszkowski <kb@sysmikro.com.pl>
[hch: split from a larger patch]
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
parent 0e481d3c
Loading
Loading
Loading
Loading
+3 −5
Original line number Diff line number Diff line
@@ -54,10 +54,8 @@ extern int vxfs_read_fshead(struct super_block *);
extern const struct address_space_operations vxfs_immed_aops;
extern struct kmem_cache	*vxfs_inode_cachep;
extern void			vxfs_dumpi(struct vxfs_inode_info *, ino_t);
extern struct inode *		vxfs_get_fake_inode(struct super_block *,
					struct vxfs_inode_info *);
extern struct vxfs_inode_info *	vxfs_blkiget(struct super_block *, u_long, ino_t);
extern struct vxfs_inode_info *	vxfs_stiget(struct super_block *, ino_t);
extern struct inode		*vxfs_blkiget(struct super_block *, u_long, ino_t);
extern struct inode		*vxfs_stiget(struct super_block *, ino_t);
extern struct inode		*vxfs_iget(struct super_block *, ino_t);
extern void			vxfs_evict_inode(struct inode *);

+8 −25
Original line number Diff line number Diff line
@@ -108,31 +108,26 @@ vxfs_read_fshead(struct super_block *sbp)
{
	struct vxfs_sb_info		*infp = VXFS_SBI(sbp);
	struct vxfs_fsh			*pfp, *sfp;
	struct vxfs_inode_info		*vip, *tip;
	struct vxfs_inode_info		*vip;

	vip = vxfs_blkiget(sbp, infp->vsi_iext, infp->vsi_fshino);
	if (!vip) {
	infp->vsi_fship = vxfs_blkiget(sbp, infp->vsi_iext, infp->vsi_fshino);
	if (!infp->vsi_fship) {
		printk(KERN_ERR "vxfs: unable to read fsh inode\n");
		return -EINVAL;
	}

	vip = VXFS_INO(infp->vsi_fship);
	if (!VXFS_ISFSH(vip)) {
		printk(KERN_ERR "vxfs: fsh list inode is of wrong type (%x)\n",
				vip->vii_mode & VXFS_TYPE_MASK); 
		goto out_free_fship;
		goto out_iput_fship;
	}


#ifdef DIAGNOSTIC
	printk("vxfs: fsh inode dump:\n");
	vxfs_dumpi(vip, infp->vsi_fshino);
#endif

	infp->vsi_fship = vxfs_get_fake_inode(sbp, vip);
	if (!infp->vsi_fship) {
		printk(KERN_ERR "vxfs: unable to get fsh inode\n");
		goto out_free_fship;
	}

	sfp = vxfs_getfsh(infp->vsi_fship, 0);
	if (!sfp) {
		printk(KERN_ERR "vxfs: unable to get structural fsh\n");
@@ -153,15 +148,10 @@ vxfs_read_fshead(struct super_block *sbp)
	vxfs_dumpfsh(pfp);
#endif

	tip = vxfs_blkiget(sbp, infp->vsi_iext,
	infp->vsi_stilist = vxfs_blkiget(sbp, infp->vsi_iext,
			fs32_to_cpu(infp, sfp->fsh_ilistino[0]));
	if (!tip)
		goto out_free_pfp;

	infp->vsi_stilist = vxfs_get_fake_inode(sbp, tip);
	if (!infp->vsi_stilist) {
		printk(KERN_ERR "vxfs: unable to get structural list inode\n");
		kfree(tip);
		goto out_free_pfp;
	}
	if (!VXFS_ISILT(VXFS_INO(infp->vsi_stilist))) {
@@ -170,13 +160,9 @@ vxfs_read_fshead(struct super_block *sbp)
		goto out_iput_stilist;
	}

	tip = vxfs_stiget(sbp, fs32_to_cpu(infp, pfp->fsh_ilistino[0]));
	if (!tip)
		goto out_iput_stilist;
	infp->vsi_ilist = vxfs_get_fake_inode(sbp, tip);
	infp->vsi_ilist = vxfs_stiget(sbp, fs32_to_cpu(infp, pfp->fsh_ilistino[0]));
	if (!infp->vsi_ilist) {
		printk(KERN_ERR "vxfs: unable to get inode list inode\n");
		kfree(tip);
		goto out_iput_stilist;
	}
	if (!VXFS_ISILT(VXFS_INO(infp->vsi_ilist))) {
@@ -198,7 +184,4 @@ vxfs_read_fshead(struct super_block *sbp)
 out_iput_fship:
	iput(infp->vsi_fship);
	return -EINVAL;
 out_free_fship:
 	kfree(vip);
	return -EINVAL;
}
+20 −7
Original line number Diff line number Diff line
@@ -44,6 +44,8 @@

struct kmem_cache		*vxfs_inode_cachep;

static struct inode *		vxfs_get_fake_inode(struct super_block *,
					struct vxfs_inode_info *);

#ifdef DIAGNOSTIC
/*
@@ -112,10 +114,11 @@ static inline void dip2vip_cpy(struct vxfs_sb_info *sbi,
 *  buffercache.  This function should not be used outside the
 *  read_super() method, otherwise the data may be incoherent.
 */
struct vxfs_inode_info *
struct inode *
vxfs_blkiget(struct super_block *sbp, u_long extent, ino_t ino)
{
	struct buffer_head		*bp;
	struct inode			*inode;
	u_long				block, offset;

	block = extent + ((ino * VXFS_ISIZE) / sbp->s_blocksize);
@@ -134,7 +137,11 @@ vxfs_blkiget(struct super_block *sbp, u_long extent, ino_t ino)
		vxfs_dumpi(vip, ino);
#endif
		brelse(bp);
		return (vip);

		inode = vxfs_get_fake_inode(sbp, vip);
		if (!inode)
			kmem_cache_free(vxfs_inode_cachep, vip);
		return inode;
	}

fail:
@@ -152,7 +159,7 @@ vxfs_blkiget(struct super_block *sbp, u_long extent, ino_t ino)
 * Description:
 *  Search the for inode number @ino in the filesystem
 *  described by @sbp.  Use the specified inode table (@ilistp).
 *  Returns the matching VxFS inode on success, else an error code.
 *  Returns the matching inode on success, else an error code.
 */
static struct vxfs_inode_info *
__vxfs_iget(ino_t ino, struct inode *ilistp)
@@ -196,15 +203,21 @@ __vxfs_iget(ino_t ino, struct inode *ilistp)
 * Description:
 *  Find inode @ino in the filesystem described by @sbp using
 *  the structural inode list.
 *  Returns the matching VxFS inode on success, else a NULL pointer.
 *  Returns the matching inode on success, else a NULL pointer.
 */
struct vxfs_inode_info *
struct inode *
vxfs_stiget(struct super_block *sbp, ino_t ino)
{
	struct vxfs_inode_info *vip;
	struct inode *inode;

	vip = __vxfs_iget(ino, VXFS_SBI(sbp)->vsi_stilist);
	return IS_ERR(vip) ? NULL : vip;
	if (IS_ERR(vip))
		return NULL;
	inode = vxfs_get_fake_inode(sbp, vip);
	if (!inode)
		kmem_cache_free(vxfs_inode_cachep, vip);
	return inode;
}

/**
@@ -282,7 +295,7 @@ vxfs_iinit(struct inode *ip, struct vxfs_inode_info *vip)
 *  superblock, vxfs_inode pair.
 *  Returns the filled VFS inode.
 */
struct inode *
static struct inode *
vxfs_get_fake_inode(struct super_block *sbp, struct vxfs_inode_info *vip)
{
	struct inode			*ip = NULL;