Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs
[linux-2.6-block.git] / fs / ext4 / super.c
index 2ed6596feadfcd307d680f0c04fe22c2a8f460e8..5392975158963118f7eeba2dcf8d560ec485e53d 100644 (file)
@@ -55,7 +55,6 @@
 
 static struct ext4_lazy_init *ext4_li_info;
 static struct mutex ext4_li_mtx;
-static int ext4_mballoc_ready;
 static struct ratelimit_state ext4_mount_msg_ratelimit;
 
 static int ext4_load_journal(struct super_block *, struct ext4_super_block *,
@@ -844,7 +843,6 @@ static void ext4_put_super(struct super_block *sb)
        ext4_release_system_zone(sb);
        ext4_mb_release(sb);
        ext4_ext_release(sb);
-       ext4_xattr_put_super(sb);
 
        if (!(sb->s_flags & MS_RDONLY)) {
                ext4_clear_feature_journal_needs_recovery(sb);
@@ -944,7 +942,6 @@ static struct inode *ext4_alloc_inode(struct super_block *sb)
        spin_lock_init(&ei->i_completed_io_lock);
        ei->i_sync_tid = 0;
        ei->i_datasync_tid = 0;
-       atomic_set(&ei->i_ioend_count, 0);
        atomic_set(&ei->i_unwritten, 0);
        INIT_WORK(&ei->i_rsv_conversion_work, ext4_end_io_rsv_work);
 #ifdef CONFIG_EXT4_FS_ENCRYPTION
@@ -1427,9 +1424,9 @@ static const struct mount_opts {
        {Opt_err_ro, EXT4_MOUNT_ERRORS_RO, MOPT_SET | MOPT_CLEAR_ERR},
        {Opt_err_cont, EXT4_MOUNT_ERRORS_CONT, MOPT_SET | MOPT_CLEAR_ERR},
        {Opt_data_err_abort, EXT4_MOUNT_DATA_ERR_ABORT,
-        MOPT_NO_EXT2 | MOPT_SET},
+        MOPT_NO_EXT2},
        {Opt_data_err_ignore, EXT4_MOUNT_DATA_ERR_ABORT,
-        MOPT_NO_EXT2 | MOPT_CLEAR},
+        MOPT_NO_EXT2},
        {Opt_barrier, EXT4_MOUNT_BARRIER, MOPT_SET},
        {Opt_nobarrier, EXT4_MOUNT_BARRIER, MOPT_CLEAR},
        {Opt_noauto_da_alloc, EXT4_MOUNT_NO_AUTO_DA_ALLOC, MOPT_SET},
@@ -1707,6 +1704,10 @@ static int handle_mount_opt(struct super_block *sb, char *opt, int token,
                ext4_msg(sb, KERN_INFO, "dax option not supported");
                return -1;
 #endif
+       } else if (token == Opt_data_err_abort) {
+               sbi->s_mount_opt |= m->mount_opt;
+       } else if (token == Opt_data_err_ignore) {
+               sbi->s_mount_opt &= ~m->mount_opt;
        } else {
                if (!args->from)
                        arg = 1;
@@ -1916,6 +1917,8 @@ static int _ext4_show_options(struct seq_file *seq, struct super_block *sb,
                SEQ_OPTS_PRINT("init_itable=%u", sbi->s_li_wait_mult);
        if (nodefs || sbi->s_max_dir_size_kb)
                SEQ_OPTS_PRINT("max_dir_size_kb=%u", sbi->s_max_dir_size_kb);
+       if (test_opt(sb, DATA_ERR_ABORT))
+               SEQ_OPTS_PUTS("data_err=abort");
 
        ext4_show_quota_options(seq, sb);
        return 0;
@@ -3798,12 +3801,10 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
        sbi->s_journal->j_commit_callback = ext4_journal_commit_callback;
 
 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;
-               }
+       sbi->s_mb_cache = ext4_xattr_create_cache();
+       if (!sbi->s_mb_cache) {
+               ext4_msg(sb, KERN_ERR, "Failed to create an mb_cache");
+               goto failed_mount_wq;
        }
 
        if ((DUMMY_ENCRYPTION_ENABLED(sbi) || ext4_has_feature_encrypt(sb)) &&
@@ -4029,6 +4030,10 @@ failed_mount4:
        if (EXT4_SB(sb)->rsv_conversion_wq)
                destroy_workqueue(EXT4_SB(sb)->rsv_conversion_wq);
 failed_mount_wq:
+       if (sbi->s_mb_cache) {
+               ext4_xattr_destroy_cache(sbi->s_mb_cache);
+               sbi->s_mb_cache = NULL;
+       }
        if (sbi->s_journal) {
                jbd2_journal_destroy(sbi->s_journal);
                sbi->s_journal = NULL;
@@ -5323,7 +5328,6 @@ MODULE_ALIAS_FS("ext4");
 
 /* Shared across all ext4 file systems */
 wait_queue_head_t ext4__ioend_wq[EXT4_WQ_HASH_SZ];
-struct mutex ext4__aio_mutex[EXT4_WQ_HASH_SZ];
 
 static int __init ext4_init_fs(void)
 {
@@ -5336,10 +5340,8 @@ static int __init ext4_init_fs(void)
        /* Build-time check for flags consistency */
        ext4_check_flag_values();
 
-       for (i = 0; i < EXT4_WQ_HASH_SZ; i++) {
-               mutex_init(&ext4__aio_mutex[i]);
+       for (i = 0; i < EXT4_WQ_HASH_SZ; i++)
                init_waitqueue_head(&ext4__ioend_wq[i]);
-       }
 
        err = ext4_init_es();
        if (err)
@@ -5360,8 +5362,6 @@ static int __init ext4_init_fs(void)
        err = ext4_init_mballoc();
        if (err)
                goto out2;
-       else
-               ext4_mballoc_ready = 1;
        err = init_inodecache();
        if (err)
                goto out1;
@@ -5377,7 +5377,6 @@ out:
        unregister_as_ext3();
        destroy_inodecache();
 out1:
-       ext4_mballoc_ready = 0;
        ext4_exit_mballoc();
 out2:
        ext4_exit_sysfs();