Merge tag 'sound-fix-3.17-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai...
[cascardo/linux.git] / fs / f2fs / super.c
index 8f96d93..657582f 100644 (file)
@@ -52,6 +52,7 @@ enum {
        Opt_inline_xattr,
        Opt_inline_data,
        Opt_flush_merge,
+       Opt_nobarrier,
        Opt_err,
 };
 
@@ -69,6 +70,7 @@ static match_table_t f2fs_tokens = {
        {Opt_inline_xattr, "inline_xattr"},
        {Opt_inline_data, "inline_data"},
        {Opt_flush_merge, "flush_merge"},
+       {Opt_nobarrier, "nobarrier"},
        {Opt_err, NULL},
 };
 
@@ -339,6 +341,9 @@ static int parse_options(struct super_block *sb, char *options)
                case Opt_flush_merge:
                        set_opt(sbi, FLUSH_MERGE);
                        break;
+               case Opt_nobarrier:
+                       set_opt(sbi, NOBARRIER);
+                       break;
                default:
                        f2fs_msg(sb, KERN_ERR,
                                "Unrecognized mount option \"%s\" or missing value",
@@ -544,6 +549,8 @@ static int f2fs_show_options(struct seq_file *seq, struct dentry *root)
                seq_puts(seq, ",inline_data");
        if (!f2fs_readonly(sbi->sb) && test_opt(sbi, FLUSH_MERGE))
                seq_puts(seq, ",flush_merge");
+       if (test_opt(sbi, NOBARRIER))
+               seq_puts(seq, ",nobarrier");
        seq_printf(seq, ",active_logs=%u", sbi->active_logs);
 
        return 0;
@@ -615,7 +622,7 @@ static int f2fs_remount(struct super_block *sb, int *flags, char *data)
         * Previous and new state of filesystem is RO,
         * so skip checking GC and FLUSH_MERGE conditions.
         */
-       if ((sb->s_flags & MS_RDONLY) && (*flags & MS_RDONLY))
+       if (f2fs_readonly(sb) && (*flags & MS_RDONLY))
                goto skip;
 
        /*
@@ -642,8 +649,7 @@ static int f2fs_remount(struct super_block *sb, int *flags, char *data)
         */
        if ((*flags & MS_RDONLY) || !test_opt(sbi, FLUSH_MERGE)) {
                destroy_flush_cmd_control(sbi);
-       } else if (test_opt(sbi, FLUSH_MERGE) &&
-                                       !sbi->sm_info->cmd_control_info) {
+       } else if (test_opt(sbi, FLUSH_MERGE) && !SM_I(sbi)->cmd_control_info) {
                err = create_flush_cmd_control(sbi);
                if (err)
                        goto restore_gc;
@@ -947,7 +953,7 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent)
        mutex_init(&sbi->gc_mutex);
        mutex_init(&sbi->writepages);
        mutex_init(&sbi->cp_mutex);
-       mutex_init(&sbi->node_write);
+       init_rwsem(&sbi->node_write);
        sbi->por_doing = false;
        spin_lock_init(&sbi->stat_lock);
 
@@ -997,7 +1003,7 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent)
        INIT_LIST_HEAD(&sbi->dir_inode_list);
        spin_lock_init(&sbi->dir_inode_lock);
 
-       init_orphan_info(sbi);
+       init_ino_entry_info(sbi);
 
        /* setup f2fs internal modules */
        err = build_segment_manager(sbi);
@@ -1034,8 +1040,9 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent)
                goto free_node_inode;
        }
        if (!S_ISDIR(root->i_mode) || !root->i_blocks || !root->i_size) {
+               iput(root);
                err = -EINVAL;
-               goto free_root_inode;
+               goto free_node_inode;
        }
 
        sb->s_root = d_make_root(root); /* allocate root dentry */
@@ -1082,7 +1089,7 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent)
         * If filesystem is not mounted as read-only then
         * do start the gc_thread.
         */
-       if (!(sb->s_flags & MS_RDONLY)) {
+       if (!f2fs_readonly(sb)) {
                /* After POR, we can run background GC thread.*/
                err = start_gc_thread(sbi);
                if (err)