diff options
author | Eric Sesterhenn <snakebyte@gmx.de> | 2009-01-06 17:43:13 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-01-06 18:59:31 -0500 |
commit | 50682bb4de35544466c264c017030de826614367 (patch) | |
tree | 9e5fc77230deaa459ea4c12fdc3241ad991117e7 /fs/bfs | |
parent | e1f89ec95bd28b0927e76c46a7cc0927b7521c1d (diff) |
bfs: check that filesystem fits on the blockdevice
Since all sanity checks rely on the validity of s_start which gets only
checked to be smaller than s_end, we should also check if s_end is sane.
Now we also try to retrieve the last block of the filesystem, which is
computed by s_end. If this fails, something is bogus.
Signed-off-by: Eric Sesterhenn <snakebyte@gmx.de>
Acked-by: Tigran Aivazian <tigran@aivazian.fsnet.co.uk>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/bfs')
-rw-r--r-- | fs/bfs/inode.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/fs/bfs/inode.c b/fs/bfs/inode.c index 1d2bfafcad7c..cc4062d12ca2 100644 --- a/fs/bfs/inode.c +++ b/fs/bfs/inode.c | |||
@@ -390,6 +390,18 @@ static int bfs_fill_super(struct super_block *s, void *data, int silent) | |||
390 | - le32_to_cpu(bfs_sb->s_start)) >> BFS_BSIZE_BITS; | 390 | - le32_to_cpu(bfs_sb->s_start)) >> BFS_BSIZE_BITS; |
391 | info->si_freei = 0; | 391 | info->si_freei = 0; |
392 | info->si_lf_eblk = 0; | 392 | info->si_lf_eblk = 0; |
393 | |||
394 | /* can we read the last block? */ | ||
395 | bh = sb_bread(s, info->si_blocks - 1); | ||
396 | if (!bh) { | ||
397 | printf("Last block not available: %lu\n", info->si_blocks - 1); | ||
398 | iput(inode); | ||
399 | ret = -EIO; | ||
400 | kfree(info->si_imap); | ||
401 | goto out; | ||
402 | } | ||
403 | brelse(bh); | ||
404 | |||
393 | bh = NULL; | 405 | bh = NULL; |
394 | for (i = BFS_ROOT_INO; i <= info->si_lasti; i++) { | 406 | for (i = BFS_ROOT_INO; i <= info->si_lasti; i++) { |
395 | struct bfs_inode *di; | 407 | struct bfs_inode *di; |