Browse Source

[GFS2] Remove duplicate sb reading code

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>
Steven Whitehouse 18 years ago
parent
commit
3cf1e7bed4
3 changed files with 16 additions and 30 deletions
  1. 13 28
      fs/gfs2/ops_fstype.c
  2. 2 2
      fs/gfs2/super.c
  3. 1 0
      fs/gfs2/super.h

+ 13 - 28
fs/gfs2/ops_fstype.c

@@ -116,7 +116,7 @@ static void init_vfs(struct super_block *sb, unsigned noatime)
 
 
 static int init_names(struct gfs2_sbd *sdp, int silent)
 static int init_names(struct gfs2_sbd *sdp, int silent)
 {
 {
-	struct gfs2_sb *sb = NULL;
+	struct page *page;
 	char *proto, *table;
 	char *proto, *table;
 	int error = 0;
 	int error = 0;
 
 
@@ -126,37 +126,23 @@ static int init_names(struct gfs2_sbd *sdp, int silent)
 	/*  Try to autodetect  */
 	/*  Try to autodetect  */
 
 
 	if (!proto[0] || !table[0]) {
 	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)
 		if (error)
 			goto out;
 			goto out;
 
 
 		if (!proto[0])
 		if (!proto[0])
-			proto = sb->sb_lockproto;
+			proto = sdp->sd_sb.sb_lockproto;
 		if (!table[0])
 		if (!table[0])
-			table = sb->sb_locktable;
+			table = sdp->sd_sb.sb_locktable;
 	}
 	}
 
 
 	if (!table[0])
 	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);
 	snprintf(sdp->sd_table_name, GFS2_FSNAME_LEN, "%s", table);
 
 
 out:
 out:
-	kfree(sb);
 	return error;
 	return error;
 }
 }
 
 

+ 2 - 2
fs/gfs2/super.c

@@ -180,7 +180,7 @@ static int end_bio_io_page(struct bio *bio, unsigned int bytes_done, int error)
 	return 0;
 	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 page *page;
 	struct bio *bio;
 	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_end_io = end_bio_io_page;
 	bio->bi_private = page;
 	bio->bi_private = page;
-	submit_bio(READ_SYNC, bio);
+	submit_bio(READ_SYNC | (1 << BIO_RW_META), bio);
 	wait_on_page_locked(page);
 	wait_on_page_locked(page);
 	bio_put(bio);
 	bio_put(bio);
 	if (!PageUptodate(page)) {
 	if (!PageUptodate(page)) {

+ 1 - 0
fs/gfs2/super.h

@@ -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_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);
 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)
 static inline unsigned int gfs2_jindex_size(struct gfs2_sbd *sdp)
 {
 {