aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext4/super.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/ext4/super.c')
-rw-r--r--fs/ext4/super.c51
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
179void ext4_kvfree(void *ptr)
180{
181 if (is_vmalloc_addr(ptr))
182 vfree(ptr);
183 else
184 kfree(ptr);
185
186}
187
188ext4_fsblk_t ext4_block_bitmap(struct super_block *sb, 179ext4_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
1159static const match_table_t tokens = { 1149static 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:
4232failed_mount6: 4231failed_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:
4261failed_mount2: 4260failed_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);
4265failed_mount: 4264failed_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 "