diff options
Diffstat (limited to 'fs/ext4/super.c')
-rw-r--r-- | fs/ext4/super.c | 51 |
1 files changed, 29 insertions, 22 deletions
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 63e802b8ec68..43c92b1685cb 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c | |||
@@ -176,15 +176,6 @@ void *ext4_kvzalloc(size_t size, gfp_t flags) | |||
176 | return ret; | 176 | return ret; |
177 | } | 177 | } |
178 | 178 | ||
179 | void ext4_kvfree(void *ptr) | ||
180 | { | ||
181 | if (is_vmalloc_addr(ptr)) | ||
182 | vfree(ptr); | ||
183 | else | ||
184 | kfree(ptr); | ||
185 | |||
186 | } | ||
187 | |||
188 | ext4_fsblk_t ext4_block_bitmap(struct super_block *sb, | 179 | ext4_fsblk_t ext4_block_bitmap(struct super_block *sb, |
189 | struct ext4_group_desc *bg) | 180 | struct ext4_group_desc *bg) |
190 | { | 181 | { |
@@ -811,8 +802,8 @@ static void ext4_put_super(struct super_block *sb) | |||
811 | 802 | ||
812 | for (i = 0; i < sbi->s_gdb_count; i++) | 803 | for (i = 0; i < sbi->s_gdb_count; i++) |
813 | brelse(sbi->s_group_desc[i]); | 804 | brelse(sbi->s_group_desc[i]); |
814 | ext4_kvfree(sbi->s_group_desc); | 805 | kvfree(sbi->s_group_desc); |
815 | ext4_kvfree(sbi->s_flex_groups); | 806 | kvfree(sbi->s_flex_groups); |
816 | percpu_counter_destroy(&sbi->s_freeclusters_counter); | 807 | percpu_counter_destroy(&sbi->s_freeclusters_counter); |
817 | percpu_counter_destroy(&sbi->s_freeinodes_counter); | 808 | percpu_counter_destroy(&sbi->s_freeinodes_counter); |
818 | percpu_counter_destroy(&sbi->s_dirs_counter); | 809 | percpu_counter_destroy(&sbi->s_dirs_counter); |
@@ -880,10 +871,10 @@ static struct inode *ext4_alloc_inode(struct super_block *sb) | |||
880 | spin_lock_init(&ei->i_prealloc_lock); | 871 | spin_lock_init(&ei->i_prealloc_lock); |
881 | ext4_es_init_tree(&ei->i_es_tree); | 872 | ext4_es_init_tree(&ei->i_es_tree); |
882 | rwlock_init(&ei->i_es_lock); | 873 | rwlock_init(&ei->i_es_lock); |
883 | INIT_LIST_HEAD(&ei->i_es_lru); | 874 | INIT_LIST_HEAD(&ei->i_es_list); |
884 | ei->i_es_all_nr = 0; | 875 | ei->i_es_all_nr = 0; |
885 | ei->i_es_lru_nr = 0; | 876 | ei->i_es_shk_nr = 0; |
886 | ei->i_touch_when = 0; | 877 | ei->i_es_shrink_lblk = 0; |
887 | ei->i_reserved_data_blocks = 0; | 878 | ei->i_reserved_data_blocks = 0; |
888 | ei->i_reserved_meta_blocks = 0; | 879 | ei->i_reserved_meta_blocks = 0; |
889 | ei->i_allocated_meta_blocks = 0; | 880 | ei->i_allocated_meta_blocks = 0; |
@@ -973,7 +964,6 @@ void ext4_clear_inode(struct inode *inode) | |||
973 | dquot_drop(inode); | 964 | dquot_drop(inode); |
974 | ext4_discard_preallocations(inode); | 965 | ext4_discard_preallocations(inode); |
975 | ext4_es_remove_extent(inode, 0, EXT_MAX_BLOCKS); | 966 | ext4_es_remove_extent(inode, 0, EXT_MAX_BLOCKS); |
976 | ext4_es_lru_del(inode); | ||
977 | if (EXT4_I(inode)->jinode) { | 967 | if (EXT4_I(inode)->jinode) { |
978 | jbd2_journal_release_jbd_inode(EXT4_JOURNAL(inode), | 968 | jbd2_journal_release_jbd_inode(EXT4_JOURNAL(inode), |
979 | EXT4_I(inode)->jinode); | 969 | EXT4_I(inode)->jinode); |
@@ -1153,7 +1143,7 @@ enum { | |||
1153 | Opt_inode_readahead_blks, Opt_journal_ioprio, | 1143 | Opt_inode_readahead_blks, Opt_journal_ioprio, |
1154 | Opt_dioread_nolock, Opt_dioread_lock, | 1144 | Opt_dioread_nolock, Opt_dioread_lock, |
1155 | Opt_discard, Opt_nodiscard, Opt_init_itable, Opt_noinit_itable, | 1145 | Opt_discard, Opt_nodiscard, Opt_init_itable, Opt_noinit_itable, |
1156 | Opt_max_dir_size_kb, | 1146 | Opt_max_dir_size_kb, Opt_nojournal_checksum, |
1157 | }; | 1147 | }; |
1158 | 1148 | ||
1159 | static const match_table_t tokens = { | 1149 | static const match_table_t tokens = { |
@@ -1187,6 +1177,7 @@ static const match_table_t tokens = { | |||
1187 | {Opt_journal_dev, "journal_dev=%u"}, | 1177 | {Opt_journal_dev, "journal_dev=%u"}, |
1188 | {Opt_journal_path, "journal_path=%s"}, | 1178 | {Opt_journal_path, "journal_path=%s"}, |
1189 | {Opt_journal_checksum, "journal_checksum"}, | 1179 | {Opt_journal_checksum, "journal_checksum"}, |
1180 | {Opt_nojournal_checksum, "nojournal_checksum"}, | ||
1190 | {Opt_journal_async_commit, "journal_async_commit"}, | 1181 | {Opt_journal_async_commit, "journal_async_commit"}, |
1191 | {Opt_abort, "abort"}, | 1182 | {Opt_abort, "abort"}, |
1192 | {Opt_data_journal, "data=journal"}, | 1183 | {Opt_data_journal, "data=journal"}, |
@@ -1368,6 +1359,8 @@ static const struct mount_opts { | |||
1368 | MOPT_EXT4_ONLY | MOPT_SET | MOPT_EXPLICIT}, | 1359 | MOPT_EXT4_ONLY | MOPT_SET | MOPT_EXPLICIT}, |
1369 | {Opt_nodelalloc, EXT4_MOUNT_DELALLOC, | 1360 | {Opt_nodelalloc, EXT4_MOUNT_DELALLOC, |
1370 | MOPT_EXT4_ONLY | MOPT_CLEAR}, | 1361 | MOPT_EXT4_ONLY | MOPT_CLEAR}, |
1362 | {Opt_nojournal_checksum, EXT4_MOUNT_JOURNAL_CHECKSUM, | ||
1363 | MOPT_EXT4_ONLY | MOPT_CLEAR}, | ||
1371 | {Opt_journal_checksum, EXT4_MOUNT_JOURNAL_CHECKSUM, | 1364 | {Opt_journal_checksum, EXT4_MOUNT_JOURNAL_CHECKSUM, |
1372 | MOPT_EXT4_ONLY | MOPT_SET}, | 1365 | MOPT_EXT4_ONLY | MOPT_SET}, |
1373 | {Opt_journal_async_commit, (EXT4_MOUNT_JOURNAL_ASYNC_COMMIT | | 1366 | {Opt_journal_async_commit, (EXT4_MOUNT_JOURNAL_ASYNC_COMMIT | |
@@ -1709,6 +1702,12 @@ static int parse_options(char *options, struct super_block *sb, | |||
1709 | return 0; | 1702 | return 0; |
1710 | } | 1703 | } |
1711 | } | 1704 | } |
1705 | if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_ORDERED_DATA && | ||
1706 | test_opt(sb, JOURNAL_ASYNC_COMMIT)) { | ||
1707 | ext4_msg(sb, KERN_ERR, "can't mount with journal_async_commit " | ||
1708 | "in data=ordered mode"); | ||
1709 | return 0; | ||
1710 | } | ||
1712 | return 1; | 1711 | return 1; |
1713 | } | 1712 | } |
1714 | 1713 | ||
@@ -1946,7 +1945,7 @@ int ext4_alloc_flex_bg_array(struct super_block *sb, ext4_group_t ngroup) | |||
1946 | memcpy(new_groups, sbi->s_flex_groups, | 1945 | memcpy(new_groups, sbi->s_flex_groups, |
1947 | (sbi->s_flex_groups_allocated * | 1946 | (sbi->s_flex_groups_allocated * |
1948 | sizeof(struct flex_groups))); | 1947 | sizeof(struct flex_groups))); |
1949 | ext4_kvfree(sbi->s_flex_groups); | 1948 | kvfree(sbi->s_flex_groups); |
1950 | } | 1949 | } |
1951 | sbi->s_flex_groups = new_groups; | 1950 | sbi->s_flex_groups = new_groups; |
1952 | sbi->s_flex_groups_allocated = size / sizeof(struct flex_groups); | 1951 | sbi->s_flex_groups_allocated = size / sizeof(struct flex_groups); |
@@ -3317,7 +3316,7 @@ int ext4_calculate_overhead(struct super_block *sb) | |||
3317 | struct ext4_super_block *es = sbi->s_es; | 3316 | struct ext4_super_block *es = sbi->s_es; |
3318 | ext4_group_t i, ngroups = ext4_get_groups_count(sb); | 3317 | ext4_group_t i, ngroups = ext4_get_groups_count(sb); |
3319 | ext4_fsblk_t overhead = 0; | 3318 | ext4_fsblk_t overhead = 0; |
3320 | char *buf = (char *) get_zeroed_page(GFP_KERNEL); | 3319 | char *buf = (char *) get_zeroed_page(GFP_NOFS); |
3321 | 3320 | ||
3322 | if (!buf) | 3321 | if (!buf) |
3323 | return -ENOMEM; | 3322 | return -ENOMEM; |
@@ -3345,8 +3344,8 @@ int ext4_calculate_overhead(struct super_block *sb) | |||
3345 | memset(buf, 0, PAGE_SIZE); | 3344 | memset(buf, 0, PAGE_SIZE); |
3346 | cond_resched(); | 3345 | cond_resched(); |
3347 | } | 3346 | } |
3348 | /* Add the journal blocks as well */ | 3347 | /* Add the internal journal blocks as well */ |
3349 | if (sbi->s_journal) | 3348 | if (sbi->s_journal && !sbi->journal_bdev) |
3350 | overhead += EXT4_NUM_B2C(sbi, sbi->s_journal->j_maxlen); | 3349 | overhead += EXT4_NUM_B2C(sbi, sbi->s_journal->j_maxlen); |
3351 | 3350 | ||
3352 | sbi->s_overhead = overhead; | 3351 | sbi->s_overhead = overhead; |
@@ -4232,7 +4231,7 @@ failed_mount7: | |||
4232 | failed_mount6: | 4231 | failed_mount6: |
4233 | ext4_mb_release(sb); | 4232 | ext4_mb_release(sb); |
4234 | if (sbi->s_flex_groups) | 4233 | if (sbi->s_flex_groups) |
4235 | ext4_kvfree(sbi->s_flex_groups); | 4234 | kvfree(sbi->s_flex_groups); |
4236 | percpu_counter_destroy(&sbi->s_freeclusters_counter); | 4235 | percpu_counter_destroy(&sbi->s_freeclusters_counter); |
4237 | percpu_counter_destroy(&sbi->s_freeinodes_counter); | 4236 | percpu_counter_destroy(&sbi->s_freeinodes_counter); |
4238 | percpu_counter_destroy(&sbi->s_dirs_counter); | 4237 | percpu_counter_destroy(&sbi->s_dirs_counter); |
@@ -4261,7 +4260,7 @@ failed_mount3: | |||
4261 | failed_mount2: | 4260 | failed_mount2: |
4262 | for (i = 0; i < db_count; i++) | 4261 | for (i = 0; i < db_count; i++) |
4263 | brelse(sbi->s_group_desc[i]); | 4262 | brelse(sbi->s_group_desc[i]); |
4264 | ext4_kvfree(sbi->s_group_desc); | 4263 | kvfree(sbi->s_group_desc); |
4265 | failed_mount: | 4264 | failed_mount: |
4266 | if (sbi->s_chksum_driver) | 4265 | if (sbi->s_chksum_driver) |
4267 | crypto_free_shash(sbi->s_chksum_driver); | 4266 | crypto_free_shash(sbi->s_chksum_driver); |
@@ -4862,6 +4861,14 @@ static int ext4_remount(struct super_block *sb, int *flags, char *data) | |||
4862 | goto restore_opts; | 4861 | goto restore_opts; |
4863 | } | 4862 | } |
4864 | 4863 | ||
4864 | if ((old_opts.s_mount_opt & EXT4_MOUNT_JOURNAL_CHECKSUM) ^ | ||
4865 | test_opt(sb, JOURNAL_CHECKSUM)) { | ||
4866 | ext4_msg(sb, KERN_ERR, "changing journal_checksum " | ||
4867 | "during remount not supported"); | ||
4868 | err = -EINVAL; | ||
4869 | goto restore_opts; | ||
4870 | } | ||
4871 | |||
4865 | if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA) { | 4872 | if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA) { |
4866 | if (test_opt2(sb, EXPLICIT_DELALLOC)) { | 4873 | if (test_opt2(sb, EXPLICIT_DELALLOC)) { |
4867 | ext4_msg(sb, KERN_ERR, "can't mount with " | 4874 | ext4_msg(sb, KERN_ERR, "can't mount with " |