diff options
Diffstat (limited to 'fs/ext4/super.c')
-rw-r--r-- | fs/ext4/super.c | 37 |
1 files changed, 33 insertions, 4 deletions
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index dc7a97e79e3b..5e8f9077b0fc 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c | |||
@@ -709,6 +709,7 @@ static struct inode *ext4_alloc_inode(struct super_block *sb) | |||
709 | ei->i_reserved_quota = 0; | 709 | ei->i_reserved_quota = 0; |
710 | #endif | 710 | #endif |
711 | INIT_LIST_HEAD(&ei->i_completed_io_list); | 711 | INIT_LIST_HEAD(&ei->i_completed_io_list); |
712 | spin_lock_init(&ei->i_completed_io_lock); | ||
712 | ei->cur_aio_dio = NULL; | 713 | ei->cur_aio_dio = NULL; |
713 | ei->i_sync_tid = 0; | 714 | ei->i_sync_tid = 0; |
714 | ei->i_datasync_tid = 0; | 715 | ei->i_datasync_tid = 0; |
@@ -926,6 +927,9 @@ static int ext4_show_options(struct seq_file *seq, struct vfsmount *vfs) | |||
926 | if (test_opt(sb, NOLOAD)) | 927 | if (test_opt(sb, NOLOAD)) |
927 | seq_puts(seq, ",norecovery"); | 928 | seq_puts(seq, ",norecovery"); |
928 | 929 | ||
930 | if (test_opt(sb, DIOREAD_NOLOCK)) | ||
931 | seq_puts(seq, ",dioread_nolock"); | ||
932 | |||
929 | ext4_show_quota_options(seq, sb); | 933 | ext4_show_quota_options(seq, sb); |
930 | 934 | ||
931 | return 0; | 935 | return 0; |
@@ -1109,6 +1113,7 @@ enum { | |||
1109 | Opt_stripe, Opt_delalloc, Opt_nodelalloc, | 1113 | Opt_stripe, Opt_delalloc, Opt_nodelalloc, |
1110 | Opt_block_validity, Opt_noblock_validity, | 1114 | Opt_block_validity, Opt_noblock_validity, |
1111 | Opt_inode_readahead_blks, Opt_journal_ioprio, | 1115 | Opt_inode_readahead_blks, Opt_journal_ioprio, |
1116 | Opt_dioread_nolock, Opt_dioread_lock, | ||
1112 | Opt_discard, Opt_nodiscard, | 1117 | Opt_discard, Opt_nodiscard, |
1113 | }; | 1118 | }; |
1114 | 1119 | ||
@@ -1176,6 +1181,8 @@ static const match_table_t tokens = { | |||
1176 | {Opt_auto_da_alloc, "auto_da_alloc=%u"}, | 1181 | {Opt_auto_da_alloc, "auto_da_alloc=%u"}, |
1177 | {Opt_auto_da_alloc, "auto_da_alloc"}, | 1182 | {Opt_auto_da_alloc, "auto_da_alloc"}, |
1178 | {Opt_noauto_da_alloc, "noauto_da_alloc"}, | 1183 | {Opt_noauto_da_alloc, "noauto_da_alloc"}, |
1184 | {Opt_dioread_nolock, "dioread_nolock"}, | ||
1185 | {Opt_dioread_lock, "dioread_lock"}, | ||
1179 | {Opt_discard, "discard"}, | 1186 | {Opt_discard, "discard"}, |
1180 | {Opt_nodiscard, "nodiscard"}, | 1187 | {Opt_nodiscard, "nodiscard"}, |
1181 | {Opt_err, NULL}, | 1188 | {Opt_err, NULL}, |
@@ -1640,6 +1647,12 @@ set_qf_format: | |||
1640 | case Opt_nodiscard: | 1647 | case Opt_nodiscard: |
1641 | clear_opt(sbi->s_mount_opt, DISCARD); | 1648 | clear_opt(sbi->s_mount_opt, DISCARD); |
1642 | break; | 1649 | break; |
1650 | case Opt_dioread_nolock: | ||
1651 | set_opt(sbi->s_mount_opt, DIOREAD_NOLOCK); | ||
1652 | break; | ||
1653 | case Opt_dioread_lock: | ||
1654 | clear_opt(sbi->s_mount_opt, DIOREAD_NOLOCK); | ||
1655 | break; | ||
1643 | default: | 1656 | default: |
1644 | ext4_msg(sb, KERN_ERR, | 1657 | ext4_msg(sb, KERN_ERR, |
1645 | "Unrecognized mount option \"%s\" " | 1658 | "Unrecognized mount option \"%s\" " |
@@ -2795,7 +2808,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
2795 | EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER)) { | 2808 | EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER)) { |
2796 | ext4_msg(sb, KERN_ERR, "required journal recovery " | 2809 | ext4_msg(sb, KERN_ERR, "required journal recovery " |
2797 | "suppressed and not mounted read-only"); | 2810 | "suppressed and not mounted read-only"); |
2798 | goto failed_mount4; | 2811 | goto failed_mount_wq; |
2799 | } else { | 2812 | } else { |
2800 | clear_opt(sbi->s_mount_opt, DATA_FLAGS); | 2813 | clear_opt(sbi->s_mount_opt, DATA_FLAGS); |
2801 | set_opt(sbi->s_mount_opt, WRITEBACK_DATA); | 2814 | set_opt(sbi->s_mount_opt, WRITEBACK_DATA); |
@@ -2808,7 +2821,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
2808 | !jbd2_journal_set_features(EXT4_SB(sb)->s_journal, 0, 0, | 2821 | !jbd2_journal_set_features(EXT4_SB(sb)->s_journal, 0, 0, |
2809 | JBD2_FEATURE_INCOMPAT_64BIT)) { | 2822 | JBD2_FEATURE_INCOMPAT_64BIT)) { |
2810 | ext4_msg(sb, KERN_ERR, "Failed to set 64-bit journal feature"); | 2823 | ext4_msg(sb, KERN_ERR, "Failed to set 64-bit journal feature"); |
2811 | goto failed_mount4; | 2824 | goto failed_mount_wq; |
2812 | } | 2825 | } |
2813 | 2826 | ||
2814 | if (test_opt(sb, JOURNAL_ASYNC_COMMIT)) { | 2827 | if (test_opt(sb, JOURNAL_ASYNC_COMMIT)) { |
@@ -2847,7 +2860,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
2847 | (sbi->s_journal, 0, 0, JBD2_FEATURE_INCOMPAT_REVOKE)) { | 2860 | (sbi->s_journal, 0, 0, JBD2_FEATURE_INCOMPAT_REVOKE)) { |
2848 | ext4_msg(sb, KERN_ERR, "Journal does not support " | 2861 | ext4_msg(sb, KERN_ERR, "Journal does not support " |
2849 | "requested data journaling mode"); | 2862 | "requested data journaling mode"); |
2850 | goto failed_mount4; | 2863 | goto failed_mount_wq; |
2851 | } | 2864 | } |
2852 | default: | 2865 | default: |
2853 | break; | 2866 | break; |
@@ -2855,13 +2868,17 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
2855 | set_task_ioprio(sbi->s_journal->j_task, journal_ioprio); | 2868 | set_task_ioprio(sbi->s_journal->j_task, journal_ioprio); |
2856 | 2869 | ||
2857 | no_journal: | 2870 | no_journal: |
2858 | |||
2859 | if (test_opt(sb, NOBH)) { | 2871 | if (test_opt(sb, NOBH)) { |
2860 | if (!(test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_WRITEBACK_DATA)) { | 2872 | if (!(test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_WRITEBACK_DATA)) { |
2861 | ext4_msg(sb, KERN_WARNING, "Ignoring nobh option - " | 2873 | ext4_msg(sb, KERN_WARNING, "Ignoring nobh option - " |
2862 | "its supported only with writeback mode"); | 2874 | "its supported only with writeback mode"); |
2863 | clear_opt(sbi->s_mount_opt, NOBH); | 2875 | clear_opt(sbi->s_mount_opt, NOBH); |
2864 | } | 2876 | } |
2877 | if (test_opt(sb, DIOREAD_NOLOCK)) { | ||
2878 | ext4_msg(sb, KERN_WARNING, "dioread_nolock option is " | ||
2879 | "not supported with nobh mode"); | ||
2880 | goto failed_mount_wq; | ||
2881 | } | ||
2865 | } | 2882 | } |
2866 | EXT4_SB(sb)->dio_unwritten_wq = create_workqueue("ext4-dio-unwritten"); | 2883 | EXT4_SB(sb)->dio_unwritten_wq = create_workqueue("ext4-dio-unwritten"); |
2867 | if (!EXT4_SB(sb)->dio_unwritten_wq) { | 2884 | if (!EXT4_SB(sb)->dio_unwritten_wq) { |
@@ -2926,6 +2943,18 @@ no_journal: | |||
2926 | "requested data journaling mode"); | 2943 | "requested data journaling mode"); |
2927 | clear_opt(sbi->s_mount_opt, DELALLOC); | 2944 | clear_opt(sbi->s_mount_opt, DELALLOC); |
2928 | } | 2945 | } |
2946 | if (test_opt(sb, DIOREAD_NOLOCK)) { | ||
2947 | if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA) { | ||
2948 | ext4_msg(sb, KERN_WARNING, "Ignoring dioread_nolock " | ||
2949 | "option - requested data journaling mode"); | ||
2950 | clear_opt(sbi->s_mount_opt, DIOREAD_NOLOCK); | ||
2951 | } | ||
2952 | if (sb->s_blocksize < PAGE_SIZE) { | ||
2953 | ext4_msg(sb, KERN_WARNING, "Ignoring dioread_nolock " | ||
2954 | "option - block size is too small"); | ||
2955 | clear_opt(sbi->s_mount_opt, DIOREAD_NOLOCK); | ||
2956 | } | ||
2957 | } | ||
2929 | 2958 | ||
2930 | err = ext4_setup_system_zone(sb); | 2959 | err = ext4_setup_system_zone(sb); |
2931 | if (err) { | 2960 | if (err) { |