]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - fs/logfs/super.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394...
[karo-tx-linux.git] / fs / logfs / super.c
index d651e10a1e9c1e589ed55269c0b1c9bab6488b83..5336155c5d8189c2d6f4f78d73bd1abb3056ff36 100644 (file)
@@ -342,24 +342,27 @@ static int logfs_get_sb_final(struct super_block *sb, struct vfsmount *mnt)
                goto fail;
        }
 
+       /* at that point we know that ->put_super() will be called */
        super->s_erase_page = alloc_pages(GFP_KERNEL, 0);
        if (!super->s_erase_page)
-               goto fail;
+               return -ENOMEM;
        memset(page_address(super->s_erase_page), 0xFF, PAGE_SIZE);
 
        /* FIXME: check for read-only mounts */
        err = logfs_make_writeable(sb);
-       if (err)
-               goto fail1;
+       if (err) {
+               __free_page(super->s_erase_page);
+               return err;
+       }
 
        log_super("LogFS: Finished mounting\n");
        simple_set_mnt(mnt, sb);
        return 0;
 
-fail1:
-       __free_page(super->s_erase_page);
 fail:
-       iput(logfs_super(sb)->s_master_inode);
+       iput(super->s_master_inode);
+       iput(super->s_segfile_inode);
+       iput(super->s_mapping_inode);
        return -EIO;
 }
 
@@ -580,10 +583,14 @@ int logfs_get_sb_device(struct file_system_type *type, int flags,
        sb->s_flags |= MS_ACTIVE;
        err = logfs_get_sb_final(sb, mnt);
        if (err)
-               goto err1;
-       return 0;
+               deactivate_locked_super(sb);
+       return err;
 
 err1:
+       /* no ->s_root, no ->put_super() */
+       iput(super->s_master_inode);
+       iput(super->s_segfile_inode);
+       iput(super->s_mapping_inode);
        deactivate_locked_super(sb);
        return err;
 err0: