aboutsummaryrefslogtreecommitdiffstats
path: root/fs/logfs/super.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/logfs/super.c')
-rw-r--r--fs/logfs/super.c85
1 files changed, 44 insertions, 41 deletions
diff --git a/fs/logfs/super.c b/fs/logfs/super.c
index 5336155c5d81..ce03a182c771 100644
--- a/fs/logfs/super.c
+++ b/fs/logfs/super.c
@@ -325,7 +325,7 @@ static int logfs_make_writeable(struct super_block *sb)
325 return 0; 325 return 0;
326} 326}
327 327
328static int logfs_get_sb_final(struct super_block *sb, struct vfsmount *mnt) 328static int logfs_get_sb_final(struct super_block *sb)
329{ 329{
330 struct logfs_super *super = logfs_super(sb); 330 struct logfs_super *super = logfs_super(sb);
331 struct inode *rootdir; 331 struct inode *rootdir;
@@ -356,7 +356,6 @@ static int logfs_get_sb_final(struct super_block *sb, struct vfsmount *mnt)
356 } 356 }
357 357
358 log_super("LogFS: Finished mounting\n"); 358 log_super("LogFS: Finished mounting\n");
359 simple_set_mnt(mnt, sb);
360 return 0; 359 return 0;
361 360
362fail: 361fail:
@@ -481,10 +480,6 @@ static int logfs_read_sb(struct super_block *sb, int read_only)
481 !read_only) 480 !read_only)
482 return -EIO; 481 return -EIO;
483 482
484 mutex_init(&super->s_dirop_mutex);
485 mutex_init(&super->s_object_alias_mutex);
486 INIT_LIST_HEAD(&super->s_freeing_list);
487
488 ret = logfs_init_rw(sb); 483 ret = logfs_init_rw(sb);
489 if (ret) 484 if (ret)
490 return ret; 485 return ret;
@@ -529,43 +524,37 @@ static void logfs_kill_sb(struct super_block *sb)
529 logfs_cleanup_rw(sb); 524 logfs_cleanup_rw(sb);
530 if (super->s_erase_page) 525 if (super->s_erase_page)
531 __free_page(super->s_erase_page); 526 __free_page(super->s_erase_page);
532 super->s_devops->put_device(sb); 527 super->s_devops->put_device(super);
533 logfs_mempool_destroy(super->s_btree_pool); 528 logfs_mempool_destroy(super->s_btree_pool);
534 logfs_mempool_destroy(super->s_alias_pool); 529 logfs_mempool_destroy(super->s_alias_pool);
535 kfree(super); 530 kfree(super);
536 log_super("LogFS: Finished unmounting\n"); 531 log_super("LogFS: Finished unmounting\n");
537} 532}
538 533
539int logfs_get_sb_device(struct file_system_type *type, int flags, 534static struct dentry *logfs_get_sb_device(struct logfs_super *super,
540 struct mtd_info *mtd, struct block_device *bdev, 535 struct file_system_type *type, int flags)
541 const struct logfs_device_ops *devops, struct vfsmount *mnt)
542{ 536{
543 struct logfs_super *super;
544 struct super_block *sb; 537 struct super_block *sb;
545 int err = -ENOMEM; 538 int err = -ENOMEM;
546 static int mount_count; 539 static int mount_count;
547 540
548 log_super("LogFS: Start mount %x\n", mount_count++); 541 log_super("LogFS: Start mount %x\n", mount_count++);
549 super = kzalloc(sizeof(*super), GFP_KERNEL);
550 if (!super)
551 goto err0;
552 542
553 super->s_mtd = mtd;
554 super->s_bdev = bdev;
555 err = -EINVAL; 543 err = -EINVAL;
556 sb = sget(type, logfs_sb_test, logfs_sb_set, super); 544 sb = sget(type, logfs_sb_test, logfs_sb_set, super);
557 if (IS_ERR(sb)) 545 if (IS_ERR(sb)) {
558 goto err0; 546 super->s_devops->put_device(super);
547 kfree(super);
548 return ERR_CAST(sb);
549 }
559 550
560 if (sb->s_root) { 551 if (sb->s_root) {
561 /* Device is already in use */ 552 /* Device is already in use */
562 err = 0; 553 super->s_devops->put_device(super);
563 simple_set_mnt(mnt, sb); 554 kfree(super);
564 goto err0; 555 return dget(sb->s_root);
565 } 556 }
566 557
567 super->s_devops = devops;
568
569 /* 558 /*
570 * sb->s_maxbytes is limited to 8TB. On 32bit systems, the page cache 559 * sb->s_maxbytes is limited to 8TB. On 32bit systems, the page cache
571 * only covers 16TB and the upper 8TB are used for indirect blocks. 560 * only covers 16TB and the upper 8TB are used for indirect blocks.
@@ -581,10 +570,12 @@ int logfs_get_sb_device(struct file_system_type *type, int flags,
581 goto err1; 570 goto err1;
582 571
583 sb->s_flags |= MS_ACTIVE; 572 sb->s_flags |= MS_ACTIVE;
584 err = logfs_get_sb_final(sb, mnt); 573 err = logfs_get_sb_final(sb);
585 if (err) 574 if (err) {
586 deactivate_locked_super(sb); 575 deactivate_locked_super(sb);
587 return err; 576 return ERR_PTR(err);
577 }
578 return dget(sb->s_root);
588 579
589err1: 580err1:
590 /* no ->s_root, no ->put_super() */ 581 /* no ->s_root, no ->put_super() */
@@ -592,37 +583,49 @@ err1:
592 iput(super->s_segfile_inode); 583 iput(super->s_segfile_inode);
593 iput(super->s_mapping_inode); 584 iput(super->s_mapping_inode);
594 deactivate_locked_super(sb); 585 deactivate_locked_super(sb);
595 return err; 586 return ERR_PTR(err);
596err0:
597 kfree(super);
598 //devops->put_device(sb);
599 return err;
600} 587}
601 588
602static int logfs_get_sb(struct file_system_type *type, int flags, 589static struct dentry *logfs_mount(struct file_system_type *type, int flags,
603 const char *devname, void *data, struct vfsmount *mnt) 590 const char *devname, void *data)
604{ 591{
605 ulong mtdnr; 592 ulong mtdnr;
593 struct logfs_super *super;
594 int err;
606 595
607 if (!devname) 596 super = kzalloc(sizeof(*super), GFP_KERNEL);
608 return logfs_get_sb_bdev(type, flags, devname, mnt); 597 if (!super)
609 if (strncmp(devname, "mtd", 3)) 598 return ERR_PTR(-ENOMEM);
610 return logfs_get_sb_bdev(type, flags, devname, mnt);
611 599
612 { 600 mutex_init(&super->s_dirop_mutex);
601 mutex_init(&super->s_object_alias_mutex);
602 INIT_LIST_HEAD(&super->s_freeing_list);
603
604 if (!devname)
605 err = logfs_get_sb_bdev(super, type, devname);
606 else if (strncmp(devname, "mtd", 3))
607 err = logfs_get_sb_bdev(super, type, devname);
608 else {
613 char *garbage; 609 char *garbage;
614 mtdnr = simple_strtoul(devname+3, &garbage, 0); 610 mtdnr = simple_strtoul(devname+3, &garbage, 0);
615 if (*garbage) 611 if (*garbage)
616 return -EINVAL; 612 err = -EINVAL;
613 else
614 err = logfs_get_sb_mtd(super, mtdnr);
615 }
616
617 if (err) {
618 kfree(super);
619 return ERR_PTR(err);
617 } 620 }
618 621
619 return logfs_get_sb_mtd(type, flags, mtdnr, mnt); 622 return logfs_get_sb_device(super, type, flags);
620} 623}
621 624
622static struct file_system_type logfs_fs_type = { 625static struct file_system_type logfs_fs_type = {
623 .owner = THIS_MODULE, 626 .owner = THIS_MODULE,
624 .name = "logfs", 627 .name = "logfs",
625 .get_sb = logfs_get_sb, 628 .mount = logfs_mount,
626 .kill_sb = logfs_kill_sb, 629 .kill_sb = logfs_kill_sb,
627 .fs_flags = FS_REQUIRES_DEV, 630 .fs_flags = FS_REQUIRES_DEV,
628 631