]> err.no Git - linux-2.6/blobdiff - fs/gfs2/ops_fstype.c
Char: icom, mark __init as __devinit
[linux-2.6] / fs / gfs2 / ops_fstype.c
index a9aa2edd756fcc5b27d9666a0ecbcda6cdd499e9..ee54cb6670832e841206377bf50dff0b50ed0474 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;
 }
 
@@ -252,7 +237,7 @@ fail:
 }
 
 static struct inode *gfs2_lookup_root(struct super_block *sb,
-                                     struct gfs2_inum *inum)
+                                     struct gfs2_inum_host *inum)
 {
        return gfs2_inode_lookup(sb, inum, DT_DIR);
 }
@@ -261,7 +246,7 @@ static int init_sb(struct gfs2_sbd *sdp, int silent, int undo)
 {
        struct super_block *sb = sdp->sd_vfs;
        struct gfs2_holder sb_gh;
-       struct gfs2_inum *inum;
+       struct gfs2_inum_host *inum;
        struct inode *inode;
        int error = 0;
 
@@ -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;
 }
@@ -855,7 +840,7 @@ static struct super_block* get_gfs2_sb(const char *dev_name)
        }
 
        printk(KERN_WARNING "GFS2: Unrecognized block device or "
-              "mount point %s", dev_name);
+              "mount point %s\n", dev_name);
 
 free_nd:
        path_release(&nd);
@@ -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) {
@@ -883,9 +867,9 @@ static int gfs2_get_sb_meta(struct file_system_type *fs_type, int flags,
                error = -EBUSY;
                goto error;
        }
-       mutex_lock(&sb->s_bdev->bd_mount_mutex);
+       down(&sb->s_bdev->bd_mount_sem);
        new = sget(fs_type, test_bdev_super, set_bdev_super, sb->s_bdev);
-       mutex_unlock(&sb->s_bdev->bd_mount_mutex);
+       up(&sb->s_bdev->bd_mount_sem);
        if (IS_ERR(new)) {
                error = PTR_ERR(new);
                goto error;
@@ -907,8 +891,6 @@ static int gfs2_get_sb_meta(struct file_system_type *fs_type, int flags,
        atomic_inc(&sdp->sd_gfs2mnt->mnt_count);
        return simple_set_mnt(mnt, new);
 error:
-       if (gfs2mnt)
-               kfree(gfs2mnt);
        return error;
 }