aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorTheodore Ts'o <tytso@mit.edu>2013-01-13 08:41:45 -0500
committerTheodore Ts'o <tytso@mit.edu>2013-01-13 08:41:45 -0500
commit7f5118629f74b82bd4ba5e47415d1b4dcb940241 (patch)
tree274a76ed1ddd6c19de793c762d04f6f1b6fc4da0 /fs
parent15b49132fc972c63894592f218ea5a9a61b1a18f (diff)
ext4: trigger the lazy inode table initialization after resize
After we have finished extending the file system, we need to trigger a the lazy inode table thread to zero out the inode tables. Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Diffstat (limited to 'fs')
-rw-r--r--fs/ext4/ext4.h2
-rw-r--r--fs/ext4/ioctl.c9
-rw-r--r--fs/ext4/resize.c8
-rw-r--r--fs/ext4/super.c21
4 files changed, 27 insertions, 13 deletions
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
index 8462eb3c33aa..80246237f6d5 100644
--- a/fs/ext4/ext4.h
+++ b/fs/ext4/ext4.h
@@ -2227,6 +2227,8 @@ extern int ext4_group_desc_csum_verify(struct super_block *sb, __u32 group,
2227 struct ext4_group_desc *gdp); 2227 struct ext4_group_desc *gdp);
2228extern void ext4_group_desc_csum_set(struct super_block *sb, __u32 group, 2228extern void ext4_group_desc_csum_set(struct super_block *sb, __u32 group,
2229 struct ext4_group_desc *gdp); 2229 struct ext4_group_desc *gdp);
2230extern int ext4_register_li_request(struct super_block *sb,
2231 ext4_group_t first_not_zeroed);
2230 2232
2231static inline int ext4_has_group_desc_csum(struct super_block *sb) 2233static inline int ext4_has_group_desc_csum(struct super_block *sb)
2232{ 2234{
diff --git a/fs/ext4/ioctl.c b/fs/ext4/ioctl.c
index 5747f52f7c72..4784ac244fc6 100644
--- a/fs/ext4/ioctl.c
+++ b/fs/ext4/ioctl.c
@@ -313,6 +313,9 @@ mext_out:
313 if (err == 0) 313 if (err == 0)
314 err = err2; 314 err = err2;
315 mnt_drop_write_file(filp); 315 mnt_drop_write_file(filp);
316 if (!err && ext4_has_group_desc_csum(sb) &&
317 test_opt(sb, INIT_INODE_TABLE))
318 err = ext4_register_li_request(sb, input.group);
316group_add_out: 319group_add_out:
317 ext4_resize_end(sb); 320 ext4_resize_end(sb);
318 return err; 321 return err;
@@ -358,6 +361,7 @@ group_add_out:
358 ext4_fsblk_t n_blocks_count; 361 ext4_fsblk_t n_blocks_count;
359 struct super_block *sb = inode->i_sb; 362 struct super_block *sb = inode->i_sb;
360 int err = 0, err2 = 0; 363 int err = 0, err2 = 0;
364 ext4_group_t o_group = EXT4_SB(sb)->s_groups_count;
361 365
362 if (EXT4_HAS_RO_COMPAT_FEATURE(sb, 366 if (EXT4_HAS_RO_COMPAT_FEATURE(sb,
363 EXT4_FEATURE_RO_COMPAT_BIGALLOC)) { 367 EXT4_FEATURE_RO_COMPAT_BIGALLOC)) {
@@ -388,6 +392,11 @@ group_add_out:
388 if (err == 0) 392 if (err == 0)
389 err = err2; 393 err = err2;
390 mnt_drop_write_file(filp); 394 mnt_drop_write_file(filp);
395 if (!err && (o_group > EXT4_SB(sb)->s_groups_count) &&
396 ext4_has_group_desc_csum(sb) &&
397 test_opt(sb, INIT_INODE_TABLE))
398 err = ext4_register_li_request(sb, o_group);
399
391resizefs_out: 400resizefs_out:
392 ext4_resize_end(sb); 401 ext4_resize_end(sb);
393 return err; 402 return err;
diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c
index 05f8d4502d42..8eefb636beb8 100644
--- a/fs/ext4/resize.c
+++ b/fs/ext4/resize.c
@@ -1506,10 +1506,12 @@ static int ext4_setup_next_flex_gd(struct super_block *sb,
1506 group_data[i].blocks_count = blocks_per_group; 1506 group_data[i].blocks_count = blocks_per_group;
1507 overhead = ext4_group_overhead_blocks(sb, group + i); 1507 overhead = ext4_group_overhead_blocks(sb, group + i);
1508 group_data[i].free_blocks_count = blocks_per_group - overhead; 1508 group_data[i].free_blocks_count = blocks_per_group - overhead;
1509 if (ext4_has_group_desc_csum(sb)) 1509 if (ext4_has_group_desc_csum(sb)) {
1510 flex_gd->bg_flags[i] = EXT4_BG_BLOCK_UNINIT | 1510 flex_gd->bg_flags[i] = EXT4_BG_BLOCK_UNINIT |
1511 EXT4_BG_INODE_UNINIT; 1511 EXT4_BG_INODE_UNINIT;
1512 else 1512 if (!test_opt(sb, INIT_INODE_TABLE))
1513 flex_gd->bg_flags[i] |= EXT4_BG_INODE_ZEROED;
1514 } else
1513 flex_gd->bg_flags[i] = EXT4_BG_INODE_ZEROED; 1515 flex_gd->bg_flags[i] = EXT4_BG_INODE_ZEROED;
1514 } 1516 }
1515 1517
@@ -1594,7 +1596,7 @@ int ext4_group_add(struct super_block *sb, struct ext4_new_group_data *input)
1594 1596
1595 err = ext4_alloc_flex_bg_array(sb, input->group + 1); 1597 err = ext4_alloc_flex_bg_array(sb, input->group + 1);
1596 if (err) 1598 if (err)
1597 return err; 1599 goto out;
1598 1600
1599 err = ext4_mb_alloc_groupinfo(sb, input->group + 1); 1601 err = ext4_mb_alloc_groupinfo(sb, input->group + 1);
1600 if (err) 1602 if (err)
diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index 3d4fb81bacd5..c014edd12648 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -2776,7 +2776,7 @@ static int ext4_run_li_request(struct ext4_li_request *elr)
2776 break; 2776 break;
2777 } 2777 }
2778 2778
2779 if (group == ngroups) 2779 if (group >= ngroups)
2780 ret = 1; 2780 ret = 1;
2781 2781
2782 if (!ret) { 2782 if (!ret) {
@@ -3016,33 +3016,34 @@ static struct ext4_li_request *ext4_li_request_new(struct super_block *sb,
3016 return elr; 3016 return elr;
3017} 3017}
3018 3018
3019static int ext4_register_li_request(struct super_block *sb, 3019int ext4_register_li_request(struct super_block *sb,
3020 ext4_group_t first_not_zeroed) 3020 ext4_group_t first_not_zeroed)
3021{ 3021{
3022 struct ext4_sb_info *sbi = EXT4_SB(sb); 3022 struct ext4_sb_info *sbi = EXT4_SB(sb);
3023 struct ext4_li_request *elr; 3023 struct ext4_li_request *elr = NULL;
3024 ext4_group_t ngroups = EXT4_SB(sb)->s_groups_count; 3024 ext4_group_t ngroups = EXT4_SB(sb)->s_groups_count;
3025 int ret = 0; 3025 int ret = 0;
3026 3026
3027 mutex_lock(&ext4_li_mtx);
3027 if (sbi->s_li_request != NULL) { 3028 if (sbi->s_li_request != NULL) {
3028 /* 3029 /*
3029 * Reset timeout so it can be computed again, because 3030 * Reset timeout so it can be computed again, because
3030 * s_li_wait_mult might have changed. 3031 * s_li_wait_mult might have changed.
3031 */ 3032 */
3032 sbi->s_li_request->lr_timeout = 0; 3033 sbi->s_li_request->lr_timeout = 0;
3033 return 0; 3034 goto out;
3034 } 3035 }
3035 3036
3036 if (first_not_zeroed == ngroups || 3037 if (first_not_zeroed == ngroups ||
3037 (sb->s_flags & MS_RDONLY) || 3038 (sb->s_flags & MS_RDONLY) ||
3038 !test_opt(sb, INIT_INODE_TABLE)) 3039 !test_opt(sb, INIT_INODE_TABLE))
3039 return 0; 3040 goto out;
3040 3041
3041 elr = ext4_li_request_new(sb, first_not_zeroed); 3042 elr = ext4_li_request_new(sb, first_not_zeroed);
3042 if (!elr) 3043 if (!elr) {
3043 return -ENOMEM; 3044 ret = -ENOMEM;
3044 3045 goto out;
3045 mutex_lock(&ext4_li_mtx); 3046 }
3046 3047
3047 if (NULL == ext4_li_info) { 3048 if (NULL == ext4_li_info) {
3048 ret = ext4_li_info_new(); 3049 ret = ext4_li_info_new();