diff options
| -rw-r--r-- | fs/bfs/inode.c | 43 |
1 files changed, 21 insertions, 22 deletions
diff --git a/fs/bfs/inode.c b/fs/bfs/inode.c index 6f60336c6628..8f3d9fd89604 100644 --- a/fs/bfs/inode.c +++ b/fs/bfs/inode.c | |||
| @@ -353,35 +353,35 @@ static int bfs_fill_super(struct super_block *s, void *data, int silent) | |||
| 353 | struct inode *inode; | 353 | struct inode *inode; |
| 354 | unsigned i, imap_len; | 354 | unsigned i, imap_len; |
| 355 | struct bfs_sb_info *info; | 355 | struct bfs_sb_info *info; |
| 356 | long ret = -EINVAL; | 356 | int ret = -EINVAL; |
| 357 | unsigned long i_sblock, i_eblock, i_eoff, s_size; | 357 | unsigned long i_sblock, i_eblock, i_eoff, s_size; |
| 358 | 358 | ||
| 359 | info = kzalloc(sizeof(*info), GFP_KERNEL); | 359 | info = kzalloc(sizeof(*info), GFP_KERNEL); |
| 360 | if (!info) | 360 | if (!info) |
| 361 | return -ENOMEM; | 361 | return -ENOMEM; |
| 362 | mutex_init(&info->bfs_lock); | ||
| 362 | s->s_fs_info = info; | 363 | s->s_fs_info = info; |
| 363 | 364 | ||
| 364 | sb_set_blocksize(s, BFS_BSIZE); | 365 | sb_set_blocksize(s, BFS_BSIZE); |
| 365 | 366 | ||
| 366 | bh = sb_bread(s, 0); | 367 | info->si_sbh = sb_bread(s, 0); |
| 367 | if(!bh) | 368 | if (!info->si_sbh) |
| 368 | goto out; | 369 | goto out; |
| 369 | bfs_sb = (struct bfs_super_block *)bh->b_data; | 370 | bfs_sb = (struct bfs_super_block *)info->si_sbh->b_data; |
| 370 | if (le32_to_cpu(bfs_sb->s_magic) != BFS_MAGIC) { | 371 | if (le32_to_cpu(bfs_sb->s_magic) != BFS_MAGIC) { |
| 371 | if (!silent) | 372 | if (!silent) |
| 372 | printf("No BFS filesystem on %s (magic=%08x)\n", | 373 | printf("No BFS filesystem on %s (magic=%08x)\n", |
| 373 | s->s_id, le32_to_cpu(bfs_sb->s_magic)); | 374 | s->s_id, le32_to_cpu(bfs_sb->s_magic)); |
| 374 | goto out; | 375 | goto out1; |
| 375 | } | 376 | } |
| 376 | if (BFS_UNCLEAN(bfs_sb, s) && !silent) | 377 | if (BFS_UNCLEAN(bfs_sb, s) && !silent) |
| 377 | printf("%s is unclean, continuing\n", s->s_id); | 378 | printf("%s is unclean, continuing\n", s->s_id); |
| 378 | 379 | ||
| 379 | s->s_magic = BFS_MAGIC; | 380 | s->s_magic = BFS_MAGIC; |
| 380 | info->si_sbh = bh; | ||
| 381 | 381 | ||
| 382 | if (le32_to_cpu(bfs_sb->s_start) > le32_to_cpu(bfs_sb->s_end)) { | 382 | if (le32_to_cpu(bfs_sb->s_start) > le32_to_cpu(bfs_sb->s_end)) { |
| 383 | printf("Superblock is corrupted\n"); | 383 | printf("Superblock is corrupted\n"); |
| 384 | goto out; | 384 | goto out1; |
| 385 | } | 385 | } |
| 386 | 386 | ||
| 387 | info->si_lasti = (le32_to_cpu(bfs_sb->s_start) - BFS_BSIZE) / | 387 | info->si_lasti = (le32_to_cpu(bfs_sb->s_start) - BFS_BSIZE) / |
| @@ -390,7 +390,7 @@ static int bfs_fill_super(struct super_block *s, void *data, int silent) | |||
| 390 | imap_len = (info->si_lasti / 8) + 1; | 390 | imap_len = (info->si_lasti / 8) + 1; |
| 391 | info->si_imap = kzalloc(imap_len, GFP_KERNEL); | 391 | info->si_imap = kzalloc(imap_len, GFP_KERNEL); |
| 392 | if (!info->si_imap) | 392 | if (!info->si_imap) |
| 393 | goto out; | 393 | goto out1; |
| 394 | for (i = 0; i < BFS_ROOT_INO; i++) | 394 | for (i = 0; i < BFS_ROOT_INO; i++) |
| 395 | set_bit(i, info->si_imap); | 395 | set_bit(i, info->si_imap); |
| 396 | 396 | ||
| @@ -398,15 +398,13 @@ static int bfs_fill_super(struct super_block *s, void *data, int silent) | |||
| 398 | inode = bfs_iget(s, BFS_ROOT_INO); | 398 | inode = bfs_iget(s, BFS_ROOT_INO); |
| 399 | if (IS_ERR(inode)) { | 399 | if (IS_ERR(inode)) { |
| 400 | ret = PTR_ERR(inode); | 400 | ret = PTR_ERR(inode); |
| 401 | kfree(info->si_imap); | 401 | goto out2; |
| 402 | goto out; | ||
| 403 | } | 402 | } |
| 404 | s->s_root = d_alloc_root(inode); | 403 | s->s_root = d_alloc_root(inode); |
| 405 | if (!s->s_root) { | 404 | if (!s->s_root) { |
| 406 | iput(inode); | 405 | iput(inode); |
| 407 | ret = -ENOMEM; | 406 | ret = -ENOMEM; |
| 408 | kfree(info->si_imap); | 407 | goto out2; |
| 409 | goto out; | ||
| 410 | } | 408 | } |
| 411 | 409 | ||
| 412 | info->si_blocks = (le32_to_cpu(bfs_sb->s_end) + 1) >> BFS_BSIZE_BITS; | 410 | info->si_blocks = (le32_to_cpu(bfs_sb->s_end) + 1) >> BFS_BSIZE_BITS; |
| @@ -419,10 +417,8 @@ static int bfs_fill_super(struct super_block *s, void *data, int silent) | |||
| 419 | bh = sb_bread(s, info->si_blocks - 1); | 417 | bh = sb_bread(s, info->si_blocks - 1); |
| 420 | if (!bh) { | 418 | if (!bh) { |
| 421 | printf("Last block not available: %lu\n", info->si_blocks - 1); | 419 | printf("Last block not available: %lu\n", info->si_blocks - 1); |
| 422 | iput(inode); | ||
| 423 | ret = -EIO; | 420 | ret = -EIO; |
| 424 | kfree(info->si_imap); | 421 | goto out3; |
| 425 | goto out; | ||
| 426 | } | 422 | } |
| 427 | brelse(bh); | 423 | brelse(bh); |
| 428 | 424 | ||
| @@ -459,11 +455,8 @@ static int bfs_fill_super(struct super_block *s, void *data, int silent) | |||
| 459 | printf("Inode 0x%08x corrupted\n", i); | 455 | printf("Inode 0x%08x corrupted\n", i); |
| 460 | 456 | ||
| 461 | brelse(bh); | 457 | brelse(bh); |
| 462 | s->s_root = NULL; | 458 | ret = -EIO; |
| 463 | kfree(info->si_imap); | 459 | goto out3; |
| 464 | kfree(info); | ||
| 465 | s->s_fs_info = NULL; | ||
| 466 | return -EIO; | ||
| 467 | } | 460 | } |
| 468 | 461 | ||
| 469 | if (!di->i_ino) { | 462 | if (!di->i_ino) { |
| @@ -483,11 +476,17 @@ static int bfs_fill_super(struct super_block *s, void *data, int silent) | |||
| 483 | s->s_dirt = 1; | 476 | s->s_dirt = 1; |
| 484 | } | 477 | } |
| 485 | dump_imap("read_super", s); | 478 | dump_imap("read_super", s); |
| 486 | mutex_init(&info->bfs_lock); | ||
| 487 | return 0; | 479 | return 0; |
| 488 | 480 | ||
| 481 | out3: | ||
| 482 | dput(s->s_root); | ||
| 483 | s->s_root = NULL; | ||
| 484 | out2: | ||
| 485 | kfree(info->si_imap); | ||
| 486 | out1: | ||
| 487 | brelse(info->si_sbh); | ||
| 489 | out: | 488 | out: |
| 490 | brelse(bh); | 489 | mutex_destroy(&info->bfs_lock); |
| 491 | kfree(info); | 490 | kfree(info); |
| 492 | s->s_fs_info = NULL; | 491 | s->s_fs_info = NULL; |
| 493 | return ret; | 492 | return ret; |
