diff options
Diffstat (limited to 'fs/logfs/super.c')
| -rw-r--r-- | fs/logfs/super.c | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/fs/logfs/super.c b/fs/logfs/super.c index 5866ee6e1327..d651e10a1e9c 100644 --- a/fs/logfs/super.c +++ b/fs/logfs/super.c | |||
| @@ -138,10 +138,14 @@ static int logfs_sb_set(struct super_block *sb, void *_super) | |||
| 138 | sb->s_fs_info = super; | 138 | sb->s_fs_info = super; |
| 139 | sb->s_mtd = super->s_mtd; | 139 | sb->s_mtd = super->s_mtd; |
| 140 | sb->s_bdev = super->s_bdev; | 140 | sb->s_bdev = super->s_bdev; |
| 141 | #ifdef CONFIG_BLOCK | ||
| 141 | if (sb->s_bdev) | 142 | if (sb->s_bdev) |
| 142 | sb->s_bdi = &bdev_get_queue(sb->s_bdev)->backing_dev_info; | 143 | sb->s_bdi = &bdev_get_queue(sb->s_bdev)->backing_dev_info; |
| 144 | #endif | ||
| 145 | #ifdef CONFIG_MTD | ||
| 143 | if (sb->s_mtd) | 146 | if (sb->s_mtd) |
| 144 | sb->s_bdi = sb->s_mtd->backing_dev_info; | 147 | sb->s_bdi = sb->s_mtd->backing_dev_info; |
| 148 | #endif | ||
| 145 | return 0; | 149 | return 0; |
| 146 | } | 150 | } |
| 147 | 151 | ||
| @@ -333,27 +337,27 @@ static int logfs_get_sb_final(struct super_block *sb, struct vfsmount *mnt) | |||
| 333 | goto fail; | 337 | goto fail; |
| 334 | 338 | ||
| 335 | sb->s_root = d_alloc_root(rootdir); | 339 | sb->s_root = d_alloc_root(rootdir); |
| 336 | if (!sb->s_root) | 340 | if (!sb->s_root) { |
| 337 | goto fail2; | 341 | iput(rootdir); |
| 342 | goto fail; | ||
| 343 | } | ||
| 338 | 344 | ||
| 339 | super->s_erase_page = alloc_pages(GFP_KERNEL, 0); | 345 | super->s_erase_page = alloc_pages(GFP_KERNEL, 0); |
| 340 | if (!super->s_erase_page) | 346 | if (!super->s_erase_page) |
| 341 | goto fail2; | 347 | goto fail; |
| 342 | memset(page_address(super->s_erase_page), 0xFF, PAGE_SIZE); | 348 | memset(page_address(super->s_erase_page), 0xFF, PAGE_SIZE); |
| 343 | 349 | ||
| 344 | /* FIXME: check for read-only mounts */ | 350 | /* FIXME: check for read-only mounts */ |
| 345 | err = logfs_make_writeable(sb); | 351 | err = logfs_make_writeable(sb); |
| 346 | if (err) | 352 | if (err) |
| 347 | goto fail3; | 353 | goto fail1; |
| 348 | 354 | ||
| 349 | log_super("LogFS: Finished mounting\n"); | 355 | log_super("LogFS: Finished mounting\n"); |
| 350 | simple_set_mnt(mnt, sb); | 356 | simple_set_mnt(mnt, sb); |
| 351 | return 0; | 357 | return 0; |
| 352 | 358 | ||
| 353 | fail3: | 359 | fail1: |
| 354 | __free_page(super->s_erase_page); | 360 | __free_page(super->s_erase_page); |
| 355 | fail2: | ||
| 356 | iput(rootdir); | ||
| 357 | fail: | 361 | fail: |
| 358 | iput(logfs_super(sb)->s_master_inode); | 362 | iput(logfs_super(sb)->s_master_inode); |
| 359 | return -EIO; | 363 | return -EIO; |
| @@ -382,7 +386,7 @@ static struct page *find_super_block(struct super_block *sb) | |||
| 382 | if (!first || IS_ERR(first)) | 386 | if (!first || IS_ERR(first)) |
| 383 | return NULL; | 387 | return NULL; |
| 384 | last = super->s_devops->find_last_sb(sb, &super->s_sb_ofs[1]); | 388 | last = super->s_devops->find_last_sb(sb, &super->s_sb_ofs[1]); |
| 385 | if (!last || IS_ERR(first)) { | 389 | if (!last || IS_ERR(last)) { |
| 386 | page_cache_release(first); | 390 | page_cache_release(first); |
| 387 | return NULL; | 391 | return NULL; |
| 388 | } | 392 | } |
| @@ -413,7 +417,7 @@ static int __logfs_read_sb(struct super_block *sb) | |||
| 413 | 417 | ||
| 414 | page = find_super_block(sb); | 418 | page = find_super_block(sb); |
| 415 | if (!page) | 419 | if (!page) |
| 416 | return -EIO; | 420 | return -EINVAL; |
| 417 | 421 | ||
| 418 | ds = page_address(page); | 422 | ds = page_address(page); |
| 419 | super->s_size = be64_to_cpu(ds->ds_filesystem_size); | 423 | super->s_size = be64_to_cpu(ds->ds_filesystem_size); |
