aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
Diffstat (limited to 'fs')
-rw-r--r--fs/gfs2/ops_fstype.c41
-rw-r--r--fs/gfs2/super.c4
-rw-r--r--fs/gfs2/super.h1
3 files changed, 16 insertions, 30 deletions
diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c
index a9aa2edd756f..178b33911843 100644
--- a/fs/gfs2/ops_fstype.c
+++ b/fs/gfs2/ops_fstype.c
@@ -116,7 +116,7 @@ static void init_vfs(struct super_block *sb, unsigned noatime)
116 116
117static int init_names(struct gfs2_sbd *sdp, int silent) 117static int init_names(struct gfs2_sbd *sdp, int silent)
118{ 118{
119 struct gfs2_sb *sb = NULL; 119 struct page *page;
120 char *proto, *table; 120 char *proto, *table;
121 int error = 0; 121 int error = 0;
122 122
@@ -126,37 +126,23 @@ static int init_names(struct gfs2_sbd *sdp, int silent)
126 /* Try to autodetect */ 126 /* Try to autodetect */
127 127
128 if (!proto[0] || !table[0]) { 128 if (!proto[0] || !table[0]) {
129 struct buffer_head *bh; 129 struct gfs2_sb *sb;
130 bh = sb_getblk(sdp->sd_vfs, 130 page = gfs2_read_super(sdp->sd_vfs, GFS2_SB_ADDR >> sdp->sd_fsb2bb_shift);
131 GFS2_SB_ADDR >> sdp->sd_fsb2bb_shift); 131 if (!page)
132 lock_buffer(bh); 132 return -ENOBUFS;
133 clear_buffer_uptodate(bh); 133 sb = kmap(page);
134 clear_buffer_dirty(bh); 134 gfs2_sb_in(&sdp->sd_sb, sb);
135 unlock_buffer(bh); 135 kunmap(page);
136 ll_rw_block(READ, 1, &bh); 136 __free_page(page);
137 wait_on_buffer(bh); 137
138 138 error = gfs2_check_sb(sdp, &sdp->sd_sb, silent);
139 if (!buffer_uptodate(bh)) {
140 brelse(bh);
141 return -EIO;
142 }
143
144 sb = kmalloc(sizeof(struct gfs2_sb), GFP_KERNEL);
145 if (!sb) {
146 brelse(bh);
147 return -ENOMEM;
148 }
149 gfs2_sb_in(sb, bh->b_data);
150 brelse(bh);
151
152 error = gfs2_check_sb(sdp, sb, silent);
153 if (error) 139 if (error)
154 goto out; 140 goto out;
155 141
156 if (!proto[0]) 142 if (!proto[0])
157 proto = sb->sb_lockproto; 143 proto = sdp->sd_sb.sb_lockproto;
158 if (!table[0]) 144 if (!table[0])
159 table = sb->sb_locktable; 145 table = sdp->sd_sb.sb_locktable;
160 } 146 }
161 147
162 if (!table[0]) 148 if (!table[0])
@@ -166,7 +152,6 @@ static int init_names(struct gfs2_sbd *sdp, int silent)
166 snprintf(sdp->sd_table_name, GFS2_FSNAME_LEN, "%s", table); 152 snprintf(sdp->sd_table_name, GFS2_FSNAME_LEN, "%s", table);
167 153
168out: 154out:
169 kfree(sb);
170 return error; 155 return error;
171} 156}
172 157
diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c
index f6ce5e4eaf7e..6a78b1b32e25 100644
--- a/fs/gfs2/super.c
+++ b/fs/gfs2/super.c
@@ -180,7 +180,7 @@ static int end_bio_io_page(struct bio *bio, unsigned int bytes_done, int error)
180 return 0; 180 return 0;
181} 181}
182 182
183static struct page *gfs2_read_super(struct super_block *sb, sector_t sector) 183struct page *gfs2_read_super(struct super_block *sb, sector_t sector)
184{ 184{
185 struct page *page; 185 struct page *page;
186 struct bio *bio; 186 struct bio *bio;
@@ -205,7 +205,7 @@ static struct page *gfs2_read_super(struct super_block *sb, sector_t sector)
205 205
206 bio->bi_end_io = end_bio_io_page; 206 bio->bi_end_io = end_bio_io_page;
207 bio->bi_private = page; 207 bio->bi_private = page;
208 submit_bio(READ_SYNC, bio); 208 submit_bio(READ_SYNC | (1 << BIO_RW_META), bio);
209 wait_on_page_locked(page); 209 wait_on_page_locked(page);
210 bio_put(bio); 210 bio_put(bio);
211 if (!PageUptodate(page)) { 211 if (!PageUptodate(page)) {
diff --git a/fs/gfs2/super.h b/fs/gfs2/super.h
index 5fa5119cfba6..5bb443ae0f59 100644
--- a/fs/gfs2/super.h
+++ b/fs/gfs2/super.h
@@ -16,6 +16,7 @@ void gfs2_tune_init(struct gfs2_tune *gt);
16 16
17int gfs2_check_sb(struct gfs2_sbd *sdp, struct gfs2_sb *sb, int silent); 17int gfs2_check_sb(struct gfs2_sbd *sdp, struct gfs2_sb *sb, int silent);
18int gfs2_read_sb(struct gfs2_sbd *sdp, struct gfs2_glock *gl, int silent); 18int gfs2_read_sb(struct gfs2_sbd *sdp, struct gfs2_glock *gl, int silent);
19struct page *gfs2_read_super(struct super_block *sb, sector_t sector);
19 20
20static inline unsigned int gfs2_jindex_size(struct gfs2_sbd *sdp) 21static inline unsigned int gfs2_jindex_size(struct gfs2_sbd *sdp)
21{ 22{