diff options
Diffstat (limited to 'fs/logfs/super.c')
| -rw-r--r-- | fs/logfs/super.c | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/fs/logfs/super.c b/fs/logfs/super.c index d651e10a1e9c..5336155c5d81 100644 --- a/fs/logfs/super.c +++ b/fs/logfs/super.c | |||
| @@ -342,24 +342,27 @@ static int logfs_get_sb_final(struct super_block *sb, struct vfsmount *mnt) | |||
| 342 | goto fail; | 342 | goto fail; |
| 343 | } | 343 | } |
| 344 | 344 | ||
| 345 | /* at that point we know that ->put_super() will be called */ | ||
| 345 | super->s_erase_page = alloc_pages(GFP_KERNEL, 0); | 346 | super->s_erase_page = alloc_pages(GFP_KERNEL, 0); |
| 346 | if (!super->s_erase_page) | 347 | if (!super->s_erase_page) |
| 347 | goto fail; | 348 | return -ENOMEM; |
| 348 | memset(page_address(super->s_erase_page), 0xFF, PAGE_SIZE); | 349 | memset(page_address(super->s_erase_page), 0xFF, PAGE_SIZE); |
| 349 | 350 | ||
| 350 | /* FIXME: check for read-only mounts */ | 351 | /* FIXME: check for read-only mounts */ |
| 351 | err = logfs_make_writeable(sb); | 352 | err = logfs_make_writeable(sb); |
| 352 | if (err) | 353 | if (err) { |
| 353 | goto fail1; | 354 | __free_page(super->s_erase_page); |
| 355 | return err; | ||
| 356 | } | ||
| 354 | 357 | ||
| 355 | log_super("LogFS: Finished mounting\n"); | 358 | log_super("LogFS: Finished mounting\n"); |
| 356 | simple_set_mnt(mnt, sb); | 359 | simple_set_mnt(mnt, sb); |
| 357 | return 0; | 360 | return 0; |
| 358 | 361 | ||
| 359 | fail1: | ||
| 360 | __free_page(super->s_erase_page); | ||
| 361 | fail: | 362 | fail: |
| 362 | iput(logfs_super(sb)->s_master_inode); | 363 | iput(super->s_master_inode); |
| 364 | iput(super->s_segfile_inode); | ||
| 365 | iput(super->s_mapping_inode); | ||
| 363 | return -EIO; | 366 | return -EIO; |
| 364 | } | 367 | } |
| 365 | 368 | ||
| @@ -580,10 +583,14 @@ int logfs_get_sb_device(struct file_system_type *type, int flags, | |||
| 580 | sb->s_flags |= MS_ACTIVE; | 583 | sb->s_flags |= MS_ACTIVE; |
| 581 | err = logfs_get_sb_final(sb, mnt); | 584 | err = logfs_get_sb_final(sb, mnt); |
| 582 | if (err) | 585 | if (err) |
| 583 | goto err1; | 586 | deactivate_locked_super(sb); |
| 584 | return 0; | 587 | return err; |
| 585 | 588 | ||
| 586 | err1: | 589 | err1: |
| 590 | /* no ->s_root, no ->put_super() */ | ||
| 591 | iput(super->s_master_inode); | ||
| 592 | iput(super->s_segfile_inode); | ||
| 593 | iput(super->s_mapping_inode); | ||
| 587 | deactivate_locked_super(sb); | 594 | deactivate_locked_super(sb); |
| 588 | return err; | 595 | return err; |
| 589 | err0: | 596 | err0: |
