diff options
Diffstat (limited to 'fs/bfs/inode.c')
| -rw-r--r-- | fs/bfs/inode.c | 44 |
1 files changed, 31 insertions, 13 deletions
diff --git a/fs/bfs/inode.c b/fs/bfs/inode.c index c7b39aa279d7..3af6c73c5b5a 100644 --- a/fs/bfs/inode.c +++ b/fs/bfs/inode.c | |||
| @@ -357,28 +357,46 @@ static int bfs_fill_super(struct super_block *s, void *data, int silent) | |||
| 357 | } | 357 | } |
| 358 | 358 | ||
| 359 | info->si_blocks = (le32_to_cpu(bfs_sb->s_end) + 1)>>BFS_BSIZE_BITS; /* for statfs(2) */ | 359 | info->si_blocks = (le32_to_cpu(bfs_sb->s_end) + 1)>>BFS_BSIZE_BITS; /* for statfs(2) */ |
| 360 | info->si_freeb = (le32_to_cpu(bfs_sb->s_end) + 1 - cpu_to_le32(bfs_sb->s_start))>>BFS_BSIZE_BITS; | 360 | info->si_freeb = (le32_to_cpu(bfs_sb->s_end) + 1 - le32_to_cpu(bfs_sb->s_start))>>BFS_BSIZE_BITS; |
| 361 | info->si_freei = 0; | 361 | info->si_freei = 0; |
| 362 | info->si_lf_eblk = 0; | 362 | info->si_lf_eblk = 0; |
| 363 | info->si_lf_sblk = 0; | 363 | info->si_lf_sblk = 0; |
| 364 | info->si_lf_ioff = 0; | 364 | info->si_lf_ioff = 0; |
| 365 | bh = NULL; | ||
| 365 | for (i=BFS_ROOT_INO; i<=info->si_lasti; i++) { | 366 | for (i=BFS_ROOT_INO; i<=info->si_lasti; i++) { |
| 366 | inode = iget(s,i); | 367 | struct bfs_inode *di; |
| 367 | if (BFS_I(inode)->i_dsk_ino == 0) | 368 | int block = (i - BFS_ROOT_INO)/BFS_INODES_PER_BLOCK + 1; |
| 369 | int off = (i - BFS_ROOT_INO) % BFS_INODES_PER_BLOCK; | ||
| 370 | unsigned long sblock, eblock; | ||
| 371 | |||
| 372 | if (!off) { | ||
| 373 | brelse(bh); | ||
| 374 | bh = sb_bread(s, block); | ||
| 375 | } | ||
| 376 | |||
| 377 | if (!bh) | ||
| 378 | continue; | ||
| 379 | |||
| 380 | di = (struct bfs_inode *)bh->b_data + off; | ||
| 381 | |||
| 382 | if (!di->i_ino) { | ||
| 368 | info->si_freei++; | 383 | info->si_freei++; |
| 369 | else { | 384 | continue; |
| 370 | set_bit(i, info->si_imap); | 385 | } |
| 371 | info->si_freeb -= inode->i_blocks; | 386 | set_bit(i, info->si_imap); |
| 372 | if (BFS_I(inode)->i_eblock > info->si_lf_eblk) { | 387 | info->si_freeb -= BFS_FILEBLOCKS(di); |
| 373 | info->si_lf_eblk = BFS_I(inode)->i_eblock; | 388 | |
| 374 | info->si_lf_sblk = BFS_I(inode)->i_sblock; | 389 | sblock = le32_to_cpu(di->i_sblock); |
| 375 | info->si_lf_ioff = BFS_INO2OFF(i); | 390 | eblock = le32_to_cpu(di->i_eblock); |
| 376 | } | 391 | if (eblock > info->si_lf_eblk) { |
| 392 | info->si_lf_eblk = eblock; | ||
| 393 | info->si_lf_sblk = sblock; | ||
| 394 | info->si_lf_ioff = BFS_INO2OFF(i); | ||
| 377 | } | 395 | } |
| 378 | iput(inode); | ||
| 379 | } | 396 | } |
| 397 | brelse(bh); | ||
| 380 | if (!(s->s_flags & MS_RDONLY)) { | 398 | if (!(s->s_flags & MS_RDONLY)) { |
| 381 | mark_buffer_dirty(bh); | 399 | mark_buffer_dirty(info->si_sbh); |
| 382 | s->s_dirt = 1; | 400 | s->s_dirt = 1; |
| 383 | } | 401 | } |
| 384 | dump_imap("read_super", s); | 402 | dump_imap("read_super", s); |
