.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
---|
1 | 2 | /* |
---|
2 | 3 | * linux/fs/ext2/super.c |
---|
3 | 4 | * |
---|
.. | .. |
---|
73 | 74 | |
---|
74 | 75 | if (test_opt(sb, ERRORS_PANIC)) |
---|
75 | 76 | panic("EXT2-fs: panic from previous error\n"); |
---|
76 | | - if (test_opt(sb, ERRORS_RO)) { |
---|
| 77 | + if (!sb_rdonly(sb) && test_opt(sb, ERRORS_RO)) { |
---|
77 | 78 | ext2_msg(sb, KERN_CRIT, |
---|
78 | 79 | "error: remounting filesystem read-only"); |
---|
79 | 80 | sb->s_flags |= SB_RDONLY; |
---|
.. | .. |
---|
148 | 149 | |
---|
149 | 150 | ext2_quota_off_umount(sb); |
---|
150 | 151 | |
---|
151 | | - if (sbi->s_ea_block_cache) { |
---|
152 | | - ext2_xattr_destroy_cache(sbi->s_ea_block_cache); |
---|
153 | | - sbi->s_ea_block_cache = NULL; |
---|
154 | | - } |
---|
| 152 | + ext2_xattr_destroy_cache(sbi->s_ea_block_cache); |
---|
| 153 | + sbi->s_ea_block_cache = NULL; |
---|
| 154 | + |
---|
155 | 155 | if (!sb_rdonly(sb)) { |
---|
156 | 156 | struct ext2_super_block *es = sbi->s_es; |
---|
157 | 157 | |
---|
.. | .. |
---|
162 | 162 | } |
---|
163 | 163 | db_count = sbi->s_gdb_count; |
---|
164 | 164 | for (i = 0; i < db_count; i++) |
---|
165 | | - if (sbi->s_group_desc[i]) |
---|
166 | | - brelse (sbi->s_group_desc[i]); |
---|
| 165 | + brelse(sbi->s_group_desc[i]); |
---|
167 | 166 | kfree(sbi->s_group_desc); |
---|
168 | 167 | kfree(sbi->s_debts); |
---|
169 | 168 | percpu_counter_destroy(&sbi->s_freeblocks_counter); |
---|
.. | .. |
---|
193 | 192 | return &ei->vfs_inode; |
---|
194 | 193 | } |
---|
195 | 194 | |
---|
196 | | -static void ext2_i_callback(struct rcu_head *head) |
---|
| 195 | +static void ext2_free_in_core_inode(struct inode *inode) |
---|
197 | 196 | { |
---|
198 | | - struct inode *inode = container_of(head, struct inode, i_rcu); |
---|
199 | 197 | kmem_cache_free(ext2_inode_cachep, EXT2_I(inode)); |
---|
200 | | -} |
---|
201 | | - |
---|
202 | | -static void ext2_destroy_inode(struct inode *inode) |
---|
203 | | -{ |
---|
204 | | - call_rcu(&inode->i_rcu, ext2_i_callback); |
---|
205 | 198 | } |
---|
206 | 199 | |
---|
207 | 200 | static void init_once(void *foo) |
---|
.. | .. |
---|
309 | 302 | if (test_opt(sb, NOBH)) |
---|
310 | 303 | seq_puts(seq, ",nobh"); |
---|
311 | 304 | |
---|
312 | | -#if defined(CONFIG_QUOTA) |
---|
313 | | - if (sbi->s_mount_opt & EXT2_MOUNT_USRQUOTA) |
---|
| 305 | + if (test_opt(sb, USRQUOTA)) |
---|
314 | 306 | seq_puts(seq, ",usrquota"); |
---|
315 | 307 | |
---|
316 | | - if (sbi->s_mount_opt & EXT2_MOUNT_GRPQUOTA) |
---|
| 308 | + if (test_opt(sb, GRPQUOTA)) |
---|
317 | 309 | seq_puts(seq, ",grpquota"); |
---|
318 | | -#endif |
---|
319 | 310 | |
---|
320 | | -#ifdef CONFIG_FS_DAX |
---|
321 | | - if (sbi->s_mount_opt & EXT2_MOUNT_XIP) |
---|
| 311 | + if (test_opt(sb, XIP)) |
---|
322 | 312 | seq_puts(seq, ",xip"); |
---|
323 | | - if (sbi->s_mount_opt & EXT2_MOUNT_DAX) |
---|
| 313 | + |
---|
| 314 | + if (test_opt(sb, DAX)) |
---|
324 | 315 | seq_puts(seq, ",dax"); |
---|
325 | | -#endif |
---|
326 | 316 | |
---|
327 | 317 | if (!test_opt(sb, RESERVATION)) |
---|
328 | 318 | seq_puts(seq, ",noreservation"); |
---|
.. | .. |
---|
355 | 345 | |
---|
356 | 346 | static const struct super_operations ext2_sops = { |
---|
357 | 347 | .alloc_inode = ext2_alloc_inode, |
---|
358 | | - .destroy_inode = ext2_destroy_inode, |
---|
| 348 | + .free_inode = ext2_free_in_core_inode, |
---|
359 | 349 | .write_inode = ext2_write_inode, |
---|
360 | 350 | .evict_inode = ext2_evict_inode, |
---|
361 | 351 | .put_super = ext2_put_super, |
---|
.. | .. |
---|
441 | 431 | enum { |
---|
442 | 432 | Opt_bsd_df, Opt_minix_df, Opt_grpid, Opt_nogrpid, |
---|
443 | 433 | Opt_resgid, Opt_resuid, Opt_sb, Opt_err_cont, Opt_err_panic, |
---|
444 | | - Opt_err_ro, Opt_nouid32, Opt_nocheck, Opt_debug, |
---|
| 434 | + Opt_err_ro, Opt_nouid32, Opt_debug, |
---|
445 | 435 | Opt_oldalloc, Opt_orlov, Opt_nobh, Opt_user_xattr, Opt_nouser_xattr, |
---|
446 | 436 | Opt_acl, Opt_noacl, Opt_xip, Opt_dax, Opt_ignore, Opt_err, Opt_quota, |
---|
447 | 437 | Opt_usrquota, Opt_grpquota, Opt_reservation, Opt_noreservation |
---|
.. | .. |
---|
461 | 451 | {Opt_err_panic, "errors=panic"}, |
---|
462 | 452 | {Opt_err_ro, "errors=remount-ro"}, |
---|
463 | 453 | {Opt_nouid32, "nouid32"}, |
---|
464 | | - {Opt_nocheck, "check=none"}, |
---|
465 | | - {Opt_nocheck, "nocheck"}, |
---|
466 | 454 | {Opt_debug, "debug"}, |
---|
467 | 455 | {Opt_oldalloc, "oldalloc"}, |
---|
468 | 456 | {Opt_orlov, "orlov"}, |
---|
.. | .. |
---|
556 | 544 | case Opt_nouid32: |
---|
557 | 545 | set_opt (opts->s_mount_opt, NO_UID32); |
---|
558 | 546 | break; |
---|
559 | | - case Opt_nocheck: |
---|
560 | | - ext2_msg(sb, KERN_WARNING, |
---|
561 | | - "Option nocheck/check=none is deprecated and" |
---|
562 | | - " will be removed in June 2020."); |
---|
563 | | - clear_opt (opts->s_mount_opt, CHECK); |
---|
564 | | - break; |
---|
565 | 547 | case Opt_debug: |
---|
566 | 548 | set_opt (opts->s_mount_opt, DEBUG); |
---|
567 | 549 | break; |
---|
.. | .. |
---|
605 | 587 | case Opt_xip: |
---|
606 | 588 | ext2_msg(sb, KERN_INFO, "use dax instead of xip"); |
---|
607 | 589 | set_opt(opts->s_mount_opt, XIP); |
---|
608 | | - /* Fall through */ |
---|
| 590 | + fallthrough; |
---|
609 | 591 | case Opt_dax: |
---|
610 | 592 | #ifdef CONFIG_FS_DAX |
---|
611 | 593 | ext2_msg(sb, KERN_WARNING, |
---|
.. | .. |
---|
691 | 673 | es->s_max_mnt_count = cpu_to_le16(EXT2_DFL_MAX_MNT_COUNT); |
---|
692 | 674 | le16_add_cpu(&es->s_mnt_count, 1); |
---|
693 | 675 | if (test_opt (sb, DEBUG)) |
---|
694 | | - ext2_msg(sb, KERN_INFO, "%s, %s, bs=%lu, fs=%lu, gc=%lu, " |
---|
| 676 | + ext2_msg(sb, KERN_INFO, "%s, %s, bs=%lu, gc=%lu, " |
---|
695 | 677 | "bpg=%lu, ipg=%lu, mo=%04lx]", |
---|
696 | 678 | EXT2FS_VERSION, EXT2FS_DATE, sb->s_blocksize, |
---|
697 | | - sbi->s_frag_size, |
---|
698 | 679 | sbi->s_groups_count, |
---|
699 | 680 | EXT2_BLOCKS_PER_GROUP(sb), |
---|
700 | 681 | EXT2_INODES_PER_GROUP(sb), |
---|
.. | .. |
---|
712 | 693 | for (i = 0; i < sbi->s_groups_count; i++) { |
---|
713 | 694 | struct ext2_group_desc *gdp = ext2_get_group_desc(sb, i, NULL); |
---|
714 | 695 | ext2_fsblk_t first_block = ext2_group_first_block_no(sb, i); |
---|
715 | | - ext2_fsblk_t last_block; |
---|
716 | | - |
---|
717 | | - if (i == sbi->s_groups_count - 1) |
---|
718 | | - last_block = le32_to_cpu(sbi->s_es->s_blocks_count) - 1; |
---|
719 | | - else |
---|
720 | | - last_block = first_block + |
---|
721 | | - (EXT2_BLOCKS_PER_GROUP(sb) - 1); |
---|
| 696 | + ext2_fsblk_t last_block = ext2_group_last_block_no(sb, i); |
---|
722 | 697 | |
---|
723 | 698 | if (le32_to_cpu(gdp->bg_block_bitmap) < first_block || |
---|
724 | 699 | le32_to_cpu(gdp->bg_block_bitmap) > last_block) |
---|
.. | .. |
---|
780 | 755 | res += 1LL << (bits-2); |
---|
781 | 756 | res += 1LL << (2*(bits-2)); |
---|
782 | 757 | res += 1LL << (3*(bits-2)); |
---|
| 758 | + /* Compute how many metadata blocks are needed */ |
---|
| 759 | + meta_blocks = 1; |
---|
| 760 | + meta_blocks += 1 + ppb; |
---|
| 761 | + meta_blocks += 1 + ppb + ppb * ppb; |
---|
783 | 762 | /* Does block tree limit file size? */ |
---|
784 | | - if (res < upper_limit) |
---|
| 763 | + if (res + meta_blocks <= upper_limit) |
---|
785 | 764 | goto check_lfs; |
---|
786 | 765 | |
---|
787 | 766 | res = upper_limit; |
---|
.. | .. |
---|
816 | 795 | { |
---|
817 | 796 | struct ext2_sb_info *sbi = EXT2_SB(sb); |
---|
818 | 797 | unsigned long bg, first_meta_bg; |
---|
819 | | - int has_super = 0; |
---|
820 | 798 | |
---|
821 | 799 | first_meta_bg = le32_to_cpu(sbi->s_es->s_first_meta_bg); |
---|
822 | 800 | |
---|
.. | .. |
---|
824 | 802 | nr < first_meta_bg) |
---|
825 | 803 | return (logic_sb_block + nr + 1); |
---|
826 | 804 | bg = sbi->s_desc_per_block * nr; |
---|
827 | | - if (ext2_bg_has_super(sb, bg)) |
---|
828 | | - has_super = 1; |
---|
829 | 805 | |
---|
830 | | - return ext2_group_first_block_no(sb, bg) + has_super; |
---|
| 806 | + return ext2_group_first_block_no(sb, bg) + ext2_bg_has_super(sb, bg); |
---|
831 | 807 | } |
---|
832 | 808 | |
---|
833 | 809 | static int ext2_fill_super(struct super_block *sb, void *data, int silent) |
---|
.. | .. |
---|
944 | 920 | sbi->s_resgid = opts.s_resgid; |
---|
945 | 921 | |
---|
946 | 922 | sb->s_flags = (sb->s_flags & ~SB_POSIXACL) | |
---|
947 | | - ((EXT2_SB(sb)->s_mount_opt & EXT2_MOUNT_POSIX_ACL) ? |
---|
948 | | - SB_POSIXACL : 0); |
---|
| 923 | + (test_opt(sb, POSIX_ACL) ? SB_POSIXACL : 0); |
---|
949 | 924 | sb->s_iflags |= SB_I_CGROUPWB; |
---|
950 | 925 | |
---|
951 | 926 | if (le32_to_cpu(es->s_rev_level) == EXT2_GOOD_OLD_REV && |
---|
.. | .. |
---|
974 | 949 | goto failed_mount; |
---|
975 | 950 | } |
---|
976 | 951 | |
---|
| 952 | + if (le32_to_cpu(es->s_log_block_size) > |
---|
| 953 | + (EXT2_MAX_BLOCK_LOG_SIZE - BLOCK_SIZE_BITS)) { |
---|
| 954 | + ext2_msg(sb, KERN_ERR, |
---|
| 955 | + "Invalid log block size: %u", |
---|
| 956 | + le32_to_cpu(es->s_log_block_size)); |
---|
| 957 | + goto failed_mount; |
---|
| 958 | + } |
---|
977 | 959 | blocksize = BLOCK_SIZE << le32_to_cpu(sbi->s_es->s_log_block_size); |
---|
978 | 960 | |
---|
979 | | - if (sbi->s_mount_opt & EXT2_MOUNT_DAX) { |
---|
| 961 | + if (test_opt(sb, DAX)) { |
---|
980 | 962 | if (!bdev_dax_supported(sb->s_bdev, blocksize)) { |
---|
981 | 963 | ext2_msg(sb, KERN_ERR, |
---|
982 | 964 | "DAX unsupported by block device. Turning off DAX."); |
---|
983 | | - sbi->s_mount_opt &= ~EXT2_MOUNT_DAX; |
---|
| 965 | + clear_opt(sbi->s_mount_opt, DAX); |
---|
984 | 966 | } |
---|
985 | 967 | } |
---|
986 | 968 | |
---|
.. | .. |
---|
1012 | 994 | |
---|
1013 | 995 | sb->s_maxbytes = ext2_max_size(sb->s_blocksize_bits); |
---|
1014 | 996 | sb->s_max_links = EXT2_LINK_MAX; |
---|
| 997 | + sb->s_time_min = S32_MIN; |
---|
| 998 | + sb->s_time_max = S32_MAX; |
---|
1015 | 999 | |
---|
1016 | 1000 | if (le32_to_cpu(es->s_rev_level) == EXT2_GOOD_OLD_REV) { |
---|
1017 | 1001 | sbi->s_inode_size = EXT2_GOOD_OLD_INODE_SIZE; |
---|
.. | .. |
---|
1029 | 1013 | } |
---|
1030 | 1014 | } |
---|
1031 | 1015 | |
---|
1032 | | - sbi->s_frag_size = EXT2_MIN_FRAG_SIZE << |
---|
1033 | | - le32_to_cpu(es->s_log_frag_size); |
---|
1034 | | - if (sbi->s_frag_size == 0) |
---|
1035 | | - goto cantfind_ext2; |
---|
1036 | | - sbi->s_frags_per_block = sb->s_blocksize / sbi->s_frag_size; |
---|
1037 | | - |
---|
1038 | 1016 | sbi->s_blocks_per_group = le32_to_cpu(es->s_blocks_per_group); |
---|
1039 | | - sbi->s_frags_per_group = le32_to_cpu(es->s_frags_per_group); |
---|
1040 | 1017 | sbi->s_inodes_per_group = le32_to_cpu(es->s_inodes_per_group); |
---|
1041 | 1018 | |
---|
1042 | | - if (EXT2_INODE_SIZE(sb) == 0) |
---|
1043 | | - goto cantfind_ext2; |
---|
1044 | 1019 | sbi->s_inodes_per_block = sb->s_blocksize / EXT2_INODE_SIZE(sb); |
---|
1045 | 1020 | if (sbi->s_inodes_per_block == 0 || sbi->s_inodes_per_group == 0) |
---|
1046 | 1021 | goto cantfind_ext2; |
---|
.. | .. |
---|
1064 | 1039 | goto failed_mount; |
---|
1065 | 1040 | } |
---|
1066 | 1041 | |
---|
1067 | | - if (sb->s_blocksize != sbi->s_frag_size) { |
---|
| 1042 | + if (es->s_log_frag_size != es->s_log_block_size) { |
---|
1068 | 1043 | ext2_msg(sb, KERN_ERR, |
---|
1069 | | - "error: fragsize %lu != blocksize %lu" |
---|
1070 | | - "(not supported yet)", |
---|
1071 | | - sbi->s_frag_size, sb->s_blocksize); |
---|
| 1044 | + "error: fragsize log %u != blocksize log %u", |
---|
| 1045 | + le32_to_cpu(es->s_log_frag_size), sb->s_blocksize_bits); |
---|
1072 | 1046 | goto failed_mount; |
---|
1073 | 1047 | } |
---|
1074 | 1048 | |
---|
.. | .. |
---|
1078 | 1052 | sbi->s_blocks_per_group); |
---|
1079 | 1053 | goto failed_mount; |
---|
1080 | 1054 | } |
---|
1081 | | - if (sbi->s_frags_per_group > sb->s_blocksize * 8) { |
---|
| 1055 | + if (sbi->s_inodes_per_group < sbi->s_inodes_per_block || |
---|
| 1056 | + sbi->s_inodes_per_group > sb->s_blocksize * 8) { |
---|
1082 | 1057 | ext2_msg(sb, KERN_ERR, |
---|
1083 | | - "error: #fragments per group too big: %lu", |
---|
1084 | | - sbi->s_frags_per_group); |
---|
1085 | | - goto failed_mount; |
---|
1086 | | - } |
---|
1087 | | - if (sbi->s_inodes_per_group > sb->s_blocksize * 8) { |
---|
1088 | | - ext2_msg(sb, KERN_ERR, |
---|
1089 | | - "error: #inodes per group too big: %lu", |
---|
| 1058 | + "error: invalid #inodes per group: %lu", |
---|
1090 | 1059 | sbi->s_inodes_per_group); |
---|
1091 | 1060 | goto failed_mount; |
---|
1092 | 1061 | } |
---|
.. | .. |
---|
1096 | 1065 | sbi->s_groups_count = ((le32_to_cpu(es->s_blocks_count) - |
---|
1097 | 1066 | le32_to_cpu(es->s_first_data_block) - 1) |
---|
1098 | 1067 | / EXT2_BLOCKS_PER_GROUP(sb)) + 1; |
---|
| 1068 | + if ((u64)sbi->s_groups_count * sbi->s_inodes_per_group != |
---|
| 1069 | + le32_to_cpu(es->s_inodes_count)) { |
---|
| 1070 | + ext2_msg(sb, KERN_ERR, "error: invalid #inodes: %u vs computed %llu", |
---|
| 1071 | + le32_to_cpu(es->s_inodes_count), |
---|
| 1072 | + (u64)sbi->s_groups_count * sbi->s_inodes_per_group); |
---|
| 1073 | + goto failed_mount; |
---|
| 1074 | + } |
---|
1099 | 1075 | db_count = (sbi->s_groups_count + EXT2_DESC_PER_BLOCK(sb) - 1) / |
---|
1100 | 1076 | EXT2_DESC_PER_BLOCK(sb); |
---|
1101 | 1077 | sbi->s_group_desc = kmalloc_array (db_count, |
---|
1102 | 1078 | sizeof(struct buffer_head *), |
---|
1103 | 1079 | GFP_KERNEL); |
---|
1104 | 1080 | if (sbi->s_group_desc == NULL) { |
---|
| 1081 | + ret = -ENOMEM; |
---|
1105 | 1082 | ext2_msg(sb, KERN_ERR, "error: not enough memory"); |
---|
1106 | 1083 | goto failed_mount; |
---|
1107 | 1084 | } |
---|
1108 | 1085 | bgl_lock_init(sbi->s_blockgroup_lock); |
---|
1109 | 1086 | sbi->s_debts = kcalloc(sbi->s_groups_count, sizeof(*sbi->s_debts), GFP_KERNEL); |
---|
1110 | 1087 | if (!sbi->s_debts) { |
---|
| 1088 | + ret = -ENOMEM; |
---|
1111 | 1089 | ext2_msg(sb, KERN_ERR, "error: not enough memory"); |
---|
1112 | 1090 | goto failed_mount_group_desc; |
---|
1113 | 1091 | } |
---|
.. | .. |
---|
1156 | 1134 | ext2_count_dirs(sb), GFP_KERNEL); |
---|
1157 | 1135 | } |
---|
1158 | 1136 | if (err) { |
---|
| 1137 | + ret = err; |
---|
1159 | 1138 | ext2_msg(sb, KERN_ERR, "error: insufficient memory"); |
---|
1160 | 1139 | goto failed_mount3; |
---|
1161 | 1140 | } |
---|
.. | .. |
---|
1163 | 1142 | #ifdef CONFIG_EXT2_FS_XATTR |
---|
1164 | 1143 | sbi->s_ea_block_cache = ext2_xattr_create_cache(); |
---|
1165 | 1144 | if (!sbi->s_ea_block_cache) { |
---|
| 1145 | + ret = -ENOMEM; |
---|
1166 | 1146 | ext2_msg(sb, KERN_ERR, "Failed to create ea_block_cache"); |
---|
1167 | 1147 | goto failed_mount3; |
---|
1168 | 1148 | } |
---|
.. | .. |
---|
1212 | 1192 | sb->s_id); |
---|
1213 | 1193 | goto failed_mount; |
---|
1214 | 1194 | failed_mount3: |
---|
1215 | | - if (sbi->s_ea_block_cache) |
---|
1216 | | - ext2_xattr_destroy_cache(sbi->s_ea_block_cache); |
---|
| 1195 | + ext2_xattr_destroy_cache(sbi->s_ea_block_cache); |
---|
1217 | 1196 | percpu_counter_destroy(&sbi->s_freeblocks_counter); |
---|
1218 | 1197 | percpu_counter_destroy(&sbi->s_freeinodes_counter); |
---|
1219 | 1198 | percpu_counter_destroy(&sbi->s_dirs_counter); |
---|
.. | .. |
---|
1413 | 1392 | sbi->s_resuid = new_opts.s_resuid; |
---|
1414 | 1393 | sbi->s_resgid = new_opts.s_resgid; |
---|
1415 | 1394 | sb->s_flags = (sb->s_flags & ~SB_POSIXACL) | |
---|
1416 | | - ((sbi->s_mount_opt & EXT2_MOUNT_POSIX_ACL) ? SB_POSIXACL : 0); |
---|
| 1395 | + (test_opt(sb, POSIX_ACL) ? SB_POSIXACL : 0); |
---|
1417 | 1396 | spin_unlock(&sbi->s_lock); |
---|
1418 | 1397 | |
---|
1419 | 1398 | return 0; |
---|
.. | .. |
---|
1480 | 1459 | buf->f_namelen = EXT2_NAME_LEN; |
---|
1481 | 1460 | fsid = le64_to_cpup((void *)es->s_uuid) ^ |
---|
1482 | 1461 | le64_to_cpup((void *)es->s_uuid + sizeof(u64)); |
---|
1483 | | - buf->f_fsid.val[0] = fsid & 0xFFFFFFFFUL; |
---|
1484 | | - buf->f_fsid.val[1] = (fsid >> 32) & 0xFFFFFFFFUL; |
---|
| 1462 | + buf->f_fsid = u64_to_fsid(fsid); |
---|
1485 | 1463 | spin_unlock(&sbi->s_lock); |
---|
1486 | 1464 | return 0; |
---|
1487 | 1465 | } |
---|
.. | .. |
---|
1676 | 1654 | MODULE_AUTHOR("Remy Card and others"); |
---|
1677 | 1655 | MODULE_DESCRIPTION("Second Extended Filesystem"); |
---|
1678 | 1656 | MODULE_LICENSE("GPL"); |
---|
| 1657 | +MODULE_IMPORT_NS(ANDROID_GKI_VFS_EXPORT_ONLY); |
---|
1679 | 1658 | module_init(init_ext2_fs) |
---|
1680 | 1659 | module_exit(exit_ext2_fs) |
---|