]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
freevxfs: move VFS inode allocation into vxfs_blkiget and vxfs_stiget
authorKrzysztof Błaszkowski <kb@sysmikro.com.pl>
Wed, 1 Jun 2016 06:56:04 +0000 (08:56 +0200)
committerChristoph Hellwig <hch@lst.de>
Wed, 1 Jun 2016 07:01:52 +0000 (09:01 +0200)
Signed-off-by: Krzysztof Błaszkowski <kb@sysmikro.com.pl>
[hch: split from a larger patch]
Signed-off-by: Christoph Hellwig <hch@lst.de>
fs/freevxfs/vxfs_extern.h
fs/freevxfs/vxfs_fshead.c
fs/freevxfs/vxfs_inode.c

index b59df797665f8569de908e12bbded0fac57496a5..2ec8c0f278651c9bb029fb9fc14f9db640997479 100644 (file)
@@ -54,11 +54,9 @@ 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_iget(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 *);
 
 /* vxfs_lookup.c */
index e7501cb85321f105b31ec2704ae8531c3c9e74ec..2651b4238eb2bf75ed402908d3cd3287331940c7 100644 (file)
@@ -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;
 }
index 6087ca703f128e39d857a89d7dcf2217f7e86c34..7b5de83405f216f7bd8c02cec30b8619039c8d51 100644 (file)
@@ -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;