]> Pileus Git - ~andy/linux/commitdiff
[GFS2] Remove duplicate sb reading code
authorSteven Whitehouse <swhiteho@redhat.com>
Mon, 2 Oct 2006 15:49:41 +0000 (11:49 -0400)
committerSteven Whitehouse <swhiteho@redhat.com>
Mon, 2 Oct 2006 15:49:41 +0000 (11:49 -0400)
For some reason we had two different sets of code for reading in the
superblock. This removes one of them in favour of the other. Also we
don't need the temporary buffer for the sb since we already have one
in the gfs2 sb itself.

Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
fs/gfs2/ops_fstype.c
fs/gfs2/super.c
fs/gfs2/super.h

index a9aa2edd756fcc5b27d9666a0ecbcda6cdd499e9..178b339118434004a25c383de97bd0b64eab3cf9 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;
 }
 
index f6ce5e4eaf7e99eee01f15bf2c193ce42dee045d..6a78b1b32e25597fac6a2ef0e0f13d7a2c3be78e 100644 (file)
@@ -180,7 +180,7 @@ static int end_bio_io_page(struct bio *bio, unsigned int bytes_done, int error)
        return 0;
 }
 
-static struct page *gfs2_read_super(struct super_block *sb, sector_t sector)
+struct page *gfs2_read_super(struct super_block *sb, sector_t sector)
 {
        struct page *page;
        struct bio *bio;
@@ -205,7 +205,7 @@ static struct page *gfs2_read_super(struct super_block *sb, sector_t sector)
 
        bio->bi_end_io = end_bio_io_page;
        bio->bi_private = page;
-       submit_bio(READ_SYNC, bio);
+       submit_bio(READ_SYNC | (1 << BIO_RW_META), bio);
        wait_on_page_locked(page);
        bio_put(bio);
        if (!PageUptodate(page)) {
index 5fa5119cfba653c23a0c13e4dcd8efdc18f07411..5bb443ae0f5902c5ab51437d6b04294aa3d2e1b1 100644 (file)
@@ -16,6 +16,7 @@ void gfs2_tune_init(struct gfs2_tune *gt);
 
 int gfs2_check_sb(struct gfs2_sbd *sdp, struct gfs2_sb *sb, int silent);
 int gfs2_read_sb(struct gfs2_sbd *sdp, struct gfs2_glock *gl, int silent);
+struct page *gfs2_read_super(struct super_block *sb, sector_t sector);
 
 static inline unsigned int gfs2_jindex_size(struct gfs2_sbd *sdp)
 {