freevxfs: move VFS inode allocation into vxfs_blkiget and vxfs_stiget

Signed-off-by: Krzysztof Błaszkowski <kb@sysmikro.com.pl>
[hch: split from a larger patch]
Signed-off-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
Krzysztof Błaszkowski 2016-06-01 08:56:04 +02:00 committed by Christoph Hellwig
parent 0e481d3c09
commit 8985f53ee2
3 changed files with 31 additions and 37 deletions

View File

@ -54,11 +54,9 @@ extern int vxfs_read_fshead(struct super_block *);
extern const struct address_space_operations vxfs_immed_aops; extern const struct address_space_operations vxfs_immed_aops;
extern struct kmem_cache *vxfs_inode_cachep; extern struct kmem_cache *vxfs_inode_cachep;
extern void vxfs_dumpi(struct vxfs_inode_info *, ino_t); extern void vxfs_dumpi(struct vxfs_inode_info *, ino_t);
extern struct inode * vxfs_get_fake_inode(struct super_block *, extern struct inode *vxfs_blkiget(struct super_block *, u_long, ino_t);
struct vxfs_inode_info *); extern struct inode *vxfs_stiget(struct super_block *, ino_t);
extern struct vxfs_inode_info * vxfs_blkiget(struct super_block *, u_long, ino_t); extern struct inode *vxfs_iget(struct super_block *, ino_t);
extern struct vxfs_inode_info * vxfs_stiget(struct super_block *, ino_t);
extern struct inode * vxfs_iget(struct super_block *, ino_t);
extern void vxfs_evict_inode(struct inode *); extern void vxfs_evict_inode(struct inode *);
/* vxfs_lookup.c */ /* vxfs_lookup.c */

View File

@ -108,31 +108,26 @@ vxfs_read_fshead(struct super_block *sbp)
{ {
struct vxfs_sb_info *infp = VXFS_SBI(sbp); struct vxfs_sb_info *infp = VXFS_SBI(sbp);
struct vxfs_fsh *pfp, *sfp; 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); infp->vsi_fship = vxfs_blkiget(sbp, infp->vsi_iext, infp->vsi_fshino);
if (!vip) { if (!infp->vsi_fship) {
printk(KERN_ERR "vxfs: unable to read fsh inode\n"); printk(KERN_ERR "vxfs: unable to read fsh inode\n");
return -EINVAL; return -EINVAL;
} }
vip = VXFS_INO(infp->vsi_fship);
if (!VXFS_ISFSH(vip)) { if (!VXFS_ISFSH(vip)) {
printk(KERN_ERR "vxfs: fsh list inode is of wrong type (%x)\n", printk(KERN_ERR "vxfs: fsh list inode is of wrong type (%x)\n",
vip->vii_mode & VXFS_TYPE_MASK); vip->vii_mode & VXFS_TYPE_MASK);
goto out_free_fship; goto out_iput_fship;
} }
#ifdef DIAGNOSTIC #ifdef DIAGNOSTIC
printk("vxfs: fsh inode dump:\n"); printk("vxfs: fsh inode dump:\n");
vxfs_dumpi(vip, infp->vsi_fshino); vxfs_dumpi(vip, infp->vsi_fshino);
#endif #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); sfp = vxfs_getfsh(infp->vsi_fship, 0);
if (!sfp) { if (!sfp) {
printk(KERN_ERR "vxfs: unable to get structural fsh\n"); printk(KERN_ERR "vxfs: unable to get structural fsh\n");
@ -153,15 +148,10 @@ vxfs_read_fshead(struct super_block *sbp)
vxfs_dumpfsh(pfp); vxfs_dumpfsh(pfp);
#endif #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])); 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) { if (!infp->vsi_stilist) {
printk(KERN_ERR "vxfs: unable to get structural list inode\n"); printk(KERN_ERR "vxfs: unable to get structural list inode\n");
kfree(tip);
goto out_free_pfp; goto out_free_pfp;
} }
if (!VXFS_ISILT(VXFS_INO(infp->vsi_stilist))) { if (!VXFS_ISILT(VXFS_INO(infp->vsi_stilist))) {
@ -170,13 +160,9 @@ vxfs_read_fshead(struct super_block *sbp)
goto out_iput_stilist; goto out_iput_stilist;
} }
tip = vxfs_stiget(sbp, fs32_to_cpu(infp, pfp->fsh_ilistino[0])); infp->vsi_ilist = 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);
if (!infp->vsi_ilist) { if (!infp->vsi_ilist) {
printk(KERN_ERR "vxfs: unable to get inode list inode\n"); printk(KERN_ERR "vxfs: unable to get inode list inode\n");
kfree(tip);
goto out_iput_stilist; goto out_iput_stilist;
} }
if (!VXFS_ISILT(VXFS_INO(infp->vsi_ilist))) { if (!VXFS_ISILT(VXFS_INO(infp->vsi_ilist))) {
@ -198,7 +184,4 @@ vxfs_read_fshead(struct super_block *sbp)
out_iput_fship: out_iput_fship:
iput(infp->vsi_fship); iput(infp->vsi_fship);
return -EINVAL; return -EINVAL;
out_free_fship:
kfree(vip);
return -EINVAL;
} }

View File

@ -44,6 +44,8 @@
struct kmem_cache *vxfs_inode_cachep; struct kmem_cache *vxfs_inode_cachep;
static struct inode * vxfs_get_fake_inode(struct super_block *,
struct vxfs_inode_info *);
#ifdef DIAGNOSTIC #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 * buffercache. This function should not be used outside the
* read_super() method, otherwise the data may be incoherent. * 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) vxfs_blkiget(struct super_block *sbp, u_long extent, ino_t ino)
{ {
struct buffer_head *bp; struct buffer_head *bp;
struct inode *inode;
u_long block, offset; u_long block, offset;
block = extent + ((ino * VXFS_ISIZE) / sbp->s_blocksize); 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); vxfs_dumpi(vip, ino);
#endif #endif
brelse(bp); brelse(bp);
return (vip);
inode = vxfs_get_fake_inode(sbp, vip);
if (!inode)
kmem_cache_free(vxfs_inode_cachep, vip);
return inode;
} }
fail: fail:
@ -152,7 +159,7 @@ fail:
* Description: * Description:
* Search the for inode number @ino in the filesystem * Search the for inode number @ino in the filesystem
* described by @sbp. Use the specified inode table (@ilistp). * 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 * static struct vxfs_inode_info *
__vxfs_iget(ino_t ino, struct inode *ilistp) __vxfs_iget(ino_t ino, struct inode *ilistp)
@ -196,15 +203,21 @@ fail:
* Description: * Description:
* Find inode @ino in the filesystem described by @sbp using * Find inode @ino in the filesystem described by @sbp using
* the structural inode list. * 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) vxfs_stiget(struct super_block *sbp, ino_t ino)
{ {
struct vxfs_inode_info *vip; struct vxfs_inode_info *vip;
struct inode *inode;
vip = __vxfs_iget(ino, VXFS_SBI(sbp)->vsi_stilist); 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. * superblock, vxfs_inode pair.
* Returns the filled VFS inode. * Returns the filled VFS inode.
*/ */
struct inode * static struct inode *
vxfs_get_fake_inode(struct super_block *sbp, struct vxfs_inode_info *vip) vxfs_get_fake_inode(struct super_block *sbp, struct vxfs_inode_info *vip)
{ {
struct inode *ip = NULL; struct inode *ip = NULL;