aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/bfs/bfs.h1
-rw-r--r--fs/bfs/file.c3
-rw-r--r--fs/bfs/inode.c46
3 files changed, 7 insertions, 43 deletions
diff --git a/fs/bfs/bfs.h b/fs/bfs/bfs.h
index 7109e451abf7..f7f87e233dd9 100644
--- a/fs/bfs/bfs.h
+++ b/fs/bfs/bfs.h
@@ -17,7 +17,6 @@ struct bfs_sb_info {
17 unsigned long si_lf_eblk; 17 unsigned long si_lf_eblk;
18 unsigned long si_lasti; 18 unsigned long si_lasti;
19 unsigned long *si_imap; 19 unsigned long *si_imap;
20 struct buffer_head *si_sbh; /* buffer header w/superblock */
21 struct mutex bfs_lock; 20 struct mutex bfs_lock;
22}; 21};
23 22
diff --git a/fs/bfs/file.c b/fs/bfs/file.c
index 8fc2e9c9739d..eb67edd0f8ea 100644
--- a/fs/bfs/file.c
+++ b/fs/bfs/file.c
@@ -70,7 +70,6 @@ static int bfs_get_block(struct inode *inode, sector_t block,
70 struct super_block *sb = inode->i_sb; 70 struct super_block *sb = inode->i_sb;
71 struct bfs_sb_info *info = BFS_SB(sb); 71 struct bfs_sb_info *info = BFS_SB(sb);
72 struct bfs_inode_info *bi = BFS_I(inode); 72 struct bfs_inode_info *bi = BFS_I(inode);
73 struct buffer_head *sbh = info->si_sbh;
74 73
75 phys = bi->i_sblock + block; 74 phys = bi->i_sblock + block;
76 if (!create) { 75 if (!create) {
@@ -112,7 +111,6 @@ static int bfs_get_block(struct inode *inode, sector_t block,
112 info->si_freeb -= phys - bi->i_eblock; 111 info->si_freeb -= phys - bi->i_eblock;
113 info->si_lf_eblk = bi->i_eblock = phys; 112 info->si_lf_eblk = bi->i_eblock = phys;
114 mark_inode_dirty(inode); 113 mark_inode_dirty(inode);
115 mark_buffer_dirty(sbh);
116 err = 0; 114 err = 0;
117 goto out; 115 goto out;
118 } 116 }
@@ -147,7 +145,6 @@ static int bfs_get_block(struct inode *inode, sector_t block,
147 */ 145 */
148 info->si_freeb -= bi->i_eblock - bi->i_sblock + 1 - inode->i_blocks; 146 info->si_freeb -= bi->i_eblock - bi->i_sblock + 1 - inode->i_blocks;
149 mark_inode_dirty(inode); 147 mark_inode_dirty(inode);
150 mark_buffer_dirty(sbh);
151 map_bh(bh_result, sb, phys); 148 map_bh(bh_result, sb, phys);
152out: 149out:
153 mutex_unlock(&info->bfs_lock); 150 mutex_unlock(&info->bfs_lock);
diff --git a/fs/bfs/inode.c b/fs/bfs/inode.c
index 0499822b1568..c4daf0f5fc02 100644
--- a/fs/bfs/inode.c
+++ b/fs/bfs/inode.c
@@ -31,7 +31,6 @@ MODULE_LICENSE("GPL");
31#define dprintf(x...) 31#define dprintf(x...)
32#endif 32#endif
33 33
34static void bfs_write_super(struct super_block *s);
35void dump_imap(const char *prefix, struct super_block *s); 34void dump_imap(const char *prefix, struct super_block *s);
36 35
37struct inode *bfs_iget(struct super_block *sb, unsigned long ino) 36struct inode *bfs_iget(struct super_block *sb, unsigned long ino)
@@ -204,33 +203,11 @@ static void bfs_evict_inode(struct inode *inode)
204 * "last block of the last file" even if there is no 203 * "last block of the last file" even if there is no
205 * real file there, saves us 1 gap. 204 * real file there, saves us 1 gap.
206 */ 205 */
207 if (info->si_lf_eblk == bi->i_eblock) { 206 if (info->si_lf_eblk == bi->i_eblock)
208 info->si_lf_eblk = bi->i_sblock - 1; 207 info->si_lf_eblk = bi->i_sblock - 1;
209 mark_buffer_dirty(info->si_sbh);
210 }
211 mutex_unlock(&info->bfs_lock); 208 mutex_unlock(&info->bfs_lock);
212} 209}
213 210
214static int bfs_sync_fs(struct super_block *sb, int wait)
215{
216 struct bfs_sb_info *info = BFS_SB(sb);
217
218 mutex_lock(&info->bfs_lock);
219 mark_buffer_dirty(info->si_sbh);
220 sb->s_dirt = 0;
221 mutex_unlock(&info->bfs_lock);
222
223 return 0;
224}
225
226static void bfs_write_super(struct super_block *sb)
227{
228 if (!(sb->s_flags & MS_RDONLY))
229 bfs_sync_fs(sb, 1);
230 else
231 sb->s_dirt = 0;
232}
233
234static void bfs_put_super(struct super_block *s) 211static void bfs_put_super(struct super_block *s)
235{ 212{
236 struct bfs_sb_info *info = BFS_SB(s); 213 struct bfs_sb_info *info = BFS_SB(s);
@@ -240,10 +217,6 @@ static void bfs_put_super(struct super_block *s)
240 217
241 lock_kernel(); 218 lock_kernel();
242 219
243 if (s->s_dirt)
244 bfs_write_super(s);
245
246 brelse(info->si_sbh);
247 mutex_destroy(&info->bfs_lock); 220 mutex_destroy(&info->bfs_lock);
248 kfree(info->si_imap); 221 kfree(info->si_imap);
249 kfree(info); 222 kfree(info);
@@ -315,8 +288,6 @@ static const struct super_operations bfs_sops = {
315 .write_inode = bfs_write_inode, 288 .write_inode = bfs_write_inode,
316 .evict_inode = bfs_evict_inode, 289 .evict_inode = bfs_evict_inode,
317 .put_super = bfs_put_super, 290 .put_super = bfs_put_super,
318 .write_super = bfs_write_super,
319 .sync_fs = bfs_sync_fs,
320 .statfs = bfs_statfs, 291 .statfs = bfs_statfs,
321}; 292};
322 293
@@ -343,7 +314,7 @@ void dump_imap(const char *prefix, struct super_block *s)
343 314
344static int bfs_fill_super(struct super_block *s, void *data, int silent) 315static int bfs_fill_super(struct super_block *s, void *data, int silent)
345{ 316{
346 struct buffer_head *bh; 317 struct buffer_head *bh, *sbh;
347 struct bfs_super_block *bfs_sb; 318 struct bfs_super_block *bfs_sb;
348 struct inode *inode; 319 struct inode *inode;
349 unsigned i, imap_len; 320 unsigned i, imap_len;
@@ -359,10 +330,10 @@ static int bfs_fill_super(struct super_block *s, void *data, int silent)
359 330
360 sb_set_blocksize(s, BFS_BSIZE); 331 sb_set_blocksize(s, BFS_BSIZE);
361 332
362 info->si_sbh = sb_bread(s, 0); 333 sbh = sb_bread(s, 0);
363 if (!info->si_sbh) 334 if (!sbh)
364 goto out; 335 goto out;
365 bfs_sb = (struct bfs_super_block *)info->si_sbh->b_data; 336 bfs_sb = (struct bfs_super_block *)sbh->b_data;
366 if (le32_to_cpu(bfs_sb->s_magic) != BFS_MAGIC) { 337 if (le32_to_cpu(bfs_sb->s_magic) != BFS_MAGIC) {
367 if (!silent) 338 if (!silent)
368 printf("No BFS filesystem on %s (magic=%08x)\n", 339 printf("No BFS filesystem on %s (magic=%08x)\n",
@@ -466,10 +437,7 @@ static int bfs_fill_super(struct super_block *s, void *data, int silent)
466 info->si_lf_eblk = eblock; 437 info->si_lf_eblk = eblock;
467 } 438 }
468 brelse(bh); 439 brelse(bh);
469 if (!(s->s_flags & MS_RDONLY)) { 440 brelse(sbh);
470 mark_buffer_dirty(info->si_sbh);
471 s->s_dirt = 1;
472 }
473 dump_imap("read_super", s); 441 dump_imap("read_super", s);
474 return 0; 442 return 0;
475 443
@@ -479,7 +447,7 @@ out3:
479out2: 447out2:
480 kfree(info->si_imap); 448 kfree(info->si_imap);
481out1: 449out1:
482 brelse(info->si_sbh); 450 brelse(sbh);
483out: 451out:
484 mutex_destroy(&info->bfs_lock); 452 mutex_destroy(&info->bfs_lock);
485 kfree(info); 453 kfree(info);