| .. | .. |
|---|
| 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, |
|---|
| .. | .. |
|---|
| 712 | 694 | for (i = 0; i < sbi->s_groups_count; i++) { |
|---|
| 713 | 695 | struct ext2_group_desc *gdp = ext2_get_group_desc(sb, i, NULL); |
|---|
| 714 | 696 | 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); |
|---|
| 697 | + ext2_fsblk_t last_block = ext2_group_last_block_no(sb, i); |
|---|
| 722 | 698 | |
|---|
| 723 | 699 | if (le32_to_cpu(gdp->bg_block_bitmap) < first_block || |
|---|
| 724 | 700 | le32_to_cpu(gdp->bg_block_bitmap) > last_block) |
|---|
| .. | .. |
|---|
| 780 | 756 | res += 1LL << (bits-2); |
|---|
| 781 | 757 | res += 1LL << (2*(bits-2)); |
|---|
| 782 | 758 | res += 1LL << (3*(bits-2)); |
|---|
| 759 | + /* Compute how many metadata blocks are needed */ |
|---|
| 760 | + meta_blocks = 1; |
|---|
| 761 | + meta_blocks += 1 + ppb; |
|---|
| 762 | + meta_blocks += 1 + ppb + ppb * ppb; |
|---|
| 783 | 763 | /* Does block tree limit file size? */ |
|---|
| 784 | | - if (res < upper_limit) |
|---|
| 764 | + if (res + meta_blocks <= upper_limit) |
|---|
| 785 | 765 | goto check_lfs; |
|---|
| 786 | 766 | |
|---|
| 787 | 767 | res = upper_limit; |
|---|
| .. | .. |
|---|
| 816 | 796 | { |
|---|
| 817 | 797 | struct ext2_sb_info *sbi = EXT2_SB(sb); |
|---|
| 818 | 798 | unsigned long bg, first_meta_bg; |
|---|
| 819 | | - int has_super = 0; |
|---|
| 820 | 799 | |
|---|
| 821 | 800 | first_meta_bg = le32_to_cpu(sbi->s_es->s_first_meta_bg); |
|---|
| 822 | 801 | |
|---|
| .. | .. |
|---|
| 824 | 803 | nr < first_meta_bg) |
|---|
| 825 | 804 | return (logic_sb_block + nr + 1); |
|---|
| 826 | 805 | bg = sbi->s_desc_per_block * nr; |
|---|
| 827 | | - if (ext2_bg_has_super(sb, bg)) |
|---|
| 828 | | - has_super = 1; |
|---|
| 829 | 806 | |
|---|
| 830 | | - return ext2_group_first_block_no(sb, bg) + has_super; |
|---|
| 807 | + return ext2_group_first_block_no(sb, bg) + ext2_bg_has_super(sb, bg); |
|---|
| 831 | 808 | } |
|---|
| 832 | 809 | |
|---|
| 833 | 810 | static int ext2_fill_super(struct super_block *sb, void *data, int silent) |
|---|
| .. | .. |
|---|
| 944 | 921 | sbi->s_resgid = opts.s_resgid; |
|---|
| 945 | 922 | |
|---|
| 946 | 923 | sb->s_flags = (sb->s_flags & ~SB_POSIXACL) | |
|---|
| 947 | | - ((EXT2_SB(sb)->s_mount_opt & EXT2_MOUNT_POSIX_ACL) ? |
|---|
| 948 | | - SB_POSIXACL : 0); |
|---|
| 924 | + (test_opt(sb, POSIX_ACL) ? SB_POSIXACL : 0); |
|---|
| 949 | 925 | sb->s_iflags |= SB_I_CGROUPWB; |
|---|
| 950 | 926 | |
|---|
| 951 | 927 | if (le32_to_cpu(es->s_rev_level) == EXT2_GOOD_OLD_REV && |
|---|
| .. | .. |
|---|
| 976 | 952 | |
|---|
| 977 | 953 | blocksize = BLOCK_SIZE << le32_to_cpu(sbi->s_es->s_log_block_size); |
|---|
| 978 | 954 | |
|---|
| 979 | | - if (sbi->s_mount_opt & EXT2_MOUNT_DAX) { |
|---|
| 955 | + if (test_opt(sb, DAX)) { |
|---|
| 980 | 956 | if (!bdev_dax_supported(sb->s_bdev, blocksize)) { |
|---|
| 981 | 957 | ext2_msg(sb, KERN_ERR, |
|---|
| 982 | 958 | "DAX unsupported by block device. Turning off DAX."); |
|---|
| 983 | | - sbi->s_mount_opt &= ~EXT2_MOUNT_DAX; |
|---|
| 959 | + clear_opt(sbi->s_mount_opt, DAX); |
|---|
| 984 | 960 | } |
|---|
| 985 | 961 | } |
|---|
| 986 | 962 | |
|---|
| .. | .. |
|---|
| 1012 | 988 | |
|---|
| 1013 | 989 | sb->s_maxbytes = ext2_max_size(sb->s_blocksize_bits); |
|---|
| 1014 | 990 | sb->s_max_links = EXT2_LINK_MAX; |
|---|
| 991 | + sb->s_time_min = S32_MIN; |
|---|
| 992 | + sb->s_time_max = S32_MAX; |
|---|
| 1015 | 993 | |
|---|
| 1016 | 994 | if (le32_to_cpu(es->s_rev_level) == EXT2_GOOD_OLD_REV) { |
|---|
| 1017 | 995 | sbi->s_inode_size = EXT2_GOOD_OLD_INODE_SIZE; |
|---|
| .. | .. |
|---|
| 1039 | 1017 | sbi->s_frags_per_group = le32_to_cpu(es->s_frags_per_group); |
|---|
| 1040 | 1018 | sbi->s_inodes_per_group = le32_to_cpu(es->s_inodes_per_group); |
|---|
| 1041 | 1019 | |
|---|
| 1042 | | - if (EXT2_INODE_SIZE(sb) == 0) |
|---|
| 1043 | | - goto cantfind_ext2; |
|---|
| 1044 | 1020 | sbi->s_inodes_per_block = sb->s_blocksize / EXT2_INODE_SIZE(sb); |
|---|
| 1045 | 1021 | if (sbi->s_inodes_per_block == 0 || sbi->s_inodes_per_group == 0) |
|---|
| 1046 | 1022 | goto cantfind_ext2; |
|---|
| .. | .. |
|---|
| 1084 | 1060 | sbi->s_frags_per_group); |
|---|
| 1085 | 1061 | goto failed_mount; |
|---|
| 1086 | 1062 | } |
|---|
| 1087 | | - if (sbi->s_inodes_per_group > sb->s_blocksize * 8) { |
|---|
| 1063 | + if (sbi->s_inodes_per_group < sbi->s_inodes_per_block || |
|---|
| 1064 | + sbi->s_inodes_per_group > sb->s_blocksize * 8) { |
|---|
| 1088 | 1065 | ext2_msg(sb, KERN_ERR, |
|---|
| 1089 | | - "error: #inodes per group too big: %lu", |
|---|
| 1066 | + "error: invalid #inodes per group: %lu", |
|---|
| 1090 | 1067 | sbi->s_inodes_per_group); |
|---|
| 1091 | 1068 | goto failed_mount; |
|---|
| 1092 | 1069 | } |
|---|
| .. | .. |
|---|
| 1096 | 1073 | sbi->s_groups_count = ((le32_to_cpu(es->s_blocks_count) - |
|---|
| 1097 | 1074 | le32_to_cpu(es->s_first_data_block) - 1) |
|---|
| 1098 | 1075 | / EXT2_BLOCKS_PER_GROUP(sb)) + 1; |
|---|
| 1076 | + if ((u64)sbi->s_groups_count * sbi->s_inodes_per_group != |
|---|
| 1077 | + le32_to_cpu(es->s_inodes_count)) { |
|---|
| 1078 | + ext2_msg(sb, KERN_ERR, "error: invalid #inodes: %u vs computed %llu", |
|---|
| 1079 | + le32_to_cpu(es->s_inodes_count), |
|---|
| 1080 | + (u64)sbi->s_groups_count * sbi->s_inodes_per_group); |
|---|
| 1081 | + goto failed_mount; |
|---|
| 1082 | + } |
|---|
| 1099 | 1083 | db_count = (sbi->s_groups_count + EXT2_DESC_PER_BLOCK(sb) - 1) / |
|---|
| 1100 | 1084 | EXT2_DESC_PER_BLOCK(sb); |
|---|
| 1101 | 1085 | sbi->s_group_desc = kmalloc_array (db_count, |
|---|
| 1102 | 1086 | sizeof(struct buffer_head *), |
|---|
| 1103 | 1087 | GFP_KERNEL); |
|---|
| 1104 | 1088 | if (sbi->s_group_desc == NULL) { |
|---|
| 1089 | + ret = -ENOMEM; |
|---|
| 1105 | 1090 | ext2_msg(sb, KERN_ERR, "error: not enough memory"); |
|---|
| 1106 | 1091 | goto failed_mount; |
|---|
| 1107 | 1092 | } |
|---|
| 1108 | 1093 | bgl_lock_init(sbi->s_blockgroup_lock); |
|---|
| 1109 | 1094 | sbi->s_debts = kcalloc(sbi->s_groups_count, sizeof(*sbi->s_debts), GFP_KERNEL); |
|---|
| 1110 | 1095 | if (!sbi->s_debts) { |
|---|
| 1096 | + ret = -ENOMEM; |
|---|
| 1111 | 1097 | ext2_msg(sb, KERN_ERR, "error: not enough memory"); |
|---|
| 1112 | 1098 | goto failed_mount_group_desc; |
|---|
| 1113 | 1099 | } |
|---|
| .. | .. |
|---|
| 1156 | 1142 | ext2_count_dirs(sb), GFP_KERNEL); |
|---|
| 1157 | 1143 | } |
|---|
| 1158 | 1144 | if (err) { |
|---|
| 1145 | + ret = err; |
|---|
| 1159 | 1146 | ext2_msg(sb, KERN_ERR, "error: insufficient memory"); |
|---|
| 1160 | 1147 | goto failed_mount3; |
|---|
| 1161 | 1148 | } |
|---|
| .. | .. |
|---|
| 1163 | 1150 | #ifdef CONFIG_EXT2_FS_XATTR |
|---|
| 1164 | 1151 | sbi->s_ea_block_cache = ext2_xattr_create_cache(); |
|---|
| 1165 | 1152 | if (!sbi->s_ea_block_cache) { |
|---|
| 1153 | + ret = -ENOMEM; |
|---|
| 1166 | 1154 | ext2_msg(sb, KERN_ERR, "Failed to create ea_block_cache"); |
|---|
| 1167 | 1155 | goto failed_mount3; |
|---|
| 1168 | 1156 | } |
|---|
| .. | .. |
|---|
| 1212 | 1200 | sb->s_id); |
|---|
| 1213 | 1201 | goto failed_mount; |
|---|
| 1214 | 1202 | failed_mount3: |
|---|
| 1215 | | - if (sbi->s_ea_block_cache) |
|---|
| 1216 | | - ext2_xattr_destroy_cache(sbi->s_ea_block_cache); |
|---|
| 1203 | + ext2_xattr_destroy_cache(sbi->s_ea_block_cache); |
|---|
| 1217 | 1204 | percpu_counter_destroy(&sbi->s_freeblocks_counter); |
|---|
| 1218 | 1205 | percpu_counter_destroy(&sbi->s_freeinodes_counter); |
|---|
| 1219 | 1206 | percpu_counter_destroy(&sbi->s_dirs_counter); |
|---|
| .. | .. |
|---|
| 1413 | 1400 | sbi->s_resuid = new_opts.s_resuid; |
|---|
| 1414 | 1401 | sbi->s_resgid = new_opts.s_resgid; |
|---|
| 1415 | 1402 | sb->s_flags = (sb->s_flags & ~SB_POSIXACL) | |
|---|
| 1416 | | - ((sbi->s_mount_opt & EXT2_MOUNT_POSIX_ACL) ? SB_POSIXACL : 0); |
|---|
| 1403 | + (test_opt(sb, POSIX_ACL) ? SB_POSIXACL : 0); |
|---|
| 1417 | 1404 | spin_unlock(&sbi->s_lock); |
|---|
| 1418 | 1405 | |
|---|
| 1419 | 1406 | return 0; |
|---|
| .. | .. |
|---|
| 1480 | 1467 | buf->f_namelen = EXT2_NAME_LEN; |
|---|
| 1481 | 1468 | fsid = le64_to_cpup((void *)es->s_uuid) ^ |
|---|
| 1482 | 1469 | 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; |
|---|
| 1470 | + buf->f_fsid = u64_to_fsid(fsid); |
|---|
| 1485 | 1471 | spin_unlock(&sbi->s_lock); |
|---|
| 1486 | 1472 | return 0; |
|---|
| 1487 | 1473 | } |
|---|
| .. | .. |
|---|
| 1676 | 1662 | MODULE_AUTHOR("Remy Card and others"); |
|---|
| 1677 | 1663 | MODULE_DESCRIPTION("Second Extended Filesystem"); |
|---|
| 1678 | 1664 | MODULE_LICENSE("GPL"); |
|---|
| 1665 | +MODULE_IMPORT_NS(ANDROID_GKI_VFS_EXPORT_ONLY); |
|---|
| 1679 | 1666 | module_init(init_ext2_fs) |
|---|
| 1680 | 1667 | module_exit(exit_ext2_fs) |
|---|