Merge branch 'upstream-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/linvil...
[pandora-kernel.git] / fs / gfs2 / ops_fstype.c
index e32a6b2..882873a 100644 (file)
@@ -116,7 +116,7 @@ static void init_vfs(struct super_block *sb, unsigned noatime)
 
 static int init_names(struct gfs2_sbd *sdp, int silent)
 {
-       struct gfs2_sb *sb = NULL;
+       struct page *page;
        char *proto, *table;
        int error = 0;
 
@@ -126,37 +126,23 @@ static int init_names(struct gfs2_sbd *sdp, int silent)
        /*  Try to autodetect  */
 
        if (!proto[0] || !table[0]) {
-               struct buffer_head *bh;
-               bh = sb_getblk(sdp->sd_vfs,
-                              GFS2_SB_ADDR >> sdp->sd_fsb2bb_shift);
-               lock_buffer(bh);
-               clear_buffer_uptodate(bh);
-               clear_buffer_dirty(bh);
-               unlock_buffer(bh);
-               ll_rw_block(READ, 1, &bh);
-               wait_on_buffer(bh);
-
-               if (!buffer_uptodate(bh)) {
-                       brelse(bh);
-                       return -EIO;
-               }
-
-               sb = kmalloc(sizeof(struct gfs2_sb), GFP_KERNEL);
-               if (!sb) {
-                       brelse(bh);
-                       return -ENOMEM;
-               }
-               gfs2_sb_in(sb, bh->b_data); 
-               brelse(bh);
-
-               error = gfs2_check_sb(sdp, sb, silent);
+               struct gfs2_sb *sb;
+               page = gfs2_read_super(sdp->sd_vfs, GFS2_SB_ADDR >> sdp->sd_fsb2bb_shift);
+               if (!page)
+                       return -ENOBUFS;
+               sb = kmap(page);
+               gfs2_sb_in(&sdp->sd_sb, sb);
+               kunmap(page);
+               __free_page(page);
+
+               error = gfs2_check_sb(sdp, &sdp->sd_sb, silent);
                if (error)
                        goto out;
 
                if (!proto[0])
-                       proto = sb->sb_lockproto;
+                       proto = sdp->sd_sb.sb_lockproto;
                if (!table[0])
-                       table = sb->sb_locktable;
+                       table = sdp->sd_sb.sb_locktable;
        }
 
        if (!table[0])
@@ -166,7 +152,6 @@ static int init_names(struct gfs2_sbd *sdp, int silent)
        snprintf(sdp->sd_table_name, GFS2_FSNAME_LEN, "%s", table);
 
 out:
-       kfree(sb);
        return error;
 }
 
@@ -272,7 +257,7 @@ static int init_sb(struct gfs2_sbd *sdp, int silent, int undo)
                }
                return 0;
        }
-       
+
        error = gfs2_glock_nq_num(sdp, GFS2_SB_LOCK, &gfs2_meta_glops,
                                 LM_ST_SHARED, 0, &sb_gh);
        if (error) {
@@ -358,7 +343,7 @@ static int init_journal(struct gfs2_sbd *sdp, int undo)
        error = -EINVAL;
        if (!gfs2_jindex_size(sdp)) {
                fs_err(sdp, "no journals!\n");
-               goto fail_jindex;               
+               goto fail_jindex;
        }
 
        if (sdp->sd_args.ar_spectator) {
@@ -789,7 +774,7 @@ out:
        return error;
 }
 
-static int fill_super_meta(struct super_block *sb, struct super_block *new, 
+static int fill_super_meta(struct super_block *sb, struct super_block *new,
                           void *data, int silent)
 {
        struct gfs2_sbd *sdp = sb->s_fs_info;
@@ -809,8 +794,8 @@ static int fill_super_meta(struct super_block *sb, struct super_block *new,
                fs_err(sdp, "can't get root dentry\n");
                error = -ENOMEM;
                iput(inode);
-       }
-       new->s_root->d_op = &gfs2_dops;
+       } else
+               new->s_root->d_op = &gfs2_dops;
 
        return error;
 }
@@ -821,7 +806,7 @@ static int set_bdev_super(struct super_block *s, void *data)
        s->s_dev = s->s_bdev->bd_dev;
        return 0;
 }
+
 static int test_bdev_super(struct super_block *s, void *data)
 {
        return s->s_bdev == data;
@@ -835,10 +820,10 @@ static struct super_block* get_gfs2_sb(const char *dev_name)
        struct super_block *sb = NULL, *s;
        struct list_head *l;
        int error;
-       
+
        error = path_lookup(dev_name, LOOKUP_FOLLOW, &nd);
        if (error) {
-               printk(KERN_WARNING "GFS2: path_lookup on %s returned error\n", 
+               printk(KERN_WARNING "GFS2: path_lookup on %s returned error\n",
                       dev_name);
                goto out;
        }
@@ -869,7 +854,6 @@ static int gfs2_get_sb_meta(struct file_system_type *fs_type, int flags,
        int error = 0;
        struct super_block *sb = NULL, *new;
        struct gfs2_sbd *sdp;
-       char *gfs2mnt = NULL;
 
        sb = get_gfs2_sb(dev_name);
        if (!sb) {
@@ -900,15 +884,13 @@ static int gfs2_get_sb_meta(struct file_system_type *fs_type, int flags,
                deactivate_super(new);
                goto error;
        }
-       
+
        new->s_flags |= MS_ACTIVE;
-       
+
        /* Grab a reference to the gfs2 mount point */
        atomic_inc(&sdp->sd_gfs2mnt->mnt_count);
        return simple_set_mnt(mnt, new);
 error:
-       if (gfs2mnt)
-               kfree(gfs2mnt);
        return error;
 }