ramfs: fix double freeing s_fs_info on failed mount
[pandora-kernel.git] / fs / ramfs / inode.c
index a404fb8..3a6b193 100644 (file)
@@ -221,22 +221,23 @@ static int ramfs_fill_super(struct super_block * sb, void * data, int silent)
        save_mount_options(sb, data);
 
        fsi = kzalloc(sizeof(struct ramfs_fs_info), GFP_KERNEL);
+       sb->s_fs_info = fsi;
        if (!fsi) {
                err = -ENOMEM;
                goto fail;
        }
-       sb->s_fs_info = fsi;
 
        err = ramfs_parse_options(data, &fsi->mount_opts);
        if (err)
                goto fail;
 
-       sb->s_maxbytes = MAX_LFS_FILESIZE;
-       sb->s_blocksize = PAGE_CACHE_SIZE;
-       sb->s_blocksize_bits = PAGE_CACHE_SHIFT;
-       sb->s_magic = RAMFS_MAGIC;
-       sb->s_op = &ramfs_ops;
-       sb->s_time_gran = 1;
+       sb->s_maxbytes          = MAX_LFS_FILESIZE;
+       sb->s_blocksize         = PAGE_CACHE_SIZE;
+       sb->s_blocksize_bits    = PAGE_CACHE_SHIFT;
+       sb->s_magic             = RAMFS_MAGIC;
+       sb->s_op                = &ramfs_ops;
+       sb->s_time_gran         = 1;
+
        inode = ramfs_get_inode(sb, S_IFDIR | fsi->mount_opts.mode, 0);
        if (!inode) {
                err = -ENOMEM;
@@ -244,14 +245,16 @@ static int ramfs_fill_super(struct super_block * sb, void * data, int silent)
        }
 
        root = d_alloc_root(inode);
+       sb->s_root = root;
        if (!root) {
                err = -ENOMEM;
                goto fail;
        }
-       sb->s_root = root;
+
        return 0;
 fail:
        kfree(fsi);
+       sb->s_fs_info = NULL;
        iput(inode);
        return err;
 }