]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - fs/ext4/super.c
spi: spi-adi-v3: convert to use common clk framework
[karo-tx-linux.git] / fs / ext4 / super.c
index 710fed2377d415a32b0658faabde9960ff639b84..f3c667091618d8b26e09964dafe2f673a4c6cbd3 100644 (file)
@@ -59,6 +59,7 @@ static struct kset *ext4_kset;
 static struct ext4_lazy_init *ext4_li_info;
 static struct mutex ext4_li_mtx;
 static struct ext4_features *ext4_feat;
+static int ext4_mballoc_ready;
 
 static int ext4_load_journal(struct super_block *, struct ext4_super_block *,
                             unsigned long journal_devnum);
@@ -845,6 +846,10 @@ static void ext4_put_super(struct super_block *sb)
                invalidate_bdev(sbi->journal_bdev);
                ext4_blkdev_remove(sbi);
        }
+       if (sbi->s_mb_cache) {
+               ext4_xattr_destroy_cache(sbi->s_mb_cache);
+               sbi->s_mb_cache = NULL;
+       }
        if (sbi->s_mmp_tsk)
                kthread_stop(sbi->s_mmp_tsk);
        sb->s_fs_info = NULL;
@@ -940,7 +945,7 @@ static void init_once(void *foo)
        inode_init_once(&ei->vfs_inode);
 }
 
-static int init_inodecache(void)
+static int __init init_inodecache(void)
 {
        ext4_inode_cachep = kmem_cache_create("ext4_inode_cache",
                                             sizeof(struct ext4_inode_info),
@@ -3575,6 +3580,16 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
                       "feature flags set on rev 0 fs, "
                       "running e2fsck is recommended");
 
+       if (es->s_creator_os == cpu_to_le32(EXT4_OS_HURD)) {
+               set_opt2(sb, HURD_COMPAT);
+               if (EXT4_HAS_INCOMPAT_FEATURE(sb,
+                                             EXT4_FEATURE_INCOMPAT_64BIT)) {
+                       ext4_msg(sb, KERN_ERR,
+                                "The Hurd can't support 64-bit file systems");
+                       goto failed_mount;
+               }
+       }
+
        if (IS_EXT2_SB(sb)) {
                if (ext2_feature_set_ok(sb))
                        ext4_msg(sb, KERN_INFO, "mounting ext2 file system "
@@ -4010,6 +4025,14 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
        percpu_counter_set(&sbi->s_dirtyclusters_counter, 0);
 
 no_journal:
+       if (ext4_mballoc_ready) {
+               sbi->s_mb_cache = ext4_xattr_create_cache(sb->s_id);
+               if (!sbi->s_mb_cache) {
+                       ext4_msg(sb, KERN_ERR, "Failed to create an mb_cache");
+                       goto failed_mount_wq;
+               }
+       }
+
        /*
         * Get the # of file system overhead blocks from the
         * superblock if present.
@@ -4835,6 +4858,9 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data)
                }
 
                if (*flags & MS_RDONLY) {
+                       err = sync_filesystem(sb);
+                       if (err < 0)
+                               goto restore_opts;
                        err = dquot_suspend(sb, -1);
                        if (err < 0)
                                goto restore_opts;
@@ -5515,12 +5541,10 @@ static int __init ext4_init_fs(void)
                goto out4;
 
        err = ext4_init_mballoc();
-       if (err)
-               goto out3;
-
-       err = ext4_init_xattr();
        if (err)
                goto out2;
+       else
+               ext4_mballoc_ready = 1;
        err = init_inodecache();
        if (err)
                goto out1;
@@ -5536,10 +5560,9 @@ out:
        unregister_as_ext3();
        destroy_inodecache();
 out1:
-       ext4_exit_xattr();
-out2:
+       ext4_mballoc_ready = 0;
        ext4_exit_mballoc();
-out3:
+out2:
        ext4_exit_feat_adverts();
 out4:
        if (ext4_proc_root)
@@ -5562,7 +5585,6 @@ static void __exit ext4_exit_fs(void)
        unregister_as_ext3();
        unregister_filesystem(&ext4_fs_type);
        destroy_inodecache();
-       ext4_exit_xattr();
        ext4_exit_mballoc();
        ext4_exit_feat_adverts();
        remove_proc_entry("fs/ext4", NULL);