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:
parent
0e481d3c09
commit
8985f53ee2
|
@ -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 */
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue