diff options
Diffstat (limited to 'fs/ext4/super.c')
-rw-r--r-- | fs/ext4/super.c | 263 |
1 files changed, 175 insertions, 88 deletions
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 44d0c8db2239..9953d80145ad 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c | |||
@@ -45,6 +45,7 @@ | |||
45 | #include <linux/freezer.h> | 45 | #include <linux/freezer.h> |
46 | 46 | ||
47 | #include "ext4.h" | 47 | #include "ext4.h" |
48 | #include "ext4_extents.h" | ||
48 | #include "ext4_jbd2.h" | 49 | #include "ext4_jbd2.h" |
49 | #include "xattr.h" | 50 | #include "xattr.h" |
50 | #include "acl.h" | 51 | #include "acl.h" |
@@ -163,8 +164,8 @@ ext4_fsblk_t ext4_inode_table(struct super_block *sb, | |||
163 | (ext4_fsblk_t)le32_to_cpu(bg->bg_inode_table_hi) << 32 : 0); | 164 | (ext4_fsblk_t)le32_to_cpu(bg->bg_inode_table_hi) << 32 : 0); |
164 | } | 165 | } |
165 | 166 | ||
166 | __u32 ext4_free_blks_count(struct super_block *sb, | 167 | __u32 ext4_free_group_clusters(struct super_block *sb, |
167 | struct ext4_group_desc *bg) | 168 | struct ext4_group_desc *bg) |
168 | { | 169 | { |
169 | return le16_to_cpu(bg->bg_free_blocks_count_lo) | | 170 | return le16_to_cpu(bg->bg_free_blocks_count_lo) | |
170 | (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT ? | 171 | (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT ? |
@@ -219,8 +220,8 @@ void ext4_inode_table_set(struct super_block *sb, | |||
219 | bg->bg_inode_table_hi = cpu_to_le32(blk >> 32); | 220 | bg->bg_inode_table_hi = cpu_to_le32(blk >> 32); |
220 | } | 221 | } |
221 | 222 | ||
222 | void ext4_free_blks_set(struct super_block *sb, | 223 | void ext4_free_group_clusters_set(struct super_block *sb, |
223 | struct ext4_group_desc *bg, __u32 count) | 224 | struct ext4_group_desc *bg, __u32 count) |
224 | { | 225 | { |
225 | bg->bg_free_blocks_count_lo = cpu_to_le16((__u16)count); | 226 | bg->bg_free_blocks_count_lo = cpu_to_le16((__u16)count); |
226 | if (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT) | 227 | if (EXT4_DESC_SIZE(sb) >= EXT4_MIN_DESC_SIZE_64BIT) |
@@ -414,6 +415,22 @@ static void save_error_info(struct super_block *sb, const char *func, | |||
414 | ext4_commit_super(sb, 1); | 415 | ext4_commit_super(sb, 1); |
415 | } | 416 | } |
416 | 417 | ||
418 | /* | ||
419 | * The del_gendisk() function uninitializes the disk-specific data | ||
420 | * structures, including the bdi structure, without telling anyone | ||
421 | * else. Once this happens, any attempt to call mark_buffer_dirty() | ||
422 | * (for example, by ext4_commit_super), will cause a kernel OOPS. | ||
423 | * This is a kludge to prevent these oops until we can put in a proper | ||
424 | * hook in del_gendisk() to inform the VFS and file system layers. | ||
425 | */ | ||
426 | static int block_device_ejected(struct super_block *sb) | ||
427 | { | ||
428 | struct inode *bd_inode = sb->s_bdev->bd_inode; | ||
429 | struct backing_dev_info *bdi = bd_inode->i_mapping->backing_dev_info; | ||
430 | |||
431 | return bdi->dev == NULL; | ||
432 | } | ||
433 | |||
417 | 434 | ||
418 | /* Deal with the reporting of failure conditions on a filesystem such as | 435 | /* Deal with the reporting of failure conditions on a filesystem such as |
419 | * inconsistencies detected or read IO failures. | 436 | * inconsistencies detected or read IO failures. |
@@ -821,10 +838,10 @@ static void ext4_put_super(struct super_block *sb) | |||
821 | brelse(sbi->s_group_desc[i]); | 838 | brelse(sbi->s_group_desc[i]); |
822 | ext4_kvfree(sbi->s_group_desc); | 839 | ext4_kvfree(sbi->s_group_desc); |
823 | ext4_kvfree(sbi->s_flex_groups); | 840 | ext4_kvfree(sbi->s_flex_groups); |
824 | percpu_counter_destroy(&sbi->s_freeblocks_counter); | 841 | percpu_counter_destroy(&sbi->s_freeclusters_counter); |
825 | percpu_counter_destroy(&sbi->s_freeinodes_counter); | 842 | percpu_counter_destroy(&sbi->s_freeinodes_counter); |
826 | percpu_counter_destroy(&sbi->s_dirs_counter); | 843 | percpu_counter_destroy(&sbi->s_dirs_counter); |
827 | percpu_counter_destroy(&sbi->s_dirtyblocks_counter); | 844 | percpu_counter_destroy(&sbi->s_dirtyclusters_counter); |
828 | brelse(sbi->s_sbh); | 845 | brelse(sbi->s_sbh); |
829 | #ifdef CONFIG_QUOTA | 846 | #ifdef CONFIG_QUOTA |
830 | for (i = 0; i < MAXQUOTAS; i++) | 847 | for (i = 0; i < MAXQUOTAS; i++) |
@@ -1057,8 +1074,6 @@ static int ext4_show_options(struct seq_file *seq, struct vfsmount *vfs) | |||
1057 | seq_puts(seq, ",nouid32"); | 1074 | seq_puts(seq, ",nouid32"); |
1058 | if (test_opt(sb, DEBUG) && !(def_mount_opts & EXT4_DEFM_DEBUG)) | 1075 | if (test_opt(sb, DEBUG) && !(def_mount_opts & EXT4_DEFM_DEBUG)) |
1059 | seq_puts(seq, ",debug"); | 1076 | seq_puts(seq, ",debug"); |
1060 | if (test_opt(sb, OLDALLOC)) | ||
1061 | seq_puts(seq, ",oldalloc"); | ||
1062 | #ifdef CONFIG_EXT4_FS_XATTR | 1077 | #ifdef CONFIG_EXT4_FS_XATTR |
1063 | if (test_opt(sb, XATTR_USER)) | 1078 | if (test_opt(sb, XATTR_USER)) |
1064 | seq_puts(seq, ",user_xattr"); | 1079 | seq_puts(seq, ",user_xattr"); |
@@ -1567,10 +1582,12 @@ static int parse_options(char *options, struct super_block *sb, | |||
1567 | set_opt(sb, DEBUG); | 1582 | set_opt(sb, DEBUG); |
1568 | break; | 1583 | break; |
1569 | case Opt_oldalloc: | 1584 | case Opt_oldalloc: |
1570 | set_opt(sb, OLDALLOC); | 1585 | ext4_msg(sb, KERN_WARNING, |
1586 | "Ignoring deprecated oldalloc option"); | ||
1571 | break; | 1587 | break; |
1572 | case Opt_orlov: | 1588 | case Opt_orlov: |
1573 | clear_opt(sb, OLDALLOC); | 1589 | ext4_msg(sb, KERN_WARNING, |
1590 | "Ignoring deprecated orlov option"); | ||
1574 | break; | 1591 | break; |
1575 | #ifdef CONFIG_EXT4_FS_XATTR | 1592 | #ifdef CONFIG_EXT4_FS_XATTR |
1576 | case Opt_user_xattr: | 1593 | case Opt_user_xattr: |
@@ -1801,6 +1818,7 @@ set_qf_format: | |||
1801 | break; | 1818 | break; |
1802 | case Opt_nodelalloc: | 1819 | case Opt_nodelalloc: |
1803 | clear_opt(sb, DELALLOC); | 1820 | clear_opt(sb, DELALLOC); |
1821 | clear_opt2(sb, EXPLICIT_DELALLOC); | ||
1804 | break; | 1822 | break; |
1805 | case Opt_mblk_io_submit: | 1823 | case Opt_mblk_io_submit: |
1806 | set_opt(sb, MBLK_IO_SUBMIT); | 1824 | set_opt(sb, MBLK_IO_SUBMIT); |
@@ -1817,6 +1835,7 @@ set_qf_format: | |||
1817 | break; | 1835 | break; |
1818 | case Opt_delalloc: | 1836 | case Opt_delalloc: |
1819 | set_opt(sb, DELALLOC); | 1837 | set_opt(sb, DELALLOC); |
1838 | set_opt2(sb, EXPLICIT_DELALLOC); | ||
1820 | break; | 1839 | break; |
1821 | case Opt_block_validity: | 1840 | case Opt_block_validity: |
1822 | set_opt(sb, BLOCK_VALIDITY); | 1841 | set_opt(sb, BLOCK_VALIDITY); |
@@ -1935,7 +1954,7 @@ static int ext4_setup_super(struct super_block *sb, struct ext4_super_block *es, | |||
1935 | res = MS_RDONLY; | 1954 | res = MS_RDONLY; |
1936 | } | 1955 | } |
1937 | if (read_only) | 1956 | if (read_only) |
1938 | return res; | 1957 | goto done; |
1939 | if (!(sbi->s_mount_state & EXT4_VALID_FS)) | 1958 | if (!(sbi->s_mount_state & EXT4_VALID_FS)) |
1940 | ext4_msg(sb, KERN_WARNING, "warning: mounting unchecked fs, " | 1959 | ext4_msg(sb, KERN_WARNING, "warning: mounting unchecked fs, " |
1941 | "running e2fsck is recommended"); | 1960 | "running e2fsck is recommended"); |
@@ -1966,6 +1985,7 @@ static int ext4_setup_super(struct super_block *sb, struct ext4_super_block *es, | |||
1966 | EXT4_SET_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER); | 1985 | EXT4_SET_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER); |
1967 | 1986 | ||
1968 | ext4_commit_super(sb, 1); | 1987 | ext4_commit_super(sb, 1); |
1988 | done: | ||
1969 | if (test_opt(sb, DEBUG)) | 1989 | if (test_opt(sb, DEBUG)) |
1970 | printk(KERN_INFO "[EXT4 FS bs=%lu, gc=%u, " | 1990 | printk(KERN_INFO "[EXT4 FS bs=%lu, gc=%u, " |
1971 | "bpg=%lu, ipg=%lu, mo=%04x, mo2=%04x]\n", | 1991 | "bpg=%lu, ipg=%lu, mo=%04x, mo2=%04x]\n", |
@@ -2015,8 +2035,8 @@ static int ext4_fill_flex_info(struct super_block *sb) | |||
2015 | flex_group = ext4_flex_group(sbi, i); | 2035 | flex_group = ext4_flex_group(sbi, i); |
2016 | atomic_add(ext4_free_inodes_count(sb, gdp), | 2036 | atomic_add(ext4_free_inodes_count(sb, gdp), |
2017 | &sbi->s_flex_groups[flex_group].free_inodes); | 2037 | &sbi->s_flex_groups[flex_group].free_inodes); |
2018 | atomic_add(ext4_free_blks_count(sb, gdp), | 2038 | atomic_add(ext4_free_group_clusters(sb, gdp), |
2019 | &sbi->s_flex_groups[flex_group].free_blocks); | 2039 | &sbi->s_flex_groups[flex_group].free_clusters); |
2020 | atomic_add(ext4_used_dirs_count(sb, gdp), | 2040 | atomic_add(ext4_used_dirs_count(sb, gdp), |
2021 | &sbi->s_flex_groups[flex_group].used_dirs); | 2041 | &sbi->s_flex_groups[flex_group].used_dirs); |
2022 | } | 2042 | } |
@@ -2134,7 +2154,8 @@ static int ext4_check_descriptors(struct super_block *sb, | |||
2134 | if (NULL != first_not_zeroed) | 2154 | if (NULL != first_not_zeroed) |
2135 | *first_not_zeroed = grp; | 2155 | *first_not_zeroed = grp; |
2136 | 2156 | ||
2137 | ext4_free_blocks_count_set(sbi->s_es, ext4_count_free_blocks(sb)); | 2157 | ext4_free_blocks_count_set(sbi->s_es, |
2158 | EXT4_C2B(sbi, ext4_count_free_clusters(sb))); | ||
2138 | sbi->s_es->s_free_inodes_count =cpu_to_le32(ext4_count_free_inodes(sb)); | 2159 | sbi->s_es->s_free_inodes_count =cpu_to_le32(ext4_count_free_inodes(sb)); |
2139 | return 1; | 2160 | return 1; |
2140 | } | 2161 | } |
@@ -2454,7 +2475,8 @@ static ssize_t delayed_allocation_blocks_show(struct ext4_attr *a, | |||
2454 | char *buf) | 2475 | char *buf) |
2455 | { | 2476 | { |
2456 | return snprintf(buf, PAGE_SIZE, "%llu\n", | 2477 | return snprintf(buf, PAGE_SIZE, "%llu\n", |
2457 | (s64) percpu_counter_sum(&sbi->s_dirtyblocks_counter)); | 2478 | (s64) EXT4_C2B(sbi, |
2479 | percpu_counter_sum(&sbi->s_dirtyclusters_counter))); | ||
2458 | } | 2480 | } |
2459 | 2481 | ||
2460 | static ssize_t session_write_kbytes_show(struct ext4_attr *a, | 2482 | static ssize_t session_write_kbytes_show(struct ext4_attr *a, |
@@ -2682,6 +2704,13 @@ static int ext4_feature_set_ok(struct super_block *sb, int readonly) | |||
2682 | return 0; | 2704 | return 0; |
2683 | } | 2705 | } |
2684 | } | 2706 | } |
2707 | if (EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_BIGALLOC) && | ||
2708 | !EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_EXTENTS)) { | ||
2709 | ext4_msg(sb, KERN_ERR, | ||
2710 | "Can't support bigalloc feature without " | ||
2711 | "extents feature\n"); | ||
2712 | return 0; | ||
2713 | } | ||
2685 | return 1; | 2714 | return 1; |
2686 | } | 2715 | } |
2687 | 2716 | ||
@@ -3087,10 +3116,10 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
3087 | char *cp; | 3116 | char *cp; |
3088 | const char *descr; | 3117 | const char *descr; |
3089 | int ret = -ENOMEM; | 3118 | int ret = -ENOMEM; |
3090 | int blocksize; | 3119 | int blocksize, clustersize; |
3091 | unsigned int db_count; | 3120 | unsigned int db_count; |
3092 | unsigned int i; | 3121 | unsigned int i; |
3093 | int needs_recovery, has_huge_files; | 3122 | int needs_recovery, has_huge_files, has_bigalloc; |
3094 | __u64 blocks_count; | 3123 | __u64 blocks_count; |
3095 | int err; | 3124 | int err; |
3096 | unsigned int journal_ioprio = DEFAULT_JOURNAL_IOPRIO; | 3125 | unsigned int journal_ioprio = DEFAULT_JOURNAL_IOPRIO; |
@@ -3224,6 +3253,33 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
3224 | &journal_ioprio, NULL, 0)) | 3253 | &journal_ioprio, NULL, 0)) |
3225 | goto failed_mount; | 3254 | goto failed_mount; |
3226 | 3255 | ||
3256 | if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA) { | ||
3257 | printk_once(KERN_WARNING "EXT4-fs: Warning: mounting " | ||
3258 | "with data=journal disables delayed " | ||
3259 | "allocation and O_DIRECT support!\n"); | ||
3260 | if (test_opt2(sb, EXPLICIT_DELALLOC)) { | ||
3261 | ext4_msg(sb, KERN_ERR, "can't mount with " | ||
3262 | "both data=journal and delalloc"); | ||
3263 | goto failed_mount; | ||
3264 | } | ||
3265 | if (test_opt(sb, DIOREAD_NOLOCK)) { | ||
3266 | ext4_msg(sb, KERN_ERR, "can't mount with " | ||
3267 | "both data=journal and delalloc"); | ||
3268 | goto failed_mount; | ||
3269 | } | ||
3270 | if (test_opt(sb, DELALLOC)) | ||
3271 | clear_opt(sb, DELALLOC); | ||
3272 | } | ||
3273 | |||
3274 | blocksize = BLOCK_SIZE << le32_to_cpu(es->s_log_block_size); | ||
3275 | if (test_opt(sb, DIOREAD_NOLOCK)) { | ||
3276 | if (blocksize < PAGE_SIZE) { | ||
3277 | ext4_msg(sb, KERN_ERR, "can't mount with " | ||
3278 | "dioread_nolock if block size != PAGE_SIZE"); | ||
3279 | goto failed_mount; | ||
3280 | } | ||
3281 | } | ||
3282 | |||
3227 | sb->s_flags = (sb->s_flags & ~MS_POSIXACL) | | 3283 | sb->s_flags = (sb->s_flags & ~MS_POSIXACL) | |
3228 | (test_opt(sb, POSIX_ACL) ? MS_POSIXACL : 0); | 3284 | (test_opt(sb, POSIX_ACL) ? MS_POSIXACL : 0); |
3229 | 3285 | ||
@@ -3265,8 +3321,6 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
3265 | if (!ext4_feature_set_ok(sb, (sb->s_flags & MS_RDONLY))) | 3321 | if (!ext4_feature_set_ok(sb, (sb->s_flags & MS_RDONLY))) |
3266 | goto failed_mount; | 3322 | goto failed_mount; |
3267 | 3323 | ||
3268 | blocksize = BLOCK_SIZE << le32_to_cpu(es->s_log_block_size); | ||
3269 | |||
3270 | if (blocksize < EXT4_MIN_BLOCK_SIZE || | 3324 | if (blocksize < EXT4_MIN_BLOCK_SIZE || |
3271 | blocksize > EXT4_MAX_BLOCK_SIZE) { | 3325 | blocksize > EXT4_MAX_BLOCK_SIZE) { |
3272 | ext4_msg(sb, KERN_ERR, | 3326 | ext4_msg(sb, KERN_ERR, |
@@ -3369,12 +3423,53 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
3369 | sb->s_dirt = 1; | 3423 | sb->s_dirt = 1; |
3370 | } | 3424 | } |
3371 | 3425 | ||
3372 | if (sbi->s_blocks_per_group > blocksize * 8) { | 3426 | /* Handle clustersize */ |
3373 | ext4_msg(sb, KERN_ERR, | 3427 | clustersize = BLOCK_SIZE << le32_to_cpu(es->s_log_cluster_size); |
3374 | "#blocks per group too big: %lu", | 3428 | has_bigalloc = EXT4_HAS_RO_COMPAT_FEATURE(sb, |
3375 | sbi->s_blocks_per_group); | 3429 | EXT4_FEATURE_RO_COMPAT_BIGALLOC); |
3376 | goto failed_mount; | 3430 | if (has_bigalloc) { |
3431 | if (clustersize < blocksize) { | ||
3432 | ext4_msg(sb, KERN_ERR, | ||
3433 | "cluster size (%d) smaller than " | ||
3434 | "block size (%d)", clustersize, blocksize); | ||
3435 | goto failed_mount; | ||
3436 | } | ||
3437 | sbi->s_cluster_bits = le32_to_cpu(es->s_log_cluster_size) - | ||
3438 | le32_to_cpu(es->s_log_block_size); | ||
3439 | sbi->s_clusters_per_group = | ||
3440 | le32_to_cpu(es->s_clusters_per_group); | ||
3441 | if (sbi->s_clusters_per_group > blocksize * 8) { | ||
3442 | ext4_msg(sb, KERN_ERR, | ||
3443 | "#clusters per group too big: %lu", | ||
3444 | sbi->s_clusters_per_group); | ||
3445 | goto failed_mount; | ||
3446 | } | ||
3447 | if (sbi->s_blocks_per_group != | ||
3448 | (sbi->s_clusters_per_group * (clustersize / blocksize))) { | ||
3449 | ext4_msg(sb, KERN_ERR, "blocks per group (%lu) and " | ||
3450 | "clusters per group (%lu) inconsistent", | ||
3451 | sbi->s_blocks_per_group, | ||
3452 | sbi->s_clusters_per_group); | ||
3453 | goto failed_mount; | ||
3454 | } | ||
3455 | } else { | ||
3456 | if (clustersize != blocksize) { | ||
3457 | ext4_warning(sb, "fragment/cluster size (%d) != " | ||
3458 | "block size (%d)", clustersize, | ||
3459 | blocksize); | ||
3460 | clustersize = blocksize; | ||
3461 | } | ||
3462 | if (sbi->s_blocks_per_group > blocksize * 8) { | ||
3463 | ext4_msg(sb, KERN_ERR, | ||
3464 | "#blocks per group too big: %lu", | ||
3465 | sbi->s_blocks_per_group); | ||
3466 | goto failed_mount; | ||
3467 | } | ||
3468 | sbi->s_clusters_per_group = sbi->s_blocks_per_group; | ||
3469 | sbi->s_cluster_bits = 0; | ||
3377 | } | 3470 | } |
3471 | sbi->s_cluster_ratio = clustersize / blocksize; | ||
3472 | |||
3378 | if (sbi->s_inodes_per_group > blocksize * 8) { | 3473 | if (sbi->s_inodes_per_group > blocksize * 8) { |
3379 | ext4_msg(sb, KERN_ERR, | 3474 | ext4_msg(sb, KERN_ERR, |
3380 | "#inodes per group too big: %lu", | 3475 | "#inodes per group too big: %lu", |
@@ -3446,10 +3541,8 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
3446 | goto failed_mount; | 3541 | goto failed_mount; |
3447 | } | 3542 | } |
3448 | 3543 | ||
3449 | #ifdef CONFIG_PROC_FS | ||
3450 | if (ext4_proc_root) | 3544 | if (ext4_proc_root) |
3451 | sbi->s_proc = proc_mkdir(sb->s_id, ext4_proc_root); | 3545 | sbi->s_proc = proc_mkdir(sb->s_id, ext4_proc_root); |
3452 | #endif | ||
3453 | 3546 | ||
3454 | bgl_lock_init(sbi->s_blockgroup_lock); | 3547 | bgl_lock_init(sbi->s_blockgroup_lock); |
3455 | 3548 | ||
@@ -3483,8 +3576,8 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
3483 | sbi->s_err_report.function = print_daily_error_info; | 3576 | sbi->s_err_report.function = print_daily_error_info; |
3484 | sbi->s_err_report.data = (unsigned long) sb; | 3577 | sbi->s_err_report.data = (unsigned long) sb; |
3485 | 3578 | ||
3486 | err = percpu_counter_init(&sbi->s_freeblocks_counter, | 3579 | err = percpu_counter_init(&sbi->s_freeclusters_counter, |
3487 | ext4_count_free_blocks(sb)); | 3580 | ext4_count_free_clusters(sb)); |
3488 | if (!err) { | 3581 | if (!err) { |
3489 | err = percpu_counter_init(&sbi->s_freeinodes_counter, | 3582 | err = percpu_counter_init(&sbi->s_freeinodes_counter, |
3490 | ext4_count_free_inodes(sb)); | 3583 | ext4_count_free_inodes(sb)); |
@@ -3494,7 +3587,7 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
3494 | ext4_count_dirs(sb)); | 3587 | ext4_count_dirs(sb)); |
3495 | } | 3588 | } |
3496 | if (!err) { | 3589 | if (!err) { |
3497 | err = percpu_counter_init(&sbi->s_dirtyblocks_counter, 0); | 3590 | err = percpu_counter_init(&sbi->s_dirtyclusters_counter, 0); |
3498 | } | 3591 | } |
3499 | if (err) { | 3592 | if (err) { |
3500 | ext4_msg(sb, KERN_ERR, "insufficient memory"); | 3593 | ext4_msg(sb, KERN_ERR, "insufficient memory"); |
@@ -3609,13 +3702,13 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent) | |||
3609 | * The journal may have updated the bg summary counts, so we | 3702 | * The journal may have updated the bg summary counts, so we |
3610 | * need to update the global counters. | 3703 | * need to update the global counters. |
3611 | */ | 3704 | */ |
3612 | percpu_counter_set(&sbi->s_freeblocks_counter, | 3705 | percpu_counter_set(&sbi->s_freeclusters_counter, |
3613 | ext4_count_free_blocks(sb)); | 3706 | ext4_count_free_clusters(sb)); |
3614 | percpu_counter_set(&sbi->s_freeinodes_counter, | 3707 | percpu_counter_set(&sbi->s_freeinodes_counter, |
3615 | ext4_count_free_inodes(sb)); | 3708 | ext4_count_free_inodes(sb)); |
3616 | percpu_counter_set(&sbi->s_dirs_counter, | 3709 | percpu_counter_set(&sbi->s_dirs_counter, |
3617 | ext4_count_dirs(sb)); | 3710 | ext4_count_dirs(sb)); |
3618 | percpu_counter_set(&sbi->s_dirtyblocks_counter, 0); | 3711 | percpu_counter_set(&sbi->s_dirtyclusters_counter, 0); |
3619 | 3712 | ||
3620 | no_journal: | 3713 | no_journal: |
3621 | /* | 3714 | /* |
@@ -3679,25 +3772,6 @@ no_journal: | |||
3679 | "available"); | 3772 | "available"); |
3680 | } | 3773 | } |
3681 | 3774 | ||
3682 | if (test_opt(sb, DELALLOC) && | ||
3683 | (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA)) { | ||
3684 | ext4_msg(sb, KERN_WARNING, "Ignoring delalloc option - " | ||
3685 | "requested data journaling mode"); | ||
3686 | clear_opt(sb, DELALLOC); | ||
3687 | } | ||
3688 | if (test_opt(sb, DIOREAD_NOLOCK)) { | ||
3689 | if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA) { | ||
3690 | ext4_msg(sb, KERN_WARNING, "Ignoring dioread_nolock " | ||
3691 | "option - requested data journaling mode"); | ||
3692 | clear_opt(sb, DIOREAD_NOLOCK); | ||
3693 | } | ||
3694 | if (sb->s_blocksize < PAGE_SIZE) { | ||
3695 | ext4_msg(sb, KERN_WARNING, "Ignoring dioread_nolock " | ||
3696 | "option - block size is too small"); | ||
3697 | clear_opt(sb, DIOREAD_NOLOCK); | ||
3698 | } | ||
3699 | } | ||
3700 | |||
3701 | err = ext4_setup_system_zone(sb); | 3775 | err = ext4_setup_system_zone(sb); |
3702 | if (err) { | 3776 | if (err) { |
3703 | ext4_msg(sb, KERN_ERR, "failed to initialize system " | 3777 | ext4_msg(sb, KERN_ERR, "failed to initialize system " |
@@ -3710,22 +3784,19 @@ no_journal: | |||
3710 | if (err) { | 3784 | if (err) { |
3711 | ext4_msg(sb, KERN_ERR, "failed to initialize mballoc (%d)", | 3785 | ext4_msg(sb, KERN_ERR, "failed to initialize mballoc (%d)", |
3712 | err); | 3786 | err); |
3713 | goto failed_mount4; | 3787 | goto failed_mount5; |
3714 | } | 3788 | } |
3715 | 3789 | ||
3716 | err = ext4_register_li_request(sb, first_not_zeroed); | 3790 | err = ext4_register_li_request(sb, first_not_zeroed); |
3717 | if (err) | 3791 | if (err) |
3718 | goto failed_mount4; | 3792 | goto failed_mount6; |
3719 | 3793 | ||
3720 | sbi->s_kobj.kset = ext4_kset; | 3794 | sbi->s_kobj.kset = ext4_kset; |
3721 | init_completion(&sbi->s_kobj_unregister); | 3795 | init_completion(&sbi->s_kobj_unregister); |
3722 | err = kobject_init_and_add(&sbi->s_kobj, &ext4_ktype, NULL, | 3796 | err = kobject_init_and_add(&sbi->s_kobj, &ext4_ktype, NULL, |
3723 | "%s", sb->s_id); | 3797 | "%s", sb->s_id); |
3724 | if (err) { | 3798 | if (err) |
3725 | ext4_mb_release(sb); | 3799 | goto failed_mount7; |
3726 | ext4_ext_release(sb); | ||
3727 | goto failed_mount4; | ||
3728 | }; | ||
3729 | 3800 | ||
3730 | EXT4_SB(sb)->s_mount_state |= EXT4_ORPHAN_FS; | 3801 | EXT4_SB(sb)->s_mount_state |= EXT4_ORPHAN_FS; |
3731 | ext4_orphan_cleanup(sb, es); | 3802 | ext4_orphan_cleanup(sb, es); |
@@ -3759,13 +3830,19 @@ cantfind_ext4: | |||
3759 | ext4_msg(sb, KERN_ERR, "VFS: Can't find ext4 filesystem"); | 3830 | ext4_msg(sb, KERN_ERR, "VFS: Can't find ext4 filesystem"); |
3760 | goto failed_mount; | 3831 | goto failed_mount; |
3761 | 3832 | ||
3833 | failed_mount7: | ||
3834 | ext4_unregister_li_request(sb); | ||
3835 | failed_mount6: | ||
3836 | ext4_ext_release(sb); | ||
3837 | failed_mount5: | ||
3838 | ext4_mb_release(sb); | ||
3839 | ext4_release_system_zone(sb); | ||
3762 | failed_mount4: | 3840 | failed_mount4: |
3763 | iput(root); | 3841 | iput(root); |
3764 | sb->s_root = NULL; | 3842 | sb->s_root = NULL; |
3765 | ext4_msg(sb, KERN_ERR, "mount failed"); | 3843 | ext4_msg(sb, KERN_ERR, "mount failed"); |
3766 | destroy_workqueue(EXT4_SB(sb)->dio_unwritten_wq); | 3844 | destroy_workqueue(EXT4_SB(sb)->dio_unwritten_wq); |
3767 | failed_mount_wq: | 3845 | failed_mount_wq: |
3768 | ext4_release_system_zone(sb); | ||
3769 | if (sbi->s_journal) { | 3846 | if (sbi->s_journal) { |
3770 | jbd2_journal_destroy(sbi->s_journal); | 3847 | jbd2_journal_destroy(sbi->s_journal); |
3771 | sbi->s_journal = NULL; | 3848 | sbi->s_journal = NULL; |
@@ -3774,10 +3851,10 @@ failed_mount3: | |||
3774 | del_timer(&sbi->s_err_report); | 3851 | del_timer(&sbi->s_err_report); |
3775 | if (sbi->s_flex_groups) | 3852 | if (sbi->s_flex_groups) |
3776 | ext4_kvfree(sbi->s_flex_groups); | 3853 | ext4_kvfree(sbi->s_flex_groups); |
3777 | percpu_counter_destroy(&sbi->s_freeblocks_counter); | 3854 | percpu_counter_destroy(&sbi->s_freeclusters_counter); |
3778 | percpu_counter_destroy(&sbi->s_freeinodes_counter); | 3855 | percpu_counter_destroy(&sbi->s_freeinodes_counter); |
3779 | percpu_counter_destroy(&sbi->s_dirs_counter); | 3856 | percpu_counter_destroy(&sbi->s_dirs_counter); |
3780 | percpu_counter_destroy(&sbi->s_dirtyblocks_counter); | 3857 | percpu_counter_destroy(&sbi->s_dirtyclusters_counter); |
3781 | if (sbi->s_mmp_tsk) | 3858 | if (sbi->s_mmp_tsk) |
3782 | kthread_stop(sbi->s_mmp_tsk); | 3859 | kthread_stop(sbi->s_mmp_tsk); |
3783 | failed_mount2: | 3860 | failed_mount2: |
@@ -4064,7 +4141,7 @@ static int ext4_commit_super(struct super_block *sb, int sync) | |||
4064 | struct buffer_head *sbh = EXT4_SB(sb)->s_sbh; | 4141 | struct buffer_head *sbh = EXT4_SB(sb)->s_sbh; |
4065 | int error = 0; | 4142 | int error = 0; |
4066 | 4143 | ||
4067 | if (!sbh) | 4144 | if (!sbh || block_device_ejected(sb)) |
4068 | return error; | 4145 | return error; |
4069 | if (buffer_write_io_error(sbh)) { | 4146 | if (buffer_write_io_error(sbh)) { |
4070 | /* | 4147 | /* |
@@ -4100,8 +4177,9 @@ static int ext4_commit_super(struct super_block *sb, int sync) | |||
4100 | else | 4177 | else |
4101 | es->s_kbytes_written = | 4178 | es->s_kbytes_written = |
4102 | cpu_to_le64(EXT4_SB(sb)->s_kbytes_written); | 4179 | cpu_to_le64(EXT4_SB(sb)->s_kbytes_written); |
4103 | ext4_free_blocks_count_set(es, percpu_counter_sum_positive( | 4180 | ext4_free_blocks_count_set(es, |
4104 | &EXT4_SB(sb)->s_freeblocks_counter)); | 4181 | EXT4_C2B(EXT4_SB(sb), percpu_counter_sum_positive( |
4182 | &EXT4_SB(sb)->s_freeclusters_counter))); | ||
4105 | es->s_free_inodes_count = | 4183 | es->s_free_inodes_count = |
4106 | cpu_to_le32(percpu_counter_sum_positive( | 4184 | cpu_to_le32(percpu_counter_sum_positive( |
4107 | &EXT4_SB(sb)->s_freeinodes_counter)); | 4185 | &EXT4_SB(sb)->s_freeinodes_counter)); |
@@ -4506,16 +4584,34 @@ restore_opts: | |||
4506 | return err; | 4584 | return err; |
4507 | } | 4585 | } |
4508 | 4586 | ||
4587 | /* | ||
4588 | * Note: calculating the overhead so we can be compatible with | ||
4589 | * historical BSD practice is quite difficult in the face of | ||
4590 | * clusters/bigalloc. This is because multiple metadata blocks from | ||
4591 | * different block group can end up in the same allocation cluster. | ||
4592 | * Calculating the exact overhead in the face of clustered allocation | ||
4593 | * requires either O(all block bitmaps) in memory or O(number of block | ||
4594 | * groups**2) in time. We will still calculate the superblock for | ||
4595 | * older file systems --- and if we come across with a bigalloc file | ||
4596 | * system with zero in s_overhead_clusters the estimate will be close to | ||
4597 | * correct especially for very large cluster sizes --- but for newer | ||
4598 | * file systems, it's better to calculate this figure once at mkfs | ||
4599 | * time, and store it in the superblock. If the superblock value is | ||
4600 | * present (even for non-bigalloc file systems), we will use it. | ||
4601 | */ | ||
4509 | static int ext4_statfs(struct dentry *dentry, struct kstatfs *buf) | 4602 | static int ext4_statfs(struct dentry *dentry, struct kstatfs *buf) |
4510 | { | 4603 | { |
4511 | struct super_block *sb = dentry->d_sb; | 4604 | struct super_block *sb = dentry->d_sb; |
4512 | struct ext4_sb_info *sbi = EXT4_SB(sb); | 4605 | struct ext4_sb_info *sbi = EXT4_SB(sb); |
4513 | struct ext4_super_block *es = sbi->s_es; | 4606 | struct ext4_super_block *es = sbi->s_es; |
4607 | struct ext4_group_desc *gdp; | ||
4514 | u64 fsid; | 4608 | u64 fsid; |
4515 | s64 bfree; | 4609 | s64 bfree; |
4516 | 4610 | ||
4517 | if (test_opt(sb, MINIX_DF)) { | 4611 | if (test_opt(sb, MINIX_DF)) { |
4518 | sbi->s_overhead_last = 0; | 4612 | sbi->s_overhead_last = 0; |
4613 | } else if (es->s_overhead_clusters) { | ||
4614 | sbi->s_overhead_last = le32_to_cpu(es->s_overhead_clusters); | ||
4519 | } else if (sbi->s_blocks_last != ext4_blocks_count(es)) { | 4615 | } else if (sbi->s_blocks_last != ext4_blocks_count(es)) { |
4520 | ext4_group_t i, ngroups = ext4_get_groups_count(sb); | 4616 | ext4_group_t i, ngroups = ext4_get_groups_count(sb); |
4521 | ext4_fsblk_t overhead = 0; | 4617 | ext4_fsblk_t overhead = 0; |
@@ -4530,24 +4626,16 @@ static int ext4_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
4530 | * All of the blocks before first_data_block are | 4626 | * All of the blocks before first_data_block are |
4531 | * overhead | 4627 | * overhead |
4532 | */ | 4628 | */ |
4533 | overhead = le32_to_cpu(es->s_first_data_block); | 4629 | overhead = EXT4_B2C(sbi, le32_to_cpu(es->s_first_data_block)); |
4534 | 4630 | ||
4535 | /* | 4631 | /* |
4536 | * Add the overhead attributed to the superblock and | 4632 | * Add the overhead found in each block group |
4537 | * block group descriptors. If the sparse superblocks | ||
4538 | * feature is turned on, then not all groups have this. | ||
4539 | */ | 4633 | */ |
4540 | for (i = 0; i < ngroups; i++) { | 4634 | for (i = 0; i < ngroups; i++) { |
4541 | overhead += ext4_bg_has_super(sb, i) + | 4635 | gdp = ext4_get_group_desc(sb, i, NULL); |
4542 | ext4_bg_num_gdb(sb, i); | 4636 | overhead += ext4_num_overhead_clusters(sb, i, gdp); |
4543 | cond_resched(); | 4637 | cond_resched(); |
4544 | } | 4638 | } |
4545 | |||
4546 | /* | ||
4547 | * Every block group has an inode bitmap, a block | ||
4548 | * bitmap, and an inode table. | ||
4549 | */ | ||
4550 | overhead += ngroups * (2 + sbi->s_itb_per_group); | ||
4551 | sbi->s_overhead_last = overhead; | 4639 | sbi->s_overhead_last = overhead; |
4552 | smp_wmb(); | 4640 | smp_wmb(); |
4553 | sbi->s_blocks_last = ext4_blocks_count(es); | 4641 | sbi->s_blocks_last = ext4_blocks_count(es); |
@@ -4555,11 +4643,12 @@ static int ext4_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
4555 | 4643 | ||
4556 | buf->f_type = EXT4_SUPER_MAGIC; | 4644 | buf->f_type = EXT4_SUPER_MAGIC; |
4557 | buf->f_bsize = sb->s_blocksize; | 4645 | buf->f_bsize = sb->s_blocksize; |
4558 | buf->f_blocks = ext4_blocks_count(es) - sbi->s_overhead_last; | 4646 | buf->f_blocks = (ext4_blocks_count(es) - |
4559 | bfree = percpu_counter_sum_positive(&sbi->s_freeblocks_counter) - | 4647 | EXT4_C2B(sbi, sbi->s_overhead_last)); |
4560 | percpu_counter_sum_positive(&sbi->s_dirtyblocks_counter); | 4648 | bfree = percpu_counter_sum_positive(&sbi->s_freeclusters_counter) - |
4649 | percpu_counter_sum_positive(&sbi->s_dirtyclusters_counter); | ||
4561 | /* prevent underflow in case that few free space is available */ | 4650 | /* prevent underflow in case that few free space is available */ |
4562 | buf->f_bfree = max_t(s64, bfree, 0); | 4651 | buf->f_bfree = EXT4_C2B(sbi, max_t(s64, bfree, 0)); |
4563 | buf->f_bavail = buf->f_bfree - ext4_r_blocks_count(es); | 4652 | buf->f_bavail = buf->f_bfree - ext4_r_blocks_count(es); |
4564 | if (buf->f_bfree < ext4_r_blocks_count(es)) | 4653 | if (buf->f_bfree < ext4_r_blocks_count(es)) |
4565 | buf->f_bavail = 0; | 4654 | buf->f_bavail = 0; |
@@ -4980,13 +5069,11 @@ static int __init ext4_init_fs(void) | |||
4980 | return err; | 5069 | return err; |
4981 | err = ext4_init_system_zone(); | 5070 | err = ext4_init_system_zone(); |
4982 | if (err) | 5071 | if (err) |
4983 | goto out7; | 5072 | goto out6; |
4984 | ext4_kset = kset_create_and_add("ext4", NULL, fs_kobj); | 5073 | ext4_kset = kset_create_and_add("ext4", NULL, fs_kobj); |
4985 | if (!ext4_kset) | 5074 | if (!ext4_kset) |
4986 | goto out6; | ||
4987 | ext4_proc_root = proc_mkdir("fs/ext4", NULL); | ||
4988 | if (!ext4_proc_root) | ||
4989 | goto out5; | 5075 | goto out5; |
5076 | ext4_proc_root = proc_mkdir("fs/ext4", NULL); | ||
4990 | 5077 | ||
4991 | err = ext4_init_feat_adverts(); | 5078 | err = ext4_init_feat_adverts(); |
4992 | if (err) | 5079 | if (err) |
@@ -5022,12 +5109,12 @@ out2: | |||
5022 | out3: | 5109 | out3: |
5023 | ext4_exit_feat_adverts(); | 5110 | ext4_exit_feat_adverts(); |
5024 | out4: | 5111 | out4: |
5025 | remove_proc_entry("fs/ext4", NULL); | 5112 | if (ext4_proc_root) |
5026 | out5: | 5113 | remove_proc_entry("fs/ext4", NULL); |
5027 | kset_unregister(ext4_kset); | 5114 | kset_unregister(ext4_kset); |
5028 | out6: | 5115 | out5: |
5029 | ext4_exit_system_zone(); | 5116 | ext4_exit_system_zone(); |
5030 | out7: | 5117 | out6: |
5031 | ext4_exit_pageio(); | 5118 | ext4_exit_pageio(); |
5032 | return err; | 5119 | return err; |
5033 | } | 5120 | } |