11e9ea7e0SNamjae Jeon // SPDX-License-Identifier: GPL-2.0-or-later 21e9ea7e0SNamjae Jeon /* 36251f0b0SNamjae Jeon * NTFS kernel super block handling. 41e9ea7e0SNamjae Jeon * 51e9ea7e0SNamjae Jeon * Copyright (c) 2001-2012 Anton Altaparmakov and Tuxera Inc. 61e9ea7e0SNamjae Jeon * Copyright (c) 2001,2002 Richard Russon 76251f0b0SNamjae Jeon * Copyright (c) 2025 LG Electronics Co., Ltd. 81e9ea7e0SNamjae Jeon */ 91e9ea7e0SNamjae Jeon 101e9ea7e0SNamjae Jeon #include <linux/blkdev.h> /* For bdev_logical_block_size(). */ 111e9ea7e0SNamjae Jeon #include <linux/backing-dev.h> 121e9ea7e0SNamjae Jeon #include <linux/vfs.h> 136251f0b0SNamjae Jeon #include <linux/fs_struct.h> 146251f0b0SNamjae Jeon #include <linux/sched/mm.h> 156251f0b0SNamjae Jeon #include <linux/fs_context.h> 166251f0b0SNamjae Jeon #include <linux/fs_parser.h> 171e9ea7e0SNamjae Jeon 181e9ea7e0SNamjae Jeon #include "sysctl.h" 191e9ea7e0SNamjae Jeon #include "logfile.h" 201e9ea7e0SNamjae Jeon #include "quota.h" 211e9ea7e0SNamjae Jeon #include "index.h" 221e9ea7e0SNamjae Jeon #include "ntfs.h" 236251f0b0SNamjae Jeon #include "ea.h" 246251f0b0SNamjae Jeon #include "volume.h" 251e9ea7e0SNamjae Jeon 261e9ea7e0SNamjae Jeon /* A global default upcase table and a corresponding reference count. */ 276251f0b0SNamjae Jeon static __le16 *default_upcase; 281e9ea7e0SNamjae Jeon static unsigned long ntfs_nr_upcase_users; 291e9ea7e0SNamjae Jeon 306251f0b0SNamjae Jeon static struct workqueue_struct *ntfs_wq; 316251f0b0SNamjae Jeon 321e9ea7e0SNamjae Jeon /* Error constants/strings used in inode.c::ntfs_show_options(). */ 336251f0b0SNamjae Jeon enum { 341e9ea7e0SNamjae Jeon /* One of these must be present, default is ON_ERRORS_CONTINUE. */ 351e9ea7e0SNamjae Jeon ON_ERRORS_PANIC = 0x01, 361e9ea7e0SNamjae Jeon ON_ERRORS_REMOUNT_RO = 0x02, 371e9ea7e0SNamjae Jeon ON_ERRORS_CONTINUE = 0x04, 381e9ea7e0SNamjae Jeon }; 391e9ea7e0SNamjae Jeon 406251f0b0SNamjae Jeon static const struct constant_table ntfs_param_enums[] = { 416251f0b0SNamjae Jeon { "panic", ON_ERRORS_PANIC }, 426251f0b0SNamjae Jeon { "remount-ro", ON_ERRORS_REMOUNT_RO }, 436251f0b0SNamjae Jeon { "continue", ON_ERRORS_CONTINUE }, 446251f0b0SNamjae Jeon {} 456251f0b0SNamjae Jeon }; 461e9ea7e0SNamjae Jeon 476251f0b0SNamjae Jeon enum { 486251f0b0SNamjae Jeon Opt_uid, 496251f0b0SNamjae Jeon Opt_gid, 506251f0b0SNamjae Jeon Opt_umask, 516251f0b0SNamjae Jeon Opt_dmask, 526251f0b0SNamjae Jeon Opt_fmask, 536251f0b0SNamjae Jeon Opt_errors, 546251f0b0SNamjae Jeon Opt_nls, 556251f0b0SNamjae Jeon Opt_charset, 566251f0b0SNamjae Jeon Opt_show_sys_files, 576251f0b0SNamjae Jeon Opt_show_meta, 586251f0b0SNamjae Jeon Opt_case_sensitive, 596251f0b0SNamjae Jeon Opt_disable_sparse, 606251f0b0SNamjae Jeon Opt_sparse, 616251f0b0SNamjae Jeon Opt_mft_zone_multiplier, 626251f0b0SNamjae Jeon Opt_preallocated_size, 636251f0b0SNamjae Jeon Opt_sys_immutable, 646251f0b0SNamjae Jeon Opt_nohidden, 656251f0b0SNamjae Jeon Opt_hide_dot_files, 666251f0b0SNamjae Jeon Opt_check_windows_names, 676251f0b0SNamjae Jeon Opt_acl, 686251f0b0SNamjae Jeon Opt_discard, 696251f0b0SNamjae Jeon Opt_nocase, 706251f0b0SNamjae Jeon }; 711e9ea7e0SNamjae Jeon 726251f0b0SNamjae Jeon static const struct fs_parameter_spec ntfs_parameters[] = { 736251f0b0SNamjae Jeon fsparam_u32("uid", Opt_uid), 746251f0b0SNamjae Jeon fsparam_u32("gid", Opt_gid), 756251f0b0SNamjae Jeon fsparam_u32oct("umask", Opt_umask), 766251f0b0SNamjae Jeon fsparam_u32oct("dmask", Opt_dmask), 776251f0b0SNamjae Jeon fsparam_u32oct("fmask", Opt_fmask), 786251f0b0SNamjae Jeon fsparam_string("nls", Opt_nls), 796251f0b0SNamjae Jeon fsparam_string("iocharset", Opt_charset), 806251f0b0SNamjae Jeon fsparam_enum("errors", Opt_errors, ntfs_param_enums), 816251f0b0SNamjae Jeon fsparam_flag("show_sys_files", Opt_show_sys_files), 826251f0b0SNamjae Jeon fsparam_flag("showmeta", Opt_show_meta), 836251f0b0SNamjae Jeon fsparam_flag("case_sensitive", Opt_case_sensitive), 846251f0b0SNamjae Jeon fsparam_flag("disable_sparse", Opt_disable_sparse), 856251f0b0SNamjae Jeon fsparam_s32("mft_zone_multiplier", Opt_mft_zone_multiplier), 866251f0b0SNamjae Jeon fsparam_u64("preallocated_size", Opt_preallocated_size), 876251f0b0SNamjae Jeon fsparam_flag("sys_immutable", Opt_sys_immutable), 886251f0b0SNamjae Jeon fsparam_flag("nohidden", Opt_nohidden), 896251f0b0SNamjae Jeon fsparam_flag("hide_dot_files", Opt_hide_dot_files), 906251f0b0SNamjae Jeon fsparam_flag("windows_names", Opt_check_windows_names), 916251f0b0SNamjae Jeon fsparam_flag("acl", Opt_acl), 926251f0b0SNamjae Jeon fsparam_flag("discard", Opt_discard), 936251f0b0SNamjae Jeon fsparam_flag("sparse", Opt_sparse), 946251f0b0SNamjae Jeon fsparam_flag("nocase", Opt_nocase), 956251f0b0SNamjae Jeon {} 966251f0b0SNamjae Jeon }; 976251f0b0SNamjae Jeon 986251f0b0SNamjae Jeon static int ntfs_parse_param(struct fs_context *fc, struct fs_parameter *param) 996251f0b0SNamjae Jeon { 1006251f0b0SNamjae Jeon struct ntfs_volume *vol = fc->s_fs_info; 1016251f0b0SNamjae Jeon struct fs_parse_result result; 1026251f0b0SNamjae Jeon int opt; 1036251f0b0SNamjae Jeon 1046251f0b0SNamjae Jeon opt = fs_parse(fc, ntfs_parameters, param, &result); 1056251f0b0SNamjae Jeon if (opt < 0) 1066251f0b0SNamjae Jeon return opt; 1076251f0b0SNamjae Jeon 1086251f0b0SNamjae Jeon switch (opt) { 1096251f0b0SNamjae Jeon case Opt_uid: 1106251f0b0SNamjae Jeon vol->uid = make_kuid(current_user_ns(), result.uint_32); 1116251f0b0SNamjae Jeon break; 1126251f0b0SNamjae Jeon case Opt_gid: 1136251f0b0SNamjae Jeon vol->gid = make_kgid(current_user_ns(), result.uint_32); 1146251f0b0SNamjae Jeon break; 1156251f0b0SNamjae Jeon case Opt_umask: 1166251f0b0SNamjae Jeon vol->fmask = vol->dmask = result.uint_32; 1176251f0b0SNamjae Jeon break; 1186251f0b0SNamjae Jeon case Opt_dmask: 1196251f0b0SNamjae Jeon vol->dmask = result.uint_32; 1206251f0b0SNamjae Jeon break; 1216251f0b0SNamjae Jeon case Opt_fmask: 1226251f0b0SNamjae Jeon vol->fmask = result.uint_32; 1236251f0b0SNamjae Jeon break; 1246251f0b0SNamjae Jeon case Opt_errors: 1256251f0b0SNamjae Jeon vol->on_errors = result.uint_32; 1266251f0b0SNamjae Jeon break; 1276251f0b0SNamjae Jeon case Opt_nls: 1286251f0b0SNamjae Jeon case Opt_charset: 1296251f0b0SNamjae Jeon if (vol->nls_map) 1306251f0b0SNamjae Jeon unload_nls(vol->nls_map); 1316251f0b0SNamjae Jeon vol->nls_map = load_nls(param->string); 1321e9ea7e0SNamjae Jeon if (!vol->nls_map) { 1336251f0b0SNamjae Jeon ntfs_error(vol->sb, "Failed to load NLS table '%s'.", 1346251f0b0SNamjae Jeon param->string); 1356251f0b0SNamjae Jeon return -EINVAL; 1361e9ea7e0SNamjae Jeon } 1376251f0b0SNamjae Jeon break; 1386251f0b0SNamjae Jeon case Opt_mft_zone_multiplier: 1391e9ea7e0SNamjae Jeon if (vol->mft_zone_multiplier && vol->mft_zone_multiplier != 1406251f0b0SNamjae Jeon result.int_32) { 1416251f0b0SNamjae Jeon ntfs_error(vol->sb, "Cannot change mft_zone_multiplier on remount."); 1426251f0b0SNamjae Jeon return -EINVAL; 1431e9ea7e0SNamjae Jeon } 1446251f0b0SNamjae Jeon if (result.int_32 < 1 || result.int_32 > 4) { 1456251f0b0SNamjae Jeon ntfs_error(vol->sb, 1466251f0b0SNamjae Jeon "Invalid mft_zone_multiplier. Using default value, i.e. 1."); 1471e9ea7e0SNamjae Jeon vol->mft_zone_multiplier = 1; 1486251f0b0SNamjae Jeon } else 1496251f0b0SNamjae Jeon vol->mft_zone_multiplier = result.int_32; 1506251f0b0SNamjae Jeon break; 1516251f0b0SNamjae Jeon case Opt_show_sys_files: 1526251f0b0SNamjae Jeon case Opt_show_meta: 1536251f0b0SNamjae Jeon if (result.boolean) 1541e9ea7e0SNamjae Jeon NVolSetShowSystemFiles(vol); 1551e9ea7e0SNamjae Jeon else 1561e9ea7e0SNamjae Jeon NVolClearShowSystemFiles(vol); 1576251f0b0SNamjae Jeon break; 1586251f0b0SNamjae Jeon case Opt_case_sensitive: 1596251f0b0SNamjae Jeon if (result.boolean) 1601e9ea7e0SNamjae Jeon NVolSetCaseSensitive(vol); 1611e9ea7e0SNamjae Jeon else 1621e9ea7e0SNamjae Jeon NVolClearCaseSensitive(vol); 1636251f0b0SNamjae Jeon break; 1646251f0b0SNamjae Jeon case Opt_nocase: 1656251f0b0SNamjae Jeon if (result.boolean) 1666251f0b0SNamjae Jeon NVolClearCaseSensitive(vol); 1671e9ea7e0SNamjae Jeon else 1686251f0b0SNamjae Jeon NVolSetCaseSensitive(vol); 1696251f0b0SNamjae Jeon break; 1706251f0b0SNamjae Jeon case Opt_preallocated_size: 1716251f0b0SNamjae Jeon vol->preallocated_size = (loff_t)result.uint_64; 1726251f0b0SNamjae Jeon break; 1736251f0b0SNamjae Jeon case Opt_sys_immutable: 1746251f0b0SNamjae Jeon if (result.boolean) 1756251f0b0SNamjae Jeon NVolSetSysImmutable(vol); 1766251f0b0SNamjae Jeon else 1776251f0b0SNamjae Jeon NVolClearSysImmutable(vol); 1786251f0b0SNamjae Jeon break; 1796251f0b0SNamjae Jeon case Opt_nohidden: 1806251f0b0SNamjae Jeon if (result.boolean) 1816251f0b0SNamjae Jeon NVolClearShowHiddenFiles(vol); 1826251f0b0SNamjae Jeon else 1836251f0b0SNamjae Jeon NVolSetShowHiddenFiles(vol); 1846251f0b0SNamjae Jeon break; 1856251f0b0SNamjae Jeon case Opt_hide_dot_files: 1866251f0b0SNamjae Jeon if (result.boolean) 1876251f0b0SNamjae Jeon NVolSetHideDotFiles(vol); 1886251f0b0SNamjae Jeon else 1896251f0b0SNamjae Jeon NVolClearHideDotFiles(vol); 1906251f0b0SNamjae Jeon break; 1916251f0b0SNamjae Jeon case Opt_check_windows_names: 1926251f0b0SNamjae Jeon if (result.boolean) 1936251f0b0SNamjae Jeon NVolSetCheckWindowsNames(vol); 1946251f0b0SNamjae Jeon else 1956251f0b0SNamjae Jeon NVolClearCheckWindowsNames(vol); 1966251f0b0SNamjae Jeon break; 1976251f0b0SNamjae Jeon case Opt_acl: 1986251f0b0SNamjae Jeon #ifdef CONFIG_NTFS_FS_POSIX_ACL 1996251f0b0SNamjae Jeon if (result.boolean) 2006251f0b0SNamjae Jeon fc->sb_flags |= SB_POSIXACL; 2016251f0b0SNamjae Jeon else 2026251f0b0SNamjae Jeon fc->sb_flags &= ~SB_POSIXACL; 2036251f0b0SNamjae Jeon break; 2046251f0b0SNamjae Jeon #else 2056251f0b0SNamjae Jeon return -EINVAL; 2066251f0b0SNamjae Jeon #endif 2076251f0b0SNamjae Jeon case Opt_discard: 2086251f0b0SNamjae Jeon if (result.boolean) 2096251f0b0SNamjae Jeon NVolSetDiscard(vol); 2106251f0b0SNamjae Jeon else 2116251f0b0SNamjae Jeon NVolClearDiscard(vol); 2126251f0b0SNamjae Jeon break; 2136251f0b0SNamjae Jeon case Opt_disable_sparse: 2146251f0b0SNamjae Jeon if (result.boolean) 2156251f0b0SNamjae Jeon NVolSetDisableSparse(vol); 2166251f0b0SNamjae Jeon else 2176251f0b0SNamjae Jeon NVolClearDisableSparse(vol); 2186251f0b0SNamjae Jeon break; 2196251f0b0SNamjae Jeon case Opt_sparse: 2206251f0b0SNamjae Jeon break; 2216251f0b0SNamjae Jeon default: 2226251f0b0SNamjae Jeon return -EINVAL; 2231e9ea7e0SNamjae Jeon } 2241e9ea7e0SNamjae Jeon 2256251f0b0SNamjae Jeon return 0; 2266251f0b0SNamjae Jeon } 2271e9ea7e0SNamjae Jeon 2286251f0b0SNamjae Jeon static int ntfs_reconfigure(struct fs_context *fc) 2296251f0b0SNamjae Jeon { 2306251f0b0SNamjae Jeon struct super_block *sb = fc->root->d_sb; 2316251f0b0SNamjae Jeon struct ntfs_volume *vol = NTFS_SB(sb); 2326251f0b0SNamjae Jeon 2336251f0b0SNamjae Jeon ntfs_debug("Entering with remount"); 2346251f0b0SNamjae Jeon 2356251f0b0SNamjae Jeon sync_filesystem(sb); 2366251f0b0SNamjae Jeon 2376251f0b0SNamjae Jeon /* 2386251f0b0SNamjae Jeon * For the read-write compiled driver, if we are remounting read-write, 2396251f0b0SNamjae Jeon * make sure there are no volume errors and that no unsupported volume 2406251f0b0SNamjae Jeon * flags are set. Also, empty the logfile journal as it would become 2416251f0b0SNamjae Jeon * stale as soon as something is written to the volume and mark the 2426251f0b0SNamjae Jeon * volume dirty so that chkdsk is run if the volume is not umounted 2436251f0b0SNamjae Jeon * cleanly. Finally, mark the quotas out of date so Windows rescans 2446251f0b0SNamjae Jeon * the volume on boot and updates them. 2456251f0b0SNamjae Jeon * 2466251f0b0SNamjae Jeon * When remounting read-only, mark the volume clean if no volume errors 2476251f0b0SNamjae Jeon * have occurred. 2486251f0b0SNamjae Jeon */ 2496251f0b0SNamjae Jeon if (sb_rdonly(sb) && !(fc->sb_flags & SB_RDONLY)) { 2506251f0b0SNamjae Jeon static const char *es = ". Cannot remount read-write."; 2516251f0b0SNamjae Jeon 2526251f0b0SNamjae Jeon /* Remounting read-write. */ 2536251f0b0SNamjae Jeon if (NVolErrors(vol)) { 2546251f0b0SNamjae Jeon ntfs_error(sb, "Volume has errors and is read-only%s", 2556251f0b0SNamjae Jeon es); 2566251f0b0SNamjae Jeon return -EROFS; 2576251f0b0SNamjae Jeon } 2586251f0b0SNamjae Jeon if (vol->vol_flags & VOLUME_IS_DIRTY) { 2596251f0b0SNamjae Jeon ntfs_error(sb, "Volume is dirty and read-only%s", es); 2606251f0b0SNamjae Jeon return -EROFS; 2616251f0b0SNamjae Jeon } 2626251f0b0SNamjae Jeon if (vol->vol_flags & VOLUME_MODIFIED_BY_CHKDSK) { 2636251f0b0SNamjae Jeon ntfs_error(sb, "Volume has been modified by chkdsk and is read-only%s", es); 2646251f0b0SNamjae Jeon return -EROFS; 2656251f0b0SNamjae Jeon } 2666251f0b0SNamjae Jeon if (vol->vol_flags & VOLUME_MUST_MOUNT_RO_MASK) { 2676251f0b0SNamjae Jeon ntfs_error(sb, "Volume has unsupported flags set (0x%x) and is read-only%s", 2686251f0b0SNamjae Jeon le16_to_cpu(vol->vol_flags), es); 2696251f0b0SNamjae Jeon return -EROFS; 2706251f0b0SNamjae Jeon } 2716251f0b0SNamjae Jeon if (vol->logfile_ino && !ntfs_empty_logfile(vol->logfile_ino)) { 2726251f0b0SNamjae Jeon ntfs_error(sb, "Failed to empty journal LogFile%s", 2736251f0b0SNamjae Jeon es); 2746251f0b0SNamjae Jeon NVolSetErrors(vol); 2756251f0b0SNamjae Jeon return -EROFS; 2766251f0b0SNamjae Jeon } 2776251f0b0SNamjae Jeon if (!ntfs_mark_quotas_out_of_date(vol)) { 2786251f0b0SNamjae Jeon ntfs_error(sb, "Failed to mark quotas out of date%s", 2796251f0b0SNamjae Jeon es); 2806251f0b0SNamjae Jeon NVolSetErrors(vol); 2816251f0b0SNamjae Jeon return -EROFS; 2826251f0b0SNamjae Jeon } 2836251f0b0SNamjae Jeon } else if (!sb_rdonly(sb) && (fc->sb_flags & SB_RDONLY)) { 2846251f0b0SNamjae Jeon /* Remounting read-only. */ 2856251f0b0SNamjae Jeon if (!NVolErrors(vol)) { 2866251f0b0SNamjae Jeon if (ntfs_clear_volume_flags(vol, VOLUME_IS_DIRTY)) 2876251f0b0SNamjae Jeon ntfs_warning(sb, 2886251f0b0SNamjae Jeon "Failed to clear dirty bit in volume information flags. Run chkdsk."); 2896251f0b0SNamjae Jeon } 2906251f0b0SNamjae Jeon } 2916251f0b0SNamjae Jeon 2926251f0b0SNamjae Jeon ntfs_debug("Done."); 2936251f0b0SNamjae Jeon return 0; 2946251f0b0SNamjae Jeon } 2956251f0b0SNamjae Jeon 2966251f0b0SNamjae Jeon const struct option_t on_errors_arr[] = { 2976251f0b0SNamjae Jeon { ON_ERRORS_PANIC, "panic" }, 2986251f0b0SNamjae Jeon { ON_ERRORS_REMOUNT_RO, "remount-ro", }, 2996251f0b0SNamjae Jeon { ON_ERRORS_CONTINUE, "continue", }, 3006251f0b0SNamjae Jeon { 0, NULL } 3016251f0b0SNamjae Jeon }; 3026251f0b0SNamjae Jeon 3036251f0b0SNamjae Jeon void ntfs_handle_error(struct super_block *sb) 3046251f0b0SNamjae Jeon { 3056251f0b0SNamjae Jeon struct ntfs_volume *vol = NTFS_SB(sb); 3066251f0b0SNamjae Jeon 3076251f0b0SNamjae Jeon if (sb_rdonly(sb)) 3086251f0b0SNamjae Jeon return; 3096251f0b0SNamjae Jeon 3106251f0b0SNamjae Jeon if (vol->on_errors == ON_ERRORS_REMOUNT_RO) { 3116251f0b0SNamjae Jeon sb->s_flags |= SB_RDONLY; 3126251f0b0SNamjae Jeon pr_crit("(device %s): Filesystem has been set read-only\n", 3136251f0b0SNamjae Jeon sb->s_id); 3146251f0b0SNamjae Jeon } else if (vol->on_errors == ON_ERRORS_PANIC) { 3156251f0b0SNamjae Jeon panic("ntfs: (device %s): panic from previous error\n", 3166251f0b0SNamjae Jeon sb->s_id); 3176251f0b0SNamjae Jeon } else if (vol->on_errors == ON_ERRORS_CONTINUE) { 3186251f0b0SNamjae Jeon if (errseq_check(&sb->s_wb_err, vol->wb_err) == -ENODEV) { 3196251f0b0SNamjae Jeon NVolSetShutdown(vol); 3206251f0b0SNamjae Jeon vol->wb_err = sb->s_wb_err; 3216251f0b0SNamjae Jeon } 3226251f0b0SNamjae Jeon } 3236251f0b0SNamjae Jeon } 3246251f0b0SNamjae Jeon 3256251f0b0SNamjae Jeon /* 3261e9ea7e0SNamjae Jeon * ntfs_write_volume_flags - write new flags to the volume information flags 3271e9ea7e0SNamjae Jeon * @vol: ntfs volume on which to modify the flags 3281e9ea7e0SNamjae Jeon * @flags: new flags value for the volume information flags 3291e9ea7e0SNamjae Jeon * 3301e9ea7e0SNamjae Jeon * Internal function. You probably want to use ntfs_{set,clear}_volume_flags() 3311e9ea7e0SNamjae Jeon * instead (see below). 3321e9ea7e0SNamjae Jeon * 3331e9ea7e0SNamjae Jeon * Replace the volume information flags on the volume @vol with the value 3341e9ea7e0SNamjae Jeon * supplied in @flags. Note, this overwrites the volume information flags, so 3351e9ea7e0SNamjae Jeon * make sure to combine the flags you want to modify with the old flags and use 3361e9ea7e0SNamjae Jeon * the result when calling ntfs_write_volume_flags(). 3371e9ea7e0SNamjae Jeon * 3381e9ea7e0SNamjae Jeon * Return 0 on success and -errno on error. 3391e9ea7e0SNamjae Jeon */ 3406251f0b0SNamjae Jeon static int ntfs_write_volume_flags(struct ntfs_volume *vol, const __le16 flags) 3411e9ea7e0SNamjae Jeon { 3426251f0b0SNamjae Jeon struct ntfs_inode *ni = NTFS_I(vol->vol_ino); 3436251f0b0SNamjae Jeon struct volume_information *vi; 3446251f0b0SNamjae Jeon struct ntfs_attr_search_ctx *ctx; 3451e9ea7e0SNamjae Jeon int err; 3461e9ea7e0SNamjae Jeon 3471e9ea7e0SNamjae Jeon ntfs_debug("Entering, old flags = 0x%x, new flags = 0x%x.", 3481e9ea7e0SNamjae Jeon le16_to_cpu(vol->vol_flags), le16_to_cpu(flags)); 3496251f0b0SNamjae Jeon mutex_lock(&ni->mrec_lock); 3501e9ea7e0SNamjae Jeon if (vol->vol_flags == flags) 3511e9ea7e0SNamjae Jeon goto done; 3526251f0b0SNamjae Jeon 3536251f0b0SNamjae Jeon ctx = ntfs_attr_get_search_ctx(ni, NULL); 3541e9ea7e0SNamjae Jeon if (!ctx) { 3551e9ea7e0SNamjae Jeon err = -ENOMEM; 3561e9ea7e0SNamjae Jeon goto put_unm_err_out; 3571e9ea7e0SNamjae Jeon } 3586251f0b0SNamjae Jeon 3591e9ea7e0SNamjae Jeon err = ntfs_attr_lookup(AT_VOLUME_INFORMATION, NULL, 0, 0, 0, NULL, 0, 3601e9ea7e0SNamjae Jeon ctx); 3611e9ea7e0SNamjae Jeon if (err) 3621e9ea7e0SNamjae Jeon goto put_unm_err_out; 3636251f0b0SNamjae Jeon 3646251f0b0SNamjae Jeon vi = (struct volume_information *)((u8 *)ctx->attr + 3651e9ea7e0SNamjae Jeon le16_to_cpu(ctx->attr->data.resident.value_offset)); 3661e9ea7e0SNamjae Jeon vol->vol_flags = vi->flags = flags; 3671e9ea7e0SNamjae Jeon mark_mft_record_dirty(ctx->ntfs_ino); 3681e9ea7e0SNamjae Jeon ntfs_attr_put_search_ctx(ctx); 3691e9ea7e0SNamjae Jeon done: 3706251f0b0SNamjae Jeon mutex_unlock(&ni->mrec_lock); 3711e9ea7e0SNamjae Jeon ntfs_debug("Done."); 3721e9ea7e0SNamjae Jeon return 0; 3731e9ea7e0SNamjae Jeon put_unm_err_out: 3741e9ea7e0SNamjae Jeon if (ctx) 3751e9ea7e0SNamjae Jeon ntfs_attr_put_search_ctx(ctx); 3766251f0b0SNamjae Jeon mutex_unlock(&ni->mrec_lock); 3771e9ea7e0SNamjae Jeon ntfs_error(vol->sb, "Failed with error code %i.", -err); 3781e9ea7e0SNamjae Jeon return err; 3791e9ea7e0SNamjae Jeon } 3801e9ea7e0SNamjae Jeon 3816251f0b0SNamjae Jeon /* 3821e9ea7e0SNamjae Jeon * ntfs_set_volume_flags - set bits in the volume information flags 3831e9ea7e0SNamjae Jeon * @vol: ntfs volume on which to modify the flags 3841e9ea7e0SNamjae Jeon * @flags: flags to set on the volume 3851e9ea7e0SNamjae Jeon * 3861e9ea7e0SNamjae Jeon * Set the bits in @flags in the volume information flags on the volume @vol. 3871e9ea7e0SNamjae Jeon * 3881e9ea7e0SNamjae Jeon * Return 0 on success and -errno on error. 3891e9ea7e0SNamjae Jeon */ 3906251f0b0SNamjae Jeon int ntfs_set_volume_flags(struct ntfs_volume *vol, __le16 flags) 3911e9ea7e0SNamjae Jeon { 3921e9ea7e0SNamjae Jeon flags &= VOLUME_FLAGS_MASK; 3931e9ea7e0SNamjae Jeon return ntfs_write_volume_flags(vol, vol->vol_flags | flags); 3941e9ea7e0SNamjae Jeon } 3951e9ea7e0SNamjae Jeon 3966251f0b0SNamjae Jeon /* 3971e9ea7e0SNamjae Jeon * ntfs_clear_volume_flags - clear bits in the volume information flags 3981e9ea7e0SNamjae Jeon * @vol: ntfs volume on which to modify the flags 3991e9ea7e0SNamjae Jeon * @flags: flags to clear on the volume 4001e9ea7e0SNamjae Jeon * 4011e9ea7e0SNamjae Jeon * Clear the bits in @flags in the volume information flags on the volume @vol. 4021e9ea7e0SNamjae Jeon * 4031e9ea7e0SNamjae Jeon * Return 0 on success and -errno on error. 4041e9ea7e0SNamjae Jeon */ 4056251f0b0SNamjae Jeon int ntfs_clear_volume_flags(struct ntfs_volume *vol, __le16 flags) 4061e9ea7e0SNamjae Jeon { 4071e9ea7e0SNamjae Jeon flags &= VOLUME_FLAGS_MASK; 4081e9ea7e0SNamjae Jeon flags = vol->vol_flags & cpu_to_le16(~le16_to_cpu(flags)); 4091e9ea7e0SNamjae Jeon return ntfs_write_volume_flags(vol, flags); 4101e9ea7e0SNamjae Jeon } 4111e9ea7e0SNamjae Jeon 4126251f0b0SNamjae Jeon int ntfs_write_volume_label(struct ntfs_volume *vol, char *label) 4131e9ea7e0SNamjae Jeon { 4146251f0b0SNamjae Jeon struct ntfs_inode *vol_ni = NTFS_I(vol->vol_ino); 4156251f0b0SNamjae Jeon struct ntfs_attr_search_ctx *ctx; 4166251f0b0SNamjae Jeon __le16 *uname; 4176251f0b0SNamjae Jeon int uname_len, ret; 4181e9ea7e0SNamjae Jeon 4196251f0b0SNamjae Jeon uname_len = ntfs_nlstoucs(vol, label, strlen(label), 4206251f0b0SNamjae Jeon &uname, FSLABEL_MAX); 4216251f0b0SNamjae Jeon if (uname_len < 0) { 4226251f0b0SNamjae Jeon ntfs_error(vol->sb, 4236251f0b0SNamjae Jeon "Failed to convert volume label '%s' to Unicode.", 4246251f0b0SNamjae Jeon label); 4256251f0b0SNamjae Jeon return uname_len; 4266251f0b0SNamjae Jeon } 4271e9ea7e0SNamjae Jeon 4286251f0b0SNamjae Jeon if (uname_len > NTFS_MAX_LABEL_LEN) { 4296251f0b0SNamjae Jeon ntfs_error(vol->sb, 4306251f0b0SNamjae Jeon "Volume label is too long (max %d characters).", 4316251f0b0SNamjae Jeon NTFS_MAX_LABEL_LEN); 4326251f0b0SNamjae Jeon kvfree(uname); 4331e9ea7e0SNamjae Jeon return -EINVAL; 4341e9ea7e0SNamjae Jeon } 4351e9ea7e0SNamjae Jeon 4366251f0b0SNamjae Jeon mutex_lock(&vol_ni->mrec_lock); 4376251f0b0SNamjae Jeon ctx = ntfs_attr_get_search_ctx(vol_ni, NULL); 4386251f0b0SNamjae Jeon if (!ctx) { 4396251f0b0SNamjae Jeon ret = -ENOMEM; 4406251f0b0SNamjae Jeon goto out; 4416251f0b0SNamjae Jeon } 4426251f0b0SNamjae Jeon 4436251f0b0SNamjae Jeon if (!ntfs_attr_lookup(AT_VOLUME_NAME, NULL, 0, 0, 0, NULL, 0, 4446251f0b0SNamjae Jeon ctx)) 4456251f0b0SNamjae Jeon ntfs_attr_record_rm(ctx); 4466251f0b0SNamjae Jeon ntfs_attr_put_search_ctx(ctx); 4476251f0b0SNamjae Jeon 4486251f0b0SNamjae Jeon ret = ntfs_resident_attr_record_add(vol_ni, AT_VOLUME_NAME, AT_UNNAMED, 0, 4496251f0b0SNamjae Jeon (u8 *)uname, uname_len * sizeof(__le16), 0); 4506251f0b0SNamjae Jeon out: 4516251f0b0SNamjae Jeon mutex_unlock(&vol_ni->mrec_lock); 4526251f0b0SNamjae Jeon kvfree(uname); 4536251f0b0SNamjae Jeon mark_inode_dirty_sync(vol->vol_ino); 4546251f0b0SNamjae Jeon 4556251f0b0SNamjae Jeon if (ret >= 0) { 4566251f0b0SNamjae Jeon kfree(vol->volume_label); 4576251f0b0SNamjae Jeon vol->volume_label = kstrdup(label, GFP_KERNEL); 4586251f0b0SNamjae Jeon ret = 0; 4596251f0b0SNamjae Jeon } 4606251f0b0SNamjae Jeon return ret; 4616251f0b0SNamjae Jeon } 4626251f0b0SNamjae Jeon 4636251f0b0SNamjae Jeon /* 4641e9ea7e0SNamjae Jeon * is_boot_sector_ntfs - check whether a boot sector is a valid NTFS boot sector 4651e9ea7e0SNamjae Jeon * @sb: Super block of the device to which @b belongs. 4661e9ea7e0SNamjae Jeon * @b: Boot sector of device @sb to check. 4671e9ea7e0SNamjae Jeon * @silent: If 'true', all output will be silenced. 4681e9ea7e0SNamjae Jeon * 4691e9ea7e0SNamjae Jeon * is_boot_sector_ntfs() checks whether the boot sector @b is a valid NTFS boot 4701e9ea7e0SNamjae Jeon * sector. Returns 'true' if it is valid and 'false' if not. 4711e9ea7e0SNamjae Jeon * 4721e9ea7e0SNamjae Jeon * @sb is only needed for warning/error output, i.e. it can be NULL when silent 4731e9ea7e0SNamjae Jeon * is 'true'. 4741e9ea7e0SNamjae Jeon */ 4751e9ea7e0SNamjae Jeon static bool is_boot_sector_ntfs(const struct super_block *sb, 4766251f0b0SNamjae Jeon const struct ntfs_boot_sector *b, const bool silent) 4771e9ea7e0SNamjae Jeon { 4781e9ea7e0SNamjae Jeon /* 4791e9ea7e0SNamjae Jeon * Check that checksum == sum of u32 values from b to the checksum 4801e9ea7e0SNamjae Jeon * field. If checksum is zero, no checking is done. We will work when 4811e9ea7e0SNamjae Jeon * the checksum test fails, since some utilities update the boot sector 4821e9ea7e0SNamjae Jeon * ignoring the checksum which leaves the checksum out-of-date. We 4831e9ea7e0SNamjae Jeon * report a warning if this is the case. 4841e9ea7e0SNamjae Jeon */ 4851e9ea7e0SNamjae Jeon if ((void *)b < (void *)&b->checksum && b->checksum && !silent) { 4866251f0b0SNamjae Jeon __le32 *u; 4871e9ea7e0SNamjae Jeon u32 i; 4881e9ea7e0SNamjae Jeon 4896251f0b0SNamjae Jeon for (i = 0, u = (__le32 *)b; u < (__le32 *)(&b->checksum); ++u) 4901e9ea7e0SNamjae Jeon i += le32_to_cpup(u); 4911e9ea7e0SNamjae Jeon if (le32_to_cpu(b->checksum) != i) 4921e9ea7e0SNamjae Jeon ntfs_warning(sb, "Invalid boot sector checksum."); 4931e9ea7e0SNamjae Jeon } 4941e9ea7e0SNamjae Jeon /* Check OEMidentifier is "NTFS " */ 4951e9ea7e0SNamjae Jeon if (b->oem_id != magicNTFS) 4961e9ea7e0SNamjae Jeon goto not_ntfs; 4971e9ea7e0SNamjae Jeon /* Check bytes per sector value is between 256 and 4096. */ 4981e9ea7e0SNamjae Jeon if (le16_to_cpu(b->bpb.bytes_per_sector) < 0x100 || 4991e9ea7e0SNamjae Jeon le16_to_cpu(b->bpb.bytes_per_sector) > 0x1000) 5001e9ea7e0SNamjae Jeon goto not_ntfs; 5016251f0b0SNamjae Jeon /* 5026251f0b0SNamjae Jeon * Check sectors per cluster value is valid and the cluster size 5036251f0b0SNamjae Jeon * is not above the maximum (2MB). 5046251f0b0SNamjae Jeon */ 5056251f0b0SNamjae Jeon if (b->bpb.sectors_per_cluster > 0x80 && 5066251f0b0SNamjae Jeon b->bpb.sectors_per_cluster < 0xf4) 5071e9ea7e0SNamjae Jeon goto not_ntfs; 5086251f0b0SNamjae Jeon 5091e9ea7e0SNamjae Jeon /* Check reserved/unused fields are really zero. */ 5101e9ea7e0SNamjae Jeon if (le16_to_cpu(b->bpb.reserved_sectors) || 5111e9ea7e0SNamjae Jeon le16_to_cpu(b->bpb.root_entries) || 5121e9ea7e0SNamjae Jeon le16_to_cpu(b->bpb.sectors) || 5131e9ea7e0SNamjae Jeon le16_to_cpu(b->bpb.sectors_per_fat) || 5141e9ea7e0SNamjae Jeon le32_to_cpu(b->bpb.large_sectors) || b->bpb.fats) 5151e9ea7e0SNamjae Jeon goto not_ntfs; 5161e9ea7e0SNamjae Jeon /* Check clusters per file mft record value is valid. */ 5171e9ea7e0SNamjae Jeon if ((u8)b->clusters_per_mft_record < 0xe1 || 5181e9ea7e0SNamjae Jeon (u8)b->clusters_per_mft_record > 0xf7) 5191e9ea7e0SNamjae Jeon switch (b->clusters_per_mft_record) { 5201e9ea7e0SNamjae Jeon case 1: case 2: case 4: case 8: case 16: case 32: case 64: 5211e9ea7e0SNamjae Jeon break; 5221e9ea7e0SNamjae Jeon default: 5231e9ea7e0SNamjae Jeon goto not_ntfs; 5241e9ea7e0SNamjae Jeon } 5251e9ea7e0SNamjae Jeon /* Check clusters per index block value is valid. */ 5261e9ea7e0SNamjae Jeon if ((u8)b->clusters_per_index_record < 0xe1 || 5271e9ea7e0SNamjae Jeon (u8)b->clusters_per_index_record > 0xf7) 5281e9ea7e0SNamjae Jeon switch (b->clusters_per_index_record) { 5291e9ea7e0SNamjae Jeon case 1: case 2: case 4: case 8: case 16: case 32: case 64: 5301e9ea7e0SNamjae Jeon break; 5311e9ea7e0SNamjae Jeon default: 5321e9ea7e0SNamjae Jeon goto not_ntfs; 5331e9ea7e0SNamjae Jeon } 5341e9ea7e0SNamjae Jeon /* 5351e9ea7e0SNamjae Jeon * Check for valid end of sector marker. We will work without it, but 5361e9ea7e0SNamjae Jeon * many BIOSes will refuse to boot from a bootsector if the magic is 5371e9ea7e0SNamjae Jeon * incorrect, so we emit a warning. 5381e9ea7e0SNamjae Jeon */ 5391e9ea7e0SNamjae Jeon if (!silent && b->end_of_sector_marker != cpu_to_le16(0xaa55)) 5401e9ea7e0SNamjae Jeon ntfs_warning(sb, "Invalid end of sector marker."); 5411e9ea7e0SNamjae Jeon return true; 5421e9ea7e0SNamjae Jeon not_ntfs: 5431e9ea7e0SNamjae Jeon return false; 5441e9ea7e0SNamjae Jeon } 5451e9ea7e0SNamjae Jeon 5466251f0b0SNamjae Jeon /* 5471e9ea7e0SNamjae Jeon * read_ntfs_boot_sector - read the NTFS boot sector of a device 5481e9ea7e0SNamjae Jeon * @sb: super block of device to read the boot sector from 5491e9ea7e0SNamjae Jeon * @silent: if true, suppress all output 5501e9ea7e0SNamjae Jeon * 5516251f0b0SNamjae Jeon * Reads the boot sector from the device and validates it. 5521e9ea7e0SNamjae Jeon */ 5536251f0b0SNamjae Jeon static char *read_ntfs_boot_sector(struct super_block *sb, 5541e9ea7e0SNamjae Jeon const int silent) 5551e9ea7e0SNamjae Jeon { 5566251f0b0SNamjae Jeon char *boot_sector; 5571e9ea7e0SNamjae Jeon 5586251f0b0SNamjae Jeon boot_sector = kzalloc(PAGE_SIZE, GFP_NOFS); 5596251f0b0SNamjae Jeon if (!boot_sector) 5606251f0b0SNamjae Jeon return NULL; 5616251f0b0SNamjae Jeon 5626251f0b0SNamjae Jeon if (ntfs_bdev_read(sb->s_bdev, boot_sector, 0, PAGE_SIZE)) { 5636251f0b0SNamjae Jeon if (!silent) 5646251f0b0SNamjae Jeon ntfs_error(sb, "Unable to read primary boot sector."); 5656251f0b0SNamjae Jeon kfree(boot_sector); 5666251f0b0SNamjae Jeon return NULL; 5676251f0b0SNamjae Jeon } 5686251f0b0SNamjae Jeon 5696251f0b0SNamjae Jeon if (!is_boot_sector_ntfs(sb, (struct ntfs_boot_sector *)boot_sector, 5706251f0b0SNamjae Jeon silent)) { 5711e9ea7e0SNamjae Jeon if (!silent) 5721e9ea7e0SNamjae Jeon ntfs_error(sb, "Primary boot sector is invalid."); 5736251f0b0SNamjae Jeon kfree(boot_sector); 5741e9ea7e0SNamjae Jeon return NULL; 5751e9ea7e0SNamjae Jeon } 5761e9ea7e0SNamjae Jeon 5776251f0b0SNamjae Jeon return boot_sector; 5786251f0b0SNamjae Jeon } 5796251f0b0SNamjae Jeon 5806251f0b0SNamjae Jeon /* 5811e9ea7e0SNamjae Jeon * parse_ntfs_boot_sector - parse the boot sector and store the data in @vol 5821e9ea7e0SNamjae Jeon * @vol: volume structure to initialise with data from boot sector 5831e9ea7e0SNamjae Jeon * @b: boot sector to parse 5841e9ea7e0SNamjae Jeon * 5851e9ea7e0SNamjae Jeon * Parse the ntfs boot sector @b and store all imporant information therein in 5861e9ea7e0SNamjae Jeon * the ntfs super block @vol. Return 'true' on success and 'false' on error. 5871e9ea7e0SNamjae Jeon */ 5886251f0b0SNamjae Jeon static bool parse_ntfs_boot_sector(struct ntfs_volume *vol, 5896251f0b0SNamjae Jeon const struct ntfs_boot_sector *b) 5901e9ea7e0SNamjae Jeon { 5916251f0b0SNamjae Jeon unsigned int sectors_per_cluster, sectors_per_cluster_bits, nr_hidden_sects; 5921e9ea7e0SNamjae Jeon int clusters_per_mft_record, clusters_per_index_record; 5931e9ea7e0SNamjae Jeon s64 ll; 5941e9ea7e0SNamjae Jeon 5951e9ea7e0SNamjae Jeon vol->sector_size = le16_to_cpu(b->bpb.bytes_per_sector); 5961e9ea7e0SNamjae Jeon vol->sector_size_bits = ffs(vol->sector_size) - 1; 5971e9ea7e0SNamjae Jeon ntfs_debug("vol->sector_size = %i (0x%x)", vol->sector_size, 5981e9ea7e0SNamjae Jeon vol->sector_size); 5991e9ea7e0SNamjae Jeon ntfs_debug("vol->sector_size_bits = %i (0x%x)", vol->sector_size_bits, 6001e9ea7e0SNamjae Jeon vol->sector_size_bits); 6011e9ea7e0SNamjae Jeon if (vol->sector_size < vol->sb->s_blocksize) { 6026251f0b0SNamjae Jeon ntfs_error(vol->sb, 6036251f0b0SNamjae Jeon "Sector size (%i) is smaller than the device block size (%lu). This is not supported.", 6046251f0b0SNamjae Jeon vol->sector_size, vol->sb->s_blocksize); 6051e9ea7e0SNamjae Jeon return false; 6061e9ea7e0SNamjae Jeon } 6076251f0b0SNamjae Jeon 6086251f0b0SNamjae Jeon if (b->bpb.sectors_per_cluster >= 0xf4) 6096251f0b0SNamjae Jeon sectors_per_cluster = 1U << -(s8)b->bpb.sectors_per_cluster; 6106251f0b0SNamjae Jeon else 6116251f0b0SNamjae Jeon sectors_per_cluster = b->bpb.sectors_per_cluster; 6121e9ea7e0SNamjae Jeon ntfs_debug("sectors_per_cluster = 0x%x", b->bpb.sectors_per_cluster); 6136251f0b0SNamjae Jeon sectors_per_cluster_bits = ffs(sectors_per_cluster) - 1; 6141e9ea7e0SNamjae Jeon ntfs_debug("sectors_per_cluster_bits = 0x%x", 6151e9ea7e0SNamjae Jeon sectors_per_cluster_bits); 6161e9ea7e0SNamjae Jeon nr_hidden_sects = le32_to_cpu(b->bpb.hidden_sectors); 6171e9ea7e0SNamjae Jeon ntfs_debug("number of hidden sectors = 0x%x", nr_hidden_sects); 6181e9ea7e0SNamjae Jeon vol->cluster_size = vol->sector_size << sectors_per_cluster_bits; 6191e9ea7e0SNamjae Jeon vol->cluster_size_mask = vol->cluster_size - 1; 6201e9ea7e0SNamjae Jeon vol->cluster_size_bits = ffs(vol->cluster_size) - 1; 6211e9ea7e0SNamjae Jeon ntfs_debug("vol->cluster_size = %i (0x%x)", vol->cluster_size, 6221e9ea7e0SNamjae Jeon vol->cluster_size); 6231e9ea7e0SNamjae Jeon ntfs_debug("vol->cluster_size_mask = 0x%x", vol->cluster_size_mask); 6241e9ea7e0SNamjae Jeon ntfs_debug("vol->cluster_size_bits = %i", vol->cluster_size_bits); 6251e9ea7e0SNamjae Jeon if (vol->cluster_size < vol->sector_size) { 6266251f0b0SNamjae Jeon ntfs_error(vol->sb, 6276251f0b0SNamjae Jeon "Cluster size (%i) is smaller than the sector size (%i). This is not supported.", 6286251f0b0SNamjae Jeon vol->cluster_size, vol->sector_size); 6291e9ea7e0SNamjae Jeon return false; 6301e9ea7e0SNamjae Jeon } 6311e9ea7e0SNamjae Jeon clusters_per_mft_record = b->clusters_per_mft_record; 6321e9ea7e0SNamjae Jeon ntfs_debug("clusters_per_mft_record = %i (0x%x)", 6331e9ea7e0SNamjae Jeon clusters_per_mft_record, clusters_per_mft_record); 6341e9ea7e0SNamjae Jeon if (clusters_per_mft_record > 0) 6351e9ea7e0SNamjae Jeon vol->mft_record_size = vol->cluster_size << 6361e9ea7e0SNamjae Jeon (ffs(clusters_per_mft_record) - 1); 6371e9ea7e0SNamjae Jeon else 6381e9ea7e0SNamjae Jeon /* 6391e9ea7e0SNamjae Jeon * When mft_record_size < cluster_size, clusters_per_mft_record 6401e9ea7e0SNamjae Jeon * = -log2(mft_record_size) bytes. mft_record_size normaly is 6411e9ea7e0SNamjae Jeon * 1024 bytes, which is encoded as 0xF6 (-10 in decimal). 6421e9ea7e0SNamjae Jeon */ 6431e9ea7e0SNamjae Jeon vol->mft_record_size = 1 << -clusters_per_mft_record; 6441e9ea7e0SNamjae Jeon vol->mft_record_size_mask = vol->mft_record_size - 1; 6451e9ea7e0SNamjae Jeon vol->mft_record_size_bits = ffs(vol->mft_record_size) - 1; 6461e9ea7e0SNamjae Jeon ntfs_debug("vol->mft_record_size = %i (0x%x)", vol->mft_record_size, 6471e9ea7e0SNamjae Jeon vol->mft_record_size); 6481e9ea7e0SNamjae Jeon ntfs_debug("vol->mft_record_size_mask = 0x%x", 6491e9ea7e0SNamjae Jeon vol->mft_record_size_mask); 6501e9ea7e0SNamjae Jeon ntfs_debug("vol->mft_record_size_bits = %i (0x%x)", 6511e9ea7e0SNamjae Jeon vol->mft_record_size_bits, vol->mft_record_size_bits); 6521e9ea7e0SNamjae Jeon /* 6531e9ea7e0SNamjae Jeon * We cannot support mft record sizes above the PAGE_SIZE since 6541e9ea7e0SNamjae Jeon * we store $MFT/$DATA, the table of mft records in the page cache. 6551e9ea7e0SNamjae Jeon */ 6561e9ea7e0SNamjae Jeon if (vol->mft_record_size > PAGE_SIZE) { 6576251f0b0SNamjae Jeon ntfs_error(vol->sb, 6586251f0b0SNamjae Jeon "Mft record size (%i) exceeds the PAGE_SIZE on your system (%lu). This is not supported.", 6591e9ea7e0SNamjae Jeon vol->mft_record_size, PAGE_SIZE); 6601e9ea7e0SNamjae Jeon return false; 6611e9ea7e0SNamjae Jeon } 6621e9ea7e0SNamjae Jeon /* We cannot support mft record sizes below the sector size. */ 6631e9ea7e0SNamjae Jeon if (vol->mft_record_size < vol->sector_size) { 6646251f0b0SNamjae Jeon ntfs_warning(vol->sb, "Mft record size (%i) is smaller than the sector size (%i).", 6656251f0b0SNamjae Jeon vol->mft_record_size, vol->sector_size); 6661e9ea7e0SNamjae Jeon } 6671e9ea7e0SNamjae Jeon clusters_per_index_record = b->clusters_per_index_record; 6681e9ea7e0SNamjae Jeon ntfs_debug("clusters_per_index_record = %i (0x%x)", 6691e9ea7e0SNamjae Jeon clusters_per_index_record, clusters_per_index_record); 6701e9ea7e0SNamjae Jeon if (clusters_per_index_record > 0) 6711e9ea7e0SNamjae Jeon vol->index_record_size = vol->cluster_size << 6721e9ea7e0SNamjae Jeon (ffs(clusters_per_index_record) - 1); 6731e9ea7e0SNamjae Jeon else 6741e9ea7e0SNamjae Jeon /* 6751e9ea7e0SNamjae Jeon * When index_record_size < cluster_size, 6761e9ea7e0SNamjae Jeon * clusters_per_index_record = -log2(index_record_size) bytes. 6771e9ea7e0SNamjae Jeon * index_record_size normaly equals 4096 bytes, which is 6781e9ea7e0SNamjae Jeon * encoded as 0xF4 (-12 in decimal). 6791e9ea7e0SNamjae Jeon */ 6801e9ea7e0SNamjae Jeon vol->index_record_size = 1 << -clusters_per_index_record; 6811e9ea7e0SNamjae Jeon vol->index_record_size_mask = vol->index_record_size - 1; 6821e9ea7e0SNamjae Jeon vol->index_record_size_bits = ffs(vol->index_record_size) - 1; 6831e9ea7e0SNamjae Jeon ntfs_debug("vol->index_record_size = %i (0x%x)", 6841e9ea7e0SNamjae Jeon vol->index_record_size, vol->index_record_size); 6851e9ea7e0SNamjae Jeon ntfs_debug("vol->index_record_size_mask = 0x%x", 6861e9ea7e0SNamjae Jeon vol->index_record_size_mask); 6871e9ea7e0SNamjae Jeon ntfs_debug("vol->index_record_size_bits = %i (0x%x)", 6881e9ea7e0SNamjae Jeon vol->index_record_size_bits, 6891e9ea7e0SNamjae Jeon vol->index_record_size_bits); 6901e9ea7e0SNamjae Jeon /* We cannot support index record sizes below the sector size. */ 6911e9ea7e0SNamjae Jeon if (vol->index_record_size < vol->sector_size) { 6926251f0b0SNamjae Jeon ntfs_error(vol->sb, 6936251f0b0SNamjae Jeon "Index record size (%i) is smaller than the sector size (%i). This is not supported.", 6946251f0b0SNamjae Jeon vol->index_record_size, vol->sector_size); 6951e9ea7e0SNamjae Jeon return false; 6961e9ea7e0SNamjae Jeon } 6971e9ea7e0SNamjae Jeon /* 6981e9ea7e0SNamjae Jeon * Get the size of the volume in clusters and check for 64-bit-ness. 6991e9ea7e0SNamjae Jeon * Windows currently only uses 32 bits to save the clusters so we do 7001e9ea7e0SNamjae Jeon * the same as it is much faster on 32-bit CPUs. 7011e9ea7e0SNamjae Jeon */ 7026251f0b0SNamjae Jeon ll = le64_to_cpu(b->number_of_sectors) >> sectors_per_cluster_bits; 7031e9ea7e0SNamjae Jeon if ((u64)ll >= 1ULL << 32) { 7046251f0b0SNamjae Jeon ntfs_error(vol->sb, "Cannot handle 64-bit clusters."); 7051e9ea7e0SNamjae Jeon return false; 7061e9ea7e0SNamjae Jeon } 7071e9ea7e0SNamjae Jeon vol->nr_clusters = ll; 7086251f0b0SNamjae Jeon ntfs_debug("vol->nr_clusters = 0x%llx", vol->nr_clusters); 7096251f0b0SNamjae Jeon ll = le64_to_cpu(b->mft_lcn); 7101e9ea7e0SNamjae Jeon if (ll >= vol->nr_clusters) { 7116251f0b0SNamjae Jeon ntfs_error(vol->sb, "MFT LCN (%lli, 0x%llx) is beyond end of volume. Weird.", 7126251f0b0SNamjae Jeon ll, ll); 7131e9ea7e0SNamjae Jeon return false; 7141e9ea7e0SNamjae Jeon } 7151e9ea7e0SNamjae Jeon vol->mft_lcn = ll; 7166251f0b0SNamjae Jeon ntfs_debug("vol->mft_lcn = 0x%llx", vol->mft_lcn); 7176251f0b0SNamjae Jeon ll = le64_to_cpu(b->mftmirr_lcn); 7181e9ea7e0SNamjae Jeon if (ll >= vol->nr_clusters) { 7196251f0b0SNamjae Jeon ntfs_error(vol->sb, "MFTMirr LCN (%lli, 0x%llx) is beyond end of volume. Weird.", 7206251f0b0SNamjae Jeon ll, ll); 7211e9ea7e0SNamjae Jeon return false; 7221e9ea7e0SNamjae Jeon } 7231e9ea7e0SNamjae Jeon vol->mftmirr_lcn = ll; 7246251f0b0SNamjae Jeon ntfs_debug("vol->mftmirr_lcn = 0x%llx", vol->mftmirr_lcn); 7251e9ea7e0SNamjae Jeon /* 7261e9ea7e0SNamjae Jeon * Work out the size of the mft mirror in number of mft records. If the 7271e9ea7e0SNamjae Jeon * cluster size is less than or equal to the size taken by four mft 7281e9ea7e0SNamjae Jeon * records, the mft mirror stores the first four mft records. If the 7291e9ea7e0SNamjae Jeon * cluster size is bigger than the size taken by four mft records, the 7301e9ea7e0SNamjae Jeon * mft mirror contains as many mft records as will fit into one 7311e9ea7e0SNamjae Jeon * cluster. 7321e9ea7e0SNamjae Jeon */ 7331e9ea7e0SNamjae Jeon if (vol->cluster_size <= (4 << vol->mft_record_size_bits)) 7341e9ea7e0SNamjae Jeon vol->mftmirr_size = 4; 7351e9ea7e0SNamjae Jeon else 7361e9ea7e0SNamjae Jeon vol->mftmirr_size = vol->cluster_size >> 7371e9ea7e0SNamjae Jeon vol->mft_record_size_bits; 7381e9ea7e0SNamjae Jeon ntfs_debug("vol->mftmirr_size = %i", vol->mftmirr_size); 7391e9ea7e0SNamjae Jeon vol->serial_no = le64_to_cpu(b->volume_serial_number); 7406251f0b0SNamjae Jeon ntfs_debug("vol->serial_no = 0x%llx", vol->serial_no); 7416251f0b0SNamjae Jeon 7426251f0b0SNamjae Jeon vol->sparse_compression_unit = 4; 7436251f0b0SNamjae Jeon if (vol->cluster_size > 4096) { 7446251f0b0SNamjae Jeon switch (vol->cluster_size) { 7456251f0b0SNamjae Jeon case 65536: 7466251f0b0SNamjae Jeon vol->sparse_compression_unit = 0; 7476251f0b0SNamjae Jeon break; 7486251f0b0SNamjae Jeon case 32768: 7496251f0b0SNamjae Jeon vol->sparse_compression_unit = 1; 7506251f0b0SNamjae Jeon break; 7516251f0b0SNamjae Jeon case 16384: 7526251f0b0SNamjae Jeon vol->sparse_compression_unit = 2; 7536251f0b0SNamjae Jeon break; 7546251f0b0SNamjae Jeon case 8192: 7556251f0b0SNamjae Jeon vol->sparse_compression_unit = 3; 7566251f0b0SNamjae Jeon break; 7576251f0b0SNamjae Jeon } 7586251f0b0SNamjae Jeon } 7596251f0b0SNamjae Jeon 7601e9ea7e0SNamjae Jeon return true; 7611e9ea7e0SNamjae Jeon } 7621e9ea7e0SNamjae Jeon 7636251f0b0SNamjae Jeon /* 7641e9ea7e0SNamjae Jeon * ntfs_setup_allocators - initialize the cluster and mft allocators 7651e9ea7e0SNamjae Jeon * @vol: volume structure for which to setup the allocators 7661e9ea7e0SNamjae Jeon * 7671e9ea7e0SNamjae Jeon * Setup the cluster (lcn) and mft allocators to the starting values. 7681e9ea7e0SNamjae Jeon */ 7696251f0b0SNamjae Jeon static void ntfs_setup_allocators(struct ntfs_volume *vol) 7701e9ea7e0SNamjae Jeon { 7716251f0b0SNamjae Jeon s64 mft_zone_size, mft_lcn; 7721e9ea7e0SNamjae Jeon 7731e9ea7e0SNamjae Jeon ntfs_debug("vol->mft_zone_multiplier = 0x%x", 7741e9ea7e0SNamjae Jeon vol->mft_zone_multiplier); 7751e9ea7e0SNamjae Jeon /* Determine the size of the MFT zone. */ 7761e9ea7e0SNamjae Jeon mft_zone_size = vol->nr_clusters; 7771e9ea7e0SNamjae Jeon switch (vol->mft_zone_multiplier) { /* % of volume size in clusters */ 7781e9ea7e0SNamjae Jeon case 4: 7791e9ea7e0SNamjae Jeon mft_zone_size >>= 1; /* 50% */ 7801e9ea7e0SNamjae Jeon break; 7811e9ea7e0SNamjae Jeon case 3: 7821e9ea7e0SNamjae Jeon mft_zone_size = (mft_zone_size + 7831e9ea7e0SNamjae Jeon (mft_zone_size >> 1)) >> 2; /* 37.5% */ 7841e9ea7e0SNamjae Jeon break; 7851e9ea7e0SNamjae Jeon case 2: 7861e9ea7e0SNamjae Jeon mft_zone_size >>= 2; /* 25% */ 7871e9ea7e0SNamjae Jeon break; 7881e9ea7e0SNamjae Jeon /* case 1: */ 7891e9ea7e0SNamjae Jeon default: 7901e9ea7e0SNamjae Jeon mft_zone_size >>= 3; /* 12.5% */ 7911e9ea7e0SNamjae Jeon break; 7921e9ea7e0SNamjae Jeon } 7931e9ea7e0SNamjae Jeon /* Setup the mft zone. */ 7941e9ea7e0SNamjae Jeon vol->mft_zone_start = vol->mft_zone_pos = vol->mft_lcn; 7956251f0b0SNamjae Jeon ntfs_debug("vol->mft_zone_pos = 0x%llx", vol->mft_zone_pos); 7961e9ea7e0SNamjae Jeon /* 7971e9ea7e0SNamjae Jeon * Calculate the mft_lcn for an unmodified NTFS volume (see mkntfs 7981e9ea7e0SNamjae Jeon * source) and if the actual mft_lcn is in the expected place or even 7991e9ea7e0SNamjae Jeon * further to the front of the volume, extend the mft_zone to cover the 8001e9ea7e0SNamjae Jeon * beginning of the volume as well. This is in order to protect the 8011e9ea7e0SNamjae Jeon * area reserved for the mft bitmap as well within the mft_zone itself. 8021e9ea7e0SNamjae Jeon * On non-standard volumes we do not protect it as the overhead would 8031e9ea7e0SNamjae Jeon * be higher than the speed increase we would get by doing it. 8041e9ea7e0SNamjae Jeon */ 8056251f0b0SNamjae Jeon mft_lcn = NTFS_B_TO_CLU(vol, 8192 + 2 * vol->cluster_size - 1); 8061e9ea7e0SNamjae Jeon if (mft_lcn * vol->cluster_size < 16 * 1024) 8076251f0b0SNamjae Jeon mft_lcn = (16 * 1024 + vol->cluster_size - 1) >> 8086251f0b0SNamjae Jeon vol->cluster_size_bits; 8091e9ea7e0SNamjae Jeon if (vol->mft_zone_start <= mft_lcn) 8101e9ea7e0SNamjae Jeon vol->mft_zone_start = 0; 8116251f0b0SNamjae Jeon ntfs_debug("vol->mft_zone_start = 0x%llx", vol->mft_zone_start); 8121e9ea7e0SNamjae Jeon /* 8131e9ea7e0SNamjae Jeon * Need to cap the mft zone on non-standard volumes so that it does 8141e9ea7e0SNamjae Jeon * not point outside the boundaries of the volume. We do this by 8151e9ea7e0SNamjae Jeon * halving the zone size until we are inside the volume. 8161e9ea7e0SNamjae Jeon */ 8171e9ea7e0SNamjae Jeon vol->mft_zone_end = vol->mft_lcn + mft_zone_size; 8181e9ea7e0SNamjae Jeon while (vol->mft_zone_end >= vol->nr_clusters) { 8191e9ea7e0SNamjae Jeon mft_zone_size >>= 1; 8201e9ea7e0SNamjae Jeon vol->mft_zone_end = vol->mft_lcn + mft_zone_size; 8211e9ea7e0SNamjae Jeon } 8226251f0b0SNamjae Jeon ntfs_debug("vol->mft_zone_end = 0x%llx", vol->mft_zone_end); 8231e9ea7e0SNamjae Jeon /* 8241e9ea7e0SNamjae Jeon * Set the current position within each data zone to the start of the 8251e9ea7e0SNamjae Jeon * respective zone. 8261e9ea7e0SNamjae Jeon */ 8271e9ea7e0SNamjae Jeon vol->data1_zone_pos = vol->mft_zone_end; 8286251f0b0SNamjae Jeon ntfs_debug("vol->data1_zone_pos = 0x%llx", vol->data1_zone_pos); 8291e9ea7e0SNamjae Jeon vol->data2_zone_pos = 0; 8306251f0b0SNamjae Jeon ntfs_debug("vol->data2_zone_pos = 0x%llx", vol->data2_zone_pos); 8311e9ea7e0SNamjae Jeon 8321e9ea7e0SNamjae Jeon /* Set the mft data allocation position to mft record 24. */ 8331e9ea7e0SNamjae Jeon vol->mft_data_pos = 24; 8346251f0b0SNamjae Jeon ntfs_debug("vol->mft_data_pos = 0x%llx", vol->mft_data_pos); 8351e9ea7e0SNamjae Jeon } 8361e9ea7e0SNamjae Jeon 8376251f0b0SNamjae Jeon static struct lock_class_key mftmirr_runlist_lock_key, 8386251f0b0SNamjae Jeon mftmirr_mrec_lock_key; 8396251f0b0SNamjae Jeon /* 8401e9ea7e0SNamjae Jeon * load_and_init_mft_mirror - load and setup the mft mirror inode for a volume 8411e9ea7e0SNamjae Jeon * @vol: ntfs super block describing device whose mft mirror to load 8421e9ea7e0SNamjae Jeon * 8431e9ea7e0SNamjae Jeon * Return 'true' on success or 'false' on error. 8441e9ea7e0SNamjae Jeon */ 8456251f0b0SNamjae Jeon static bool load_and_init_mft_mirror(struct ntfs_volume *vol) 8461e9ea7e0SNamjae Jeon { 8471e9ea7e0SNamjae Jeon struct inode *tmp_ino; 8486251f0b0SNamjae Jeon struct ntfs_inode *tmp_ni; 8491e9ea7e0SNamjae Jeon 8501e9ea7e0SNamjae Jeon ntfs_debug("Entering."); 8511e9ea7e0SNamjae Jeon /* Get mft mirror inode. */ 8521e9ea7e0SNamjae Jeon tmp_ino = ntfs_iget(vol->sb, FILE_MFTMirr); 8536251f0b0SNamjae Jeon if (IS_ERR(tmp_ino)) { 8541e9ea7e0SNamjae Jeon if (!IS_ERR(tmp_ino)) 8551e9ea7e0SNamjae Jeon iput(tmp_ino); 8561e9ea7e0SNamjae Jeon /* Caller will display error message. */ 8571e9ea7e0SNamjae Jeon return false; 8581e9ea7e0SNamjae Jeon } 8596251f0b0SNamjae Jeon lockdep_set_class(&NTFS_I(tmp_ino)->runlist.lock, 8606251f0b0SNamjae Jeon &mftmirr_runlist_lock_key); 8616251f0b0SNamjae Jeon lockdep_set_class(&NTFS_I(tmp_ino)->mrec_lock, 8626251f0b0SNamjae Jeon &mftmirr_mrec_lock_key); 8631e9ea7e0SNamjae Jeon /* 8641e9ea7e0SNamjae Jeon * Re-initialize some specifics about $MFTMirr's inode as 8651e9ea7e0SNamjae Jeon * ntfs_read_inode() will have set up the default ones. 8661e9ea7e0SNamjae Jeon */ 8671e9ea7e0SNamjae Jeon /* Set uid and gid to root. */ 8681e9ea7e0SNamjae Jeon tmp_ino->i_uid = GLOBAL_ROOT_UID; 8691e9ea7e0SNamjae Jeon tmp_ino->i_gid = GLOBAL_ROOT_GID; 8701e9ea7e0SNamjae Jeon /* Regular file. No access for anyone. */ 8711e9ea7e0SNamjae Jeon tmp_ino->i_mode = S_IFREG; 8721e9ea7e0SNamjae Jeon /* No VFS initiated operations allowed for $MFTMirr. */ 8731e9ea7e0SNamjae Jeon tmp_ino->i_op = &ntfs_empty_inode_ops; 8741e9ea7e0SNamjae Jeon tmp_ino->i_fop = &ntfs_empty_file_ops; 8751e9ea7e0SNamjae Jeon /* Put in our special address space operations. */ 8766251f0b0SNamjae Jeon tmp_ino->i_mapping->a_ops = &ntfs_aops; 8771e9ea7e0SNamjae Jeon tmp_ni = NTFS_I(tmp_ino); 8781e9ea7e0SNamjae Jeon /* The $MFTMirr, like the $MFT is multi sector transfer protected. */ 8791e9ea7e0SNamjae Jeon NInoSetMstProtected(tmp_ni); 8801e9ea7e0SNamjae Jeon NInoSetSparseDisabled(tmp_ni); 8811e9ea7e0SNamjae Jeon /* 8821e9ea7e0SNamjae Jeon * Set up our little cheat allowing us to reuse the async read io 8831e9ea7e0SNamjae Jeon * completion handler for directories. 8841e9ea7e0SNamjae Jeon */ 8851e9ea7e0SNamjae Jeon tmp_ni->itype.index.block_size = vol->mft_record_size; 8861e9ea7e0SNamjae Jeon tmp_ni->itype.index.block_size_bits = vol->mft_record_size_bits; 8871e9ea7e0SNamjae Jeon vol->mftmirr_ino = tmp_ino; 8881e9ea7e0SNamjae Jeon ntfs_debug("Done."); 8891e9ea7e0SNamjae Jeon return true; 8901e9ea7e0SNamjae Jeon } 8911e9ea7e0SNamjae Jeon 8926251f0b0SNamjae Jeon /* 8931e9ea7e0SNamjae Jeon * check_mft_mirror - compare contents of the mft mirror with the mft 8941e9ea7e0SNamjae Jeon * @vol: ntfs super block describing device whose mft mirror to check 8951e9ea7e0SNamjae Jeon * 8961e9ea7e0SNamjae Jeon * Return 'true' on success or 'false' on error. 8971e9ea7e0SNamjae Jeon * 8981e9ea7e0SNamjae Jeon * Note, this function also results in the mft mirror runlist being completely 8991e9ea7e0SNamjae Jeon * mapped into memory. The mft mirror write code requires this and will BUG() 9001e9ea7e0SNamjae Jeon * should it find an unmapped runlist element. 9011e9ea7e0SNamjae Jeon */ 9026251f0b0SNamjae Jeon static bool check_mft_mirror(struct ntfs_volume *vol) 9031e9ea7e0SNamjae Jeon { 9041e9ea7e0SNamjae Jeon struct super_block *sb = vol->sb; 9056251f0b0SNamjae Jeon struct ntfs_inode *mirr_ni; 9066251f0b0SNamjae Jeon struct folio *mft_folio = NULL, *mirr_folio = NULL; 9076251f0b0SNamjae Jeon u8 *kmft = NULL, *kmirr = NULL; 9086251f0b0SNamjae Jeon struct runlist_element *rl, rl2[2]; 9091e9ea7e0SNamjae Jeon pgoff_t index; 9101e9ea7e0SNamjae Jeon int mrecs_per_page, i; 9111e9ea7e0SNamjae Jeon 9121e9ea7e0SNamjae Jeon ntfs_debug("Entering."); 9131e9ea7e0SNamjae Jeon /* Compare contents of $MFT and $MFTMirr. */ 9141e9ea7e0SNamjae Jeon mrecs_per_page = PAGE_SIZE / vol->mft_record_size; 9151e9ea7e0SNamjae Jeon index = i = 0; 9161e9ea7e0SNamjae Jeon do { 9171e9ea7e0SNamjae Jeon u32 bytes; 9181e9ea7e0SNamjae Jeon 9191e9ea7e0SNamjae Jeon /* Switch pages if necessary. */ 9201e9ea7e0SNamjae Jeon if (!(i % mrecs_per_page)) { 9211e9ea7e0SNamjae Jeon if (index) { 9226251f0b0SNamjae Jeon kunmap_local(kmirr); 9236251f0b0SNamjae Jeon folio_put(mirr_folio); 9246251f0b0SNamjae Jeon kunmap_local(kmft); 9256251f0b0SNamjae Jeon folio_put(mft_folio); 9261e9ea7e0SNamjae Jeon } 9271e9ea7e0SNamjae Jeon /* Get the $MFT page. */ 9286251f0b0SNamjae Jeon mft_folio = read_mapping_folio(vol->mft_ino->i_mapping, 9296251f0b0SNamjae Jeon index, NULL); 9306251f0b0SNamjae Jeon if (IS_ERR(mft_folio)) { 9311e9ea7e0SNamjae Jeon ntfs_error(sb, "Failed to read $MFT."); 9321e9ea7e0SNamjae Jeon return false; 9331e9ea7e0SNamjae Jeon } 9346251f0b0SNamjae Jeon kmft = kmap_local_folio(mft_folio, 0); 9351e9ea7e0SNamjae Jeon /* Get the $MFTMirr page. */ 9366251f0b0SNamjae Jeon mirr_folio = read_mapping_folio(vol->mftmirr_ino->i_mapping, 9376251f0b0SNamjae Jeon index, NULL); 9386251f0b0SNamjae Jeon if (IS_ERR(mirr_folio)) { 9391e9ea7e0SNamjae Jeon ntfs_error(sb, "Failed to read $MFTMirr."); 9401e9ea7e0SNamjae Jeon goto mft_unmap_out; 9411e9ea7e0SNamjae Jeon } 9426251f0b0SNamjae Jeon kmirr = kmap_local_folio(mirr_folio, 0); 9431e9ea7e0SNamjae Jeon ++index; 9441e9ea7e0SNamjae Jeon } 9456251f0b0SNamjae Jeon 9461e9ea7e0SNamjae Jeon /* Do not check the record if it is not in use. */ 9476251f0b0SNamjae Jeon if (((struct mft_record *)kmft)->flags & MFT_RECORD_IN_USE) { 9481e9ea7e0SNamjae Jeon /* Make sure the record is ok. */ 9496251f0b0SNamjae Jeon if (ntfs_is_baad_recordp((__le32 *)kmft)) { 9506251f0b0SNamjae Jeon ntfs_error(sb, 9516251f0b0SNamjae Jeon "Incomplete multi sector transfer detected in mft record %i.", 9526251f0b0SNamjae Jeon i); 9531e9ea7e0SNamjae Jeon mm_unmap_out: 9546251f0b0SNamjae Jeon kunmap_local(kmirr); 9556251f0b0SNamjae Jeon folio_put(mirr_folio); 9561e9ea7e0SNamjae Jeon mft_unmap_out: 9576251f0b0SNamjae Jeon kunmap_local(kmft); 9586251f0b0SNamjae Jeon folio_put(mft_folio); 9591e9ea7e0SNamjae Jeon return false; 9601e9ea7e0SNamjae Jeon } 9611e9ea7e0SNamjae Jeon } 9621e9ea7e0SNamjae Jeon /* Do not check the mirror record if it is not in use. */ 9636251f0b0SNamjae Jeon if (((struct mft_record *)kmirr)->flags & MFT_RECORD_IN_USE) { 9646251f0b0SNamjae Jeon if (ntfs_is_baad_recordp((__le32 *)kmirr)) { 9656251f0b0SNamjae Jeon ntfs_error(sb, 9666251f0b0SNamjae Jeon "Incomplete multi sector transfer detected in mft mirror record %i.", 9676251f0b0SNamjae Jeon i); 9681e9ea7e0SNamjae Jeon goto mm_unmap_out; 9691e9ea7e0SNamjae Jeon } 9701e9ea7e0SNamjae Jeon } 9711e9ea7e0SNamjae Jeon /* Get the amount of data in the current record. */ 9726251f0b0SNamjae Jeon bytes = le32_to_cpu(((struct mft_record *)kmft)->bytes_in_use); 9736251f0b0SNamjae Jeon if (bytes < sizeof(struct mft_record_old) || 9741e9ea7e0SNamjae Jeon bytes > vol->mft_record_size || 9756251f0b0SNamjae Jeon ntfs_is_baad_recordp((__le32 *)kmft)) { 9766251f0b0SNamjae Jeon bytes = le32_to_cpu(((struct mft_record *)kmirr)->bytes_in_use); 9776251f0b0SNamjae Jeon if (bytes < sizeof(struct mft_record_old) || 9781e9ea7e0SNamjae Jeon bytes > vol->mft_record_size || 9796251f0b0SNamjae Jeon ntfs_is_baad_recordp((__le32 *)kmirr)) 9801e9ea7e0SNamjae Jeon bytes = vol->mft_record_size; 9811e9ea7e0SNamjae Jeon } 9821e9ea7e0SNamjae Jeon kmft += vol->mft_record_size; 9831e9ea7e0SNamjae Jeon kmirr += vol->mft_record_size; 9841e9ea7e0SNamjae Jeon } while (++i < vol->mftmirr_size); 9856251f0b0SNamjae Jeon /* Release the last folios. */ 9866251f0b0SNamjae Jeon kunmap_local(kmirr); 9876251f0b0SNamjae Jeon folio_put(mirr_folio); 9886251f0b0SNamjae Jeon kunmap_local(kmft); 9896251f0b0SNamjae Jeon folio_put(mft_folio); 9901e9ea7e0SNamjae Jeon 9911e9ea7e0SNamjae Jeon /* Construct the mft mirror runlist by hand. */ 9921e9ea7e0SNamjae Jeon rl2[0].vcn = 0; 9931e9ea7e0SNamjae Jeon rl2[0].lcn = vol->mftmirr_lcn; 9946251f0b0SNamjae Jeon rl2[0].length = NTFS_B_TO_CLU(vol, vol->mftmirr_size * vol->mft_record_size + 9956251f0b0SNamjae Jeon vol->cluster_size - 1); 9961e9ea7e0SNamjae Jeon rl2[1].vcn = rl2[0].length; 9971e9ea7e0SNamjae Jeon rl2[1].lcn = LCN_ENOENT; 9981e9ea7e0SNamjae Jeon rl2[1].length = 0; 9991e9ea7e0SNamjae Jeon /* 10001e9ea7e0SNamjae Jeon * Because we have just read all of the mft mirror, we know we have 10011e9ea7e0SNamjae Jeon * mapped the full runlist for it. 10021e9ea7e0SNamjae Jeon */ 10031e9ea7e0SNamjae Jeon mirr_ni = NTFS_I(vol->mftmirr_ino); 10041e9ea7e0SNamjae Jeon down_read(&mirr_ni->runlist.lock); 10051e9ea7e0SNamjae Jeon rl = mirr_ni->runlist.rl; 10061e9ea7e0SNamjae Jeon /* Compare the two runlists. They must be identical. */ 10071e9ea7e0SNamjae Jeon i = 0; 10081e9ea7e0SNamjae Jeon do { 10091e9ea7e0SNamjae Jeon if (rl2[i].vcn != rl[i].vcn || rl2[i].lcn != rl[i].lcn || 10101e9ea7e0SNamjae Jeon rl2[i].length != rl[i].length) { 10116251f0b0SNamjae Jeon ntfs_error(sb, "$MFTMirr location mismatch. Run chkdsk."); 10121e9ea7e0SNamjae Jeon up_read(&mirr_ni->runlist.lock); 10131e9ea7e0SNamjae Jeon return false; 10141e9ea7e0SNamjae Jeon } 10151e9ea7e0SNamjae Jeon } while (rl2[i++].length); 10161e9ea7e0SNamjae Jeon up_read(&mirr_ni->runlist.lock); 10171e9ea7e0SNamjae Jeon ntfs_debug("Done."); 10181e9ea7e0SNamjae Jeon return true; 10191e9ea7e0SNamjae Jeon } 10201e9ea7e0SNamjae Jeon 10216251f0b0SNamjae Jeon /* 10221e9ea7e0SNamjae Jeon * load_and_check_logfile - load and check the logfile inode for a volume 10236251f0b0SNamjae Jeon * @vol: ntfs volume to load the logfile for 10246251f0b0SNamjae Jeon * @rp: on success, set to the restart page header 10251e9ea7e0SNamjae Jeon * 10266251f0b0SNamjae Jeon * Return 0 on success or errno on error. 10271e9ea7e0SNamjae Jeon */ 10286251f0b0SNamjae Jeon static int load_and_check_logfile(struct ntfs_volume *vol, 10296251f0b0SNamjae Jeon struct restart_page_header **rp) 10301e9ea7e0SNamjae Jeon { 10311e9ea7e0SNamjae Jeon struct inode *tmp_ino; 10326251f0b0SNamjae Jeon int err = 0; 10331e9ea7e0SNamjae Jeon 10341e9ea7e0SNamjae Jeon ntfs_debug("Entering."); 10351e9ea7e0SNamjae Jeon tmp_ino = ntfs_iget(vol->sb, FILE_LogFile); 10366251f0b0SNamjae Jeon if (IS_ERR(tmp_ino)) { 10371e9ea7e0SNamjae Jeon if (!IS_ERR(tmp_ino)) 10381e9ea7e0SNamjae Jeon iput(tmp_ino); 10391e9ea7e0SNamjae Jeon /* Caller will display error message. */ 10406251f0b0SNamjae Jeon return -ENOENT; 10411e9ea7e0SNamjae Jeon } 10426251f0b0SNamjae Jeon if (!ntfs_check_logfile(tmp_ino, rp)) 10436251f0b0SNamjae Jeon err = -EINVAL; 10441e9ea7e0SNamjae Jeon NInoSetSparseDisabled(NTFS_I(tmp_ino)); 10451e9ea7e0SNamjae Jeon vol->logfile_ino = tmp_ino; 10461e9ea7e0SNamjae Jeon ntfs_debug("Done."); 10476251f0b0SNamjae Jeon return err; 10481e9ea7e0SNamjae Jeon } 10491e9ea7e0SNamjae Jeon 10501e9ea7e0SNamjae Jeon #define NTFS_HIBERFIL_HEADER_SIZE 4096 10511e9ea7e0SNamjae Jeon 10526251f0b0SNamjae Jeon /* 10531e9ea7e0SNamjae Jeon * check_windows_hibernation_status - check if Windows is suspended on a volume 10541e9ea7e0SNamjae Jeon * @vol: ntfs super block of device to check 10551e9ea7e0SNamjae Jeon * 10561e9ea7e0SNamjae Jeon * Check if Windows is hibernated on the ntfs volume @vol. This is done by 10571e9ea7e0SNamjae Jeon * looking for the file hiberfil.sys in the root directory of the volume. If 10581e9ea7e0SNamjae Jeon * the file is not present Windows is definitely not suspended. 10591e9ea7e0SNamjae Jeon * 10601e9ea7e0SNamjae Jeon * If hiberfil.sys exists and is less than 4kiB in size it means Windows is 10611e9ea7e0SNamjae Jeon * definitely suspended (this volume is not the system volume). Caveat: on a 10621e9ea7e0SNamjae Jeon * system with many volumes it is possible that the < 4kiB check is bogus but 10631e9ea7e0SNamjae Jeon * for now this should do fine. 10641e9ea7e0SNamjae Jeon * 10651e9ea7e0SNamjae Jeon * If hiberfil.sys exists and is larger than 4kiB in size, we need to read the 10661e9ea7e0SNamjae Jeon * hiberfil header (which is the first 4kiB). If this begins with "hibr", 10671e9ea7e0SNamjae Jeon * Windows is definitely suspended. If it is completely full of zeroes, 10681e9ea7e0SNamjae Jeon * Windows is definitely not hibernated. Any other case is treated as if 10691e9ea7e0SNamjae Jeon * Windows is suspended. This caters for the above mentioned caveat of a 10701e9ea7e0SNamjae Jeon * system with many volumes where no "hibr" magic would be present and there is 10711e9ea7e0SNamjae Jeon * no zero header. 10721e9ea7e0SNamjae Jeon * 10731e9ea7e0SNamjae Jeon * Return 0 if Windows is not hibernated on the volume, >0 if Windows is 10741e9ea7e0SNamjae Jeon * hibernated on the volume, and -errno on error. 10751e9ea7e0SNamjae Jeon */ 10766251f0b0SNamjae Jeon static int check_windows_hibernation_status(struct ntfs_volume *vol) 10771e9ea7e0SNamjae Jeon { 10786251f0b0SNamjae Jeon static const __le16 hiberfil[13] = { cpu_to_le16('h'), 10791e9ea7e0SNamjae Jeon cpu_to_le16('i'), cpu_to_le16('b'), 10801e9ea7e0SNamjae Jeon cpu_to_le16('e'), cpu_to_le16('r'), 10811e9ea7e0SNamjae Jeon cpu_to_le16('f'), cpu_to_le16('i'), 10821e9ea7e0SNamjae Jeon cpu_to_le16('l'), cpu_to_le16('.'), 10831e9ea7e0SNamjae Jeon cpu_to_le16('s'), cpu_to_le16('y'), 10841e9ea7e0SNamjae Jeon cpu_to_le16('s'), 0 }; 10856251f0b0SNamjae Jeon u64 mref; 10866251f0b0SNamjae Jeon struct inode *vi; 10876251f0b0SNamjae Jeon struct folio *folio; 10886251f0b0SNamjae Jeon u32 *kaddr, *kend, *start_addr = NULL; 10896251f0b0SNamjae Jeon struct ntfs_name *name = NULL; 10906251f0b0SNamjae Jeon int ret = 1; 10911e9ea7e0SNamjae Jeon 10921e9ea7e0SNamjae Jeon ntfs_debug("Entering."); 10931e9ea7e0SNamjae Jeon /* 10941e9ea7e0SNamjae Jeon * Find the inode number for the hibernation file by looking up the 10951e9ea7e0SNamjae Jeon * filename hiberfil.sys in the root directory. 10961e9ea7e0SNamjae Jeon */ 10971e9ea7e0SNamjae Jeon inode_lock(vol->root_ino); 10981e9ea7e0SNamjae Jeon mref = ntfs_lookup_inode_by_name(NTFS_I(vol->root_ino), hiberfil, 12, 10991e9ea7e0SNamjae Jeon &name); 11001e9ea7e0SNamjae Jeon inode_unlock(vol->root_ino); 11016251f0b0SNamjae Jeon kfree(name); 11021e9ea7e0SNamjae Jeon if (IS_ERR_MREF(mref)) { 11031e9ea7e0SNamjae Jeon ret = MREF_ERR(mref); 11041e9ea7e0SNamjae Jeon /* If the file does not exist, Windows is not hibernated. */ 11051e9ea7e0SNamjae Jeon if (ret == -ENOENT) { 11066251f0b0SNamjae Jeon ntfs_debug("hiberfil.sys not present. Windows is not hibernated on the volume."); 11071e9ea7e0SNamjae Jeon return 0; 11081e9ea7e0SNamjae Jeon } 11091e9ea7e0SNamjae Jeon /* A real error occurred. */ 11106251f0b0SNamjae Jeon ntfs_error(vol->sb, "Failed to find inode number for hiberfil.sys."); 11111e9ea7e0SNamjae Jeon return ret; 11121e9ea7e0SNamjae Jeon } 11131e9ea7e0SNamjae Jeon /* Get the inode. */ 11141e9ea7e0SNamjae Jeon vi = ntfs_iget(vol->sb, MREF(mref)); 11156251f0b0SNamjae Jeon if (IS_ERR(vi)) { 11161e9ea7e0SNamjae Jeon if (!IS_ERR(vi)) 11171e9ea7e0SNamjae Jeon iput(vi); 11181e9ea7e0SNamjae Jeon ntfs_error(vol->sb, "Failed to load hiberfil.sys."); 11191e9ea7e0SNamjae Jeon return IS_ERR(vi) ? PTR_ERR(vi) : -EIO; 11201e9ea7e0SNamjae Jeon } 11211e9ea7e0SNamjae Jeon if (unlikely(i_size_read(vi) < NTFS_HIBERFIL_HEADER_SIZE)) { 11226251f0b0SNamjae Jeon ntfs_debug("hiberfil.sys is smaller than 4kiB (0x%llx). Windows is hibernated on the volume. This is not the system volume.", 11236251f0b0SNamjae Jeon i_size_read(vi)); 11241e9ea7e0SNamjae Jeon goto iput_out; 11251e9ea7e0SNamjae Jeon } 11266251f0b0SNamjae Jeon 11276251f0b0SNamjae Jeon folio = read_mapping_folio(vi->i_mapping, 0, NULL); 11286251f0b0SNamjae Jeon if (IS_ERR(folio)) { 11291e9ea7e0SNamjae Jeon ntfs_error(vol->sb, "Failed to read from hiberfil.sys."); 11306251f0b0SNamjae Jeon ret = PTR_ERR(folio); 11311e9ea7e0SNamjae Jeon goto iput_out; 11321e9ea7e0SNamjae Jeon } 11336251f0b0SNamjae Jeon start_addr = (u32 *)kmap_local_folio(folio, 0); 11346251f0b0SNamjae Jeon kaddr = start_addr; 11356251f0b0SNamjae Jeon if (*(__le32 *)kaddr == cpu_to_le32(0x72626968)/*'hibr'*/) { 11366251f0b0SNamjae Jeon ntfs_debug("Magic \"hibr\" found in hiberfil.sys. Windows is hibernated on the volume. This is the system volume."); 11371e9ea7e0SNamjae Jeon goto unm_iput_out; 11381e9ea7e0SNamjae Jeon } 11391e9ea7e0SNamjae Jeon kend = kaddr + NTFS_HIBERFIL_HEADER_SIZE/sizeof(*kaddr); 11401e9ea7e0SNamjae Jeon do { 11411e9ea7e0SNamjae Jeon if (unlikely(*kaddr)) { 11426251f0b0SNamjae Jeon ntfs_debug("hiberfil.sys is larger than 4kiB (0x%llx), does not contain the \"hibr\" magic, and does not have a zero header. Windows is hibernated on the volume. This is not the system volume.", 11436251f0b0SNamjae Jeon i_size_read(vi)); 11441e9ea7e0SNamjae Jeon goto unm_iput_out; 11451e9ea7e0SNamjae Jeon } 11461e9ea7e0SNamjae Jeon } while (++kaddr < kend); 11476251f0b0SNamjae Jeon ntfs_debug("hiberfil.sys contains a zero header. Windows is not hibernated on the volume. This is the system volume."); 11481e9ea7e0SNamjae Jeon ret = 0; 11491e9ea7e0SNamjae Jeon unm_iput_out: 11506251f0b0SNamjae Jeon kunmap_local(start_addr); 11516251f0b0SNamjae Jeon folio_put(folio); 11521e9ea7e0SNamjae Jeon iput_out: 11531e9ea7e0SNamjae Jeon iput(vi); 11541e9ea7e0SNamjae Jeon return ret; 11551e9ea7e0SNamjae Jeon } 11561e9ea7e0SNamjae Jeon 11576251f0b0SNamjae Jeon /* 11581e9ea7e0SNamjae Jeon * load_and_init_quota - load and setup the quota file for a volume if present 11591e9ea7e0SNamjae Jeon * @vol: ntfs super block describing device whose quota file to load 11601e9ea7e0SNamjae Jeon * 11611e9ea7e0SNamjae Jeon * Return 'true' on success or 'false' on error. If $Quota is not present, we 11621e9ea7e0SNamjae Jeon * leave vol->quota_ino as NULL and return success. 11631e9ea7e0SNamjae Jeon */ 11646251f0b0SNamjae Jeon static bool load_and_init_quota(struct ntfs_volume *vol) 11651e9ea7e0SNamjae Jeon { 11666251f0b0SNamjae Jeon static const __le16 Quota[7] = { cpu_to_le16('$'), 11671e9ea7e0SNamjae Jeon cpu_to_le16('Q'), cpu_to_le16('u'), 11681e9ea7e0SNamjae Jeon cpu_to_le16('o'), cpu_to_le16('t'), 11691e9ea7e0SNamjae Jeon cpu_to_le16('a'), 0 }; 11706251f0b0SNamjae Jeon static __le16 Q[3] = { cpu_to_le16('$'), 11711e9ea7e0SNamjae Jeon cpu_to_le16('Q'), 0 }; 11726251f0b0SNamjae Jeon struct ntfs_name *name = NULL; 11736251f0b0SNamjae Jeon u64 mref; 11746251f0b0SNamjae Jeon struct inode *tmp_ino; 11751e9ea7e0SNamjae Jeon 11761e9ea7e0SNamjae Jeon ntfs_debug("Entering."); 11771e9ea7e0SNamjae Jeon /* 11781e9ea7e0SNamjae Jeon * Find the inode number for the quota file by looking up the filename 11791e9ea7e0SNamjae Jeon * $Quota in the extended system files directory $Extend. 11801e9ea7e0SNamjae Jeon */ 11811e9ea7e0SNamjae Jeon inode_lock(vol->extend_ino); 11821e9ea7e0SNamjae Jeon mref = ntfs_lookup_inode_by_name(NTFS_I(vol->extend_ino), Quota, 6, 11831e9ea7e0SNamjae Jeon &name); 11841e9ea7e0SNamjae Jeon inode_unlock(vol->extend_ino); 11856251f0b0SNamjae Jeon kfree(name); 11861e9ea7e0SNamjae Jeon if (IS_ERR_MREF(mref)) { 11871e9ea7e0SNamjae Jeon /* 11881e9ea7e0SNamjae Jeon * If the file does not exist, quotas are disabled and have 11891e9ea7e0SNamjae Jeon * never been enabled on this volume, just return success. 11901e9ea7e0SNamjae Jeon */ 11911e9ea7e0SNamjae Jeon if (MREF_ERR(mref) == -ENOENT) { 11926251f0b0SNamjae Jeon ntfs_debug("$Quota not present. Volume does not have quotas enabled."); 11931e9ea7e0SNamjae Jeon /* 11941e9ea7e0SNamjae Jeon * No need to try to set quotas out of date if they are 11951e9ea7e0SNamjae Jeon * not enabled. 11961e9ea7e0SNamjae Jeon */ 11971e9ea7e0SNamjae Jeon NVolSetQuotaOutOfDate(vol); 11981e9ea7e0SNamjae Jeon return true; 11991e9ea7e0SNamjae Jeon } 12001e9ea7e0SNamjae Jeon /* A real error occurred. */ 12011e9ea7e0SNamjae Jeon ntfs_error(vol->sb, "Failed to find inode number for $Quota."); 12021e9ea7e0SNamjae Jeon return false; 12031e9ea7e0SNamjae Jeon } 12041e9ea7e0SNamjae Jeon /* Get the inode. */ 12051e9ea7e0SNamjae Jeon tmp_ino = ntfs_iget(vol->sb, MREF(mref)); 12066251f0b0SNamjae Jeon if (IS_ERR(tmp_ino)) { 12071e9ea7e0SNamjae Jeon if (!IS_ERR(tmp_ino)) 12081e9ea7e0SNamjae Jeon iput(tmp_ino); 12091e9ea7e0SNamjae Jeon ntfs_error(vol->sb, "Failed to load $Quota."); 12101e9ea7e0SNamjae Jeon return false; 12111e9ea7e0SNamjae Jeon } 12121e9ea7e0SNamjae Jeon vol->quota_ino = tmp_ino; 12131e9ea7e0SNamjae Jeon /* Get the $Q index allocation attribute. */ 12141e9ea7e0SNamjae Jeon tmp_ino = ntfs_index_iget(vol->quota_ino, Q, 2); 12151e9ea7e0SNamjae Jeon if (IS_ERR(tmp_ino)) { 12161e9ea7e0SNamjae Jeon ntfs_error(vol->sb, "Failed to load $Quota/$Q index."); 12171e9ea7e0SNamjae Jeon return false; 12181e9ea7e0SNamjae Jeon } 12191e9ea7e0SNamjae Jeon vol->quota_q_ino = tmp_ino; 12201e9ea7e0SNamjae Jeon ntfs_debug("Done."); 12211e9ea7e0SNamjae Jeon return true; 12221e9ea7e0SNamjae Jeon } 12231e9ea7e0SNamjae Jeon 12241e9ea7e0SNamjae Jeon /* 12251e9ea7e0SNamjae Jeon * load_and_init_attrdef - load the attribute definitions table for a volume 12261e9ea7e0SNamjae Jeon * @vol: ntfs super block describing device whose attrdef to load 12271e9ea7e0SNamjae Jeon * 12281e9ea7e0SNamjae Jeon * Return 'true' on success or 'false' on error. 12291e9ea7e0SNamjae Jeon */ 12306251f0b0SNamjae Jeon static bool load_and_init_attrdef(struct ntfs_volume *vol) 12311e9ea7e0SNamjae Jeon { 12321e9ea7e0SNamjae Jeon loff_t i_size; 12331e9ea7e0SNamjae Jeon struct super_block *sb = vol->sb; 12341e9ea7e0SNamjae Jeon struct inode *ino; 12356251f0b0SNamjae Jeon struct folio *folio; 12366251f0b0SNamjae Jeon u8 *addr; 12371e9ea7e0SNamjae Jeon pgoff_t index, max_index; 12381e9ea7e0SNamjae Jeon unsigned int size; 12391e9ea7e0SNamjae Jeon 12401e9ea7e0SNamjae Jeon ntfs_debug("Entering."); 12411e9ea7e0SNamjae Jeon /* Read attrdef table and setup vol->attrdef and vol->attrdef_size. */ 12421e9ea7e0SNamjae Jeon ino = ntfs_iget(sb, FILE_AttrDef); 12436251f0b0SNamjae Jeon if (IS_ERR(ino)) { 12441e9ea7e0SNamjae Jeon if (!IS_ERR(ino)) 12451e9ea7e0SNamjae Jeon iput(ino); 12461e9ea7e0SNamjae Jeon goto failed; 12471e9ea7e0SNamjae Jeon } 12481e9ea7e0SNamjae Jeon NInoSetSparseDisabled(NTFS_I(ino)); 12491e9ea7e0SNamjae Jeon /* The size of FILE_AttrDef must be above 0 and fit inside 31 bits. */ 12501e9ea7e0SNamjae Jeon i_size = i_size_read(ino); 12511e9ea7e0SNamjae Jeon if (i_size <= 0 || i_size > 0x7fffffff) 12521e9ea7e0SNamjae Jeon goto iput_failed; 12536251f0b0SNamjae Jeon vol->attrdef = kvzalloc(i_size, GFP_NOFS); 12541e9ea7e0SNamjae Jeon if (!vol->attrdef) 12551e9ea7e0SNamjae Jeon goto iput_failed; 12561e9ea7e0SNamjae Jeon index = 0; 12571e9ea7e0SNamjae Jeon max_index = i_size >> PAGE_SHIFT; 12581e9ea7e0SNamjae Jeon size = PAGE_SIZE; 12591e9ea7e0SNamjae Jeon while (index < max_index) { 12601e9ea7e0SNamjae Jeon /* Read the attrdef table and copy it into the linear buffer. */ 12611e9ea7e0SNamjae Jeon read_partial_attrdef_page: 12626251f0b0SNamjae Jeon folio = read_mapping_folio(ino->i_mapping, index, NULL); 12636251f0b0SNamjae Jeon if (IS_ERR(folio)) 12641e9ea7e0SNamjae Jeon goto free_iput_failed; 12656251f0b0SNamjae Jeon addr = kmap_local_folio(folio, 0); 12661e9ea7e0SNamjae Jeon memcpy((u8 *)vol->attrdef + (index++ << PAGE_SHIFT), 12676251f0b0SNamjae Jeon addr, size); 12686251f0b0SNamjae Jeon kunmap_local(addr); 12696251f0b0SNamjae Jeon folio_put(folio); 12701e9ea7e0SNamjae Jeon } 12711e9ea7e0SNamjae Jeon if (size == PAGE_SIZE) { 12721e9ea7e0SNamjae Jeon size = i_size & ~PAGE_MASK; 12731e9ea7e0SNamjae Jeon if (size) 12741e9ea7e0SNamjae Jeon goto read_partial_attrdef_page; 12751e9ea7e0SNamjae Jeon } 12761e9ea7e0SNamjae Jeon vol->attrdef_size = i_size; 12771e9ea7e0SNamjae Jeon ntfs_debug("Read %llu bytes from $AttrDef.", i_size); 12781e9ea7e0SNamjae Jeon iput(ino); 12791e9ea7e0SNamjae Jeon return true; 12801e9ea7e0SNamjae Jeon free_iput_failed: 12816251f0b0SNamjae Jeon kvfree(vol->attrdef); 12821e9ea7e0SNamjae Jeon vol->attrdef = NULL; 12831e9ea7e0SNamjae Jeon iput_failed: 12841e9ea7e0SNamjae Jeon iput(ino); 12851e9ea7e0SNamjae Jeon failed: 12861e9ea7e0SNamjae Jeon ntfs_error(sb, "Failed to initialize attribute definition table."); 12871e9ea7e0SNamjae Jeon return false; 12881e9ea7e0SNamjae Jeon } 12891e9ea7e0SNamjae Jeon 12906251f0b0SNamjae Jeon /* 12911e9ea7e0SNamjae Jeon * load_and_init_upcase - load the upcase table for an ntfs volume 12921e9ea7e0SNamjae Jeon * @vol: ntfs super block describing device whose upcase to load 12931e9ea7e0SNamjae Jeon * 12941e9ea7e0SNamjae Jeon * Return 'true' on success or 'false' on error. 12951e9ea7e0SNamjae Jeon */ 12966251f0b0SNamjae Jeon static bool load_and_init_upcase(struct ntfs_volume *vol) 12971e9ea7e0SNamjae Jeon { 12981e9ea7e0SNamjae Jeon loff_t i_size; 12991e9ea7e0SNamjae Jeon struct super_block *sb = vol->sb; 13001e9ea7e0SNamjae Jeon struct inode *ino; 13016251f0b0SNamjae Jeon struct folio *folio; 13026251f0b0SNamjae Jeon u8 *addr; 13031e9ea7e0SNamjae Jeon pgoff_t index, max_index; 13041e9ea7e0SNamjae Jeon unsigned int size; 13051e9ea7e0SNamjae Jeon int i, max; 13061e9ea7e0SNamjae Jeon 13071e9ea7e0SNamjae Jeon ntfs_debug("Entering."); 13081e9ea7e0SNamjae Jeon /* Read upcase table and setup vol->upcase and vol->upcase_len. */ 13091e9ea7e0SNamjae Jeon ino = ntfs_iget(sb, FILE_UpCase); 13106251f0b0SNamjae Jeon if (IS_ERR(ino)) { 13111e9ea7e0SNamjae Jeon if (!IS_ERR(ino)) 13121e9ea7e0SNamjae Jeon iput(ino); 13131e9ea7e0SNamjae Jeon goto upcase_failed; 13141e9ea7e0SNamjae Jeon } 13151e9ea7e0SNamjae Jeon /* 13161e9ea7e0SNamjae Jeon * The upcase size must not be above 64k Unicode characters, must not 13176251f0b0SNamjae Jeon * be zero and must be a multiple of sizeof(__le16). 13181e9ea7e0SNamjae Jeon */ 13191e9ea7e0SNamjae Jeon i_size = i_size_read(ino); 13206251f0b0SNamjae Jeon if (!i_size || i_size & (sizeof(__le16) - 1) || 13216251f0b0SNamjae Jeon i_size > 64ULL * 1024 * sizeof(__le16)) 13221e9ea7e0SNamjae Jeon goto iput_upcase_failed; 13236251f0b0SNamjae Jeon vol->upcase = kvzalloc(i_size, GFP_NOFS); 13241e9ea7e0SNamjae Jeon if (!vol->upcase) 13251e9ea7e0SNamjae Jeon goto iput_upcase_failed; 13261e9ea7e0SNamjae Jeon index = 0; 13271e9ea7e0SNamjae Jeon max_index = i_size >> PAGE_SHIFT; 13281e9ea7e0SNamjae Jeon size = PAGE_SIZE; 13291e9ea7e0SNamjae Jeon while (index < max_index) { 13301e9ea7e0SNamjae Jeon /* Read the upcase table and copy it into the linear buffer. */ 13311e9ea7e0SNamjae Jeon read_partial_upcase_page: 13326251f0b0SNamjae Jeon folio = read_mapping_folio(ino->i_mapping, index, NULL); 13336251f0b0SNamjae Jeon if (IS_ERR(folio)) 13341e9ea7e0SNamjae Jeon goto iput_upcase_failed; 13356251f0b0SNamjae Jeon addr = kmap_local_folio(folio, 0); 13361e9ea7e0SNamjae Jeon memcpy((char *)vol->upcase + (index++ << PAGE_SHIFT), 13376251f0b0SNamjae Jeon addr, size); 13386251f0b0SNamjae Jeon kunmap_local(addr); 13396251f0b0SNamjae Jeon folio_put(folio); 13401dbe3966SChen Ni } 13411e9ea7e0SNamjae Jeon if (size == PAGE_SIZE) { 13421e9ea7e0SNamjae Jeon size = i_size & ~PAGE_MASK; 13431e9ea7e0SNamjae Jeon if (size) 13441e9ea7e0SNamjae Jeon goto read_partial_upcase_page; 13451e9ea7e0SNamjae Jeon } 13466251f0b0SNamjae Jeon vol->upcase_len = i_size >> sizeof(unsigned char); 13471e9ea7e0SNamjae Jeon ntfs_debug("Read %llu bytes from $UpCase (expected %zu bytes).", 13486251f0b0SNamjae Jeon i_size, 64 * 1024 * sizeof(__le16)); 13491e9ea7e0SNamjae Jeon iput(ino); 13501e9ea7e0SNamjae Jeon mutex_lock(&ntfs_lock); 13511e9ea7e0SNamjae Jeon if (!default_upcase) { 13526251f0b0SNamjae Jeon ntfs_debug("Using volume specified $UpCase since default is not present."); 13531e9ea7e0SNamjae Jeon mutex_unlock(&ntfs_lock); 13541e9ea7e0SNamjae Jeon return true; 13551e9ea7e0SNamjae Jeon } 13561e9ea7e0SNamjae Jeon max = default_upcase_len; 13571e9ea7e0SNamjae Jeon if (max > vol->upcase_len) 13581e9ea7e0SNamjae Jeon max = vol->upcase_len; 13591e9ea7e0SNamjae Jeon for (i = 0; i < max; i++) 13601e9ea7e0SNamjae Jeon if (vol->upcase[i] != default_upcase[i]) 13611e9ea7e0SNamjae Jeon break; 13621e9ea7e0SNamjae Jeon if (i == max) { 13636251f0b0SNamjae Jeon kvfree(vol->upcase); 13641e9ea7e0SNamjae Jeon vol->upcase = default_upcase; 13651e9ea7e0SNamjae Jeon vol->upcase_len = max; 13661e9ea7e0SNamjae Jeon ntfs_nr_upcase_users++; 13671e9ea7e0SNamjae Jeon mutex_unlock(&ntfs_lock); 13686251f0b0SNamjae Jeon ntfs_debug("Volume specified $UpCase matches default. Using default."); 13691e9ea7e0SNamjae Jeon return true; 13701e9ea7e0SNamjae Jeon } 13711e9ea7e0SNamjae Jeon mutex_unlock(&ntfs_lock); 13726251f0b0SNamjae Jeon ntfs_debug("Using volume specified $UpCase since it does not match the default."); 13731e9ea7e0SNamjae Jeon return true; 13741e9ea7e0SNamjae Jeon iput_upcase_failed: 13751e9ea7e0SNamjae Jeon iput(ino); 13766251f0b0SNamjae Jeon kvfree(vol->upcase); 13771e9ea7e0SNamjae Jeon vol->upcase = NULL; 13781e9ea7e0SNamjae Jeon upcase_failed: 13791e9ea7e0SNamjae Jeon mutex_lock(&ntfs_lock); 13801e9ea7e0SNamjae Jeon if (default_upcase) { 13811e9ea7e0SNamjae Jeon vol->upcase = default_upcase; 13821e9ea7e0SNamjae Jeon vol->upcase_len = default_upcase_len; 13831e9ea7e0SNamjae Jeon ntfs_nr_upcase_users++; 13841e9ea7e0SNamjae Jeon mutex_unlock(&ntfs_lock); 13856251f0b0SNamjae Jeon ntfs_error(sb, "Failed to load $UpCase from the volume. Using default."); 13861e9ea7e0SNamjae Jeon return true; 13871e9ea7e0SNamjae Jeon } 13881e9ea7e0SNamjae Jeon mutex_unlock(&ntfs_lock); 13891e9ea7e0SNamjae Jeon ntfs_error(sb, "Failed to initialize upcase table."); 13901e9ea7e0SNamjae Jeon return false; 13911e9ea7e0SNamjae Jeon } 13921e9ea7e0SNamjae Jeon 13931e9ea7e0SNamjae Jeon /* 13941e9ea7e0SNamjae Jeon * The lcn and mft bitmap inodes are NTFS-internal inodes with 13951e9ea7e0SNamjae Jeon * their own special locking rules: 13961e9ea7e0SNamjae Jeon */ 13971e9ea7e0SNamjae Jeon static struct lock_class_key 13981e9ea7e0SNamjae Jeon lcnbmp_runlist_lock_key, lcnbmp_mrec_lock_key, 13991e9ea7e0SNamjae Jeon mftbmp_runlist_lock_key, mftbmp_mrec_lock_key; 14001e9ea7e0SNamjae Jeon 14016251f0b0SNamjae Jeon /* 14021e9ea7e0SNamjae Jeon * load_system_files - open the system files using normal functions 14031e9ea7e0SNamjae Jeon * @vol: ntfs super block describing device whose system files to load 14041e9ea7e0SNamjae Jeon * 14051e9ea7e0SNamjae Jeon * Open the system files with normal access functions and complete setting up 14061e9ea7e0SNamjae Jeon * the ntfs super block @vol. 14071e9ea7e0SNamjae Jeon * 14081e9ea7e0SNamjae Jeon * Return 'true' on success or 'false' on error. 14091e9ea7e0SNamjae Jeon */ 14106251f0b0SNamjae Jeon static bool load_system_files(struct ntfs_volume *vol) 14111e9ea7e0SNamjae Jeon { 14121e9ea7e0SNamjae Jeon struct super_block *sb = vol->sb; 14136251f0b0SNamjae Jeon struct mft_record *m; 14146251f0b0SNamjae Jeon struct volume_information *vi; 14156251f0b0SNamjae Jeon struct ntfs_attr_search_ctx *ctx; 14166251f0b0SNamjae Jeon struct restart_page_header *rp; 14171e9ea7e0SNamjae Jeon int err; 14181e9ea7e0SNamjae Jeon 14191e9ea7e0SNamjae Jeon ntfs_debug("Entering."); 14201e9ea7e0SNamjae Jeon /* Get mft mirror inode compare the contents of $MFT and $MFTMirr. */ 14211e9ea7e0SNamjae Jeon if (!load_and_init_mft_mirror(vol) || !check_mft_mirror(vol)) { 14226251f0b0SNamjae Jeon /* If a read-write mount, convert it to a read-only mount. */ 14236251f0b0SNamjae Jeon if (!sb_rdonly(sb) && vol->on_errors == ON_ERRORS_REMOUNT_RO) { 14241e9ea7e0SNamjae Jeon static const char *es1 = "Failed to load $MFTMirr"; 14251e9ea7e0SNamjae Jeon static const char *es2 = "$MFTMirr does not match $MFT"; 14266251f0b0SNamjae Jeon static const char *es3 = ". Run ntfsck and/or chkdsk."; 14271e9ea7e0SNamjae Jeon 14281e9ea7e0SNamjae Jeon sb->s_flags |= SB_RDONLY; 14291e9ea7e0SNamjae Jeon ntfs_error(sb, "%s. Mounting read-only%s", 14301e9ea7e0SNamjae Jeon !vol->mftmirr_ino ? es1 : es2, es3); 14316251f0b0SNamjae Jeon } 14321e9ea7e0SNamjae Jeon NVolSetErrors(vol); 14331e9ea7e0SNamjae Jeon } 14341e9ea7e0SNamjae Jeon /* Get mft bitmap attribute inode. */ 14351e9ea7e0SNamjae Jeon vol->mftbmp_ino = ntfs_attr_iget(vol->mft_ino, AT_BITMAP, NULL, 0); 14361e9ea7e0SNamjae Jeon if (IS_ERR(vol->mftbmp_ino)) { 14371e9ea7e0SNamjae Jeon ntfs_error(sb, "Failed to load $MFT/$BITMAP attribute."); 14381e9ea7e0SNamjae Jeon goto iput_mirr_err_out; 14391e9ea7e0SNamjae Jeon } 14401e9ea7e0SNamjae Jeon lockdep_set_class(&NTFS_I(vol->mftbmp_ino)->runlist.lock, 14411e9ea7e0SNamjae Jeon &mftbmp_runlist_lock_key); 14421e9ea7e0SNamjae Jeon lockdep_set_class(&NTFS_I(vol->mftbmp_ino)->mrec_lock, 14431e9ea7e0SNamjae Jeon &mftbmp_mrec_lock_key); 14441e9ea7e0SNamjae Jeon /* Read upcase table and setup @vol->upcase and @vol->upcase_len. */ 14451e9ea7e0SNamjae Jeon if (!load_and_init_upcase(vol)) 14461e9ea7e0SNamjae Jeon goto iput_mftbmp_err_out; 14471e9ea7e0SNamjae Jeon /* 14481e9ea7e0SNamjae Jeon * Read attribute definitions table and setup @vol->attrdef and 14491e9ea7e0SNamjae Jeon * @vol->attrdef_size. 14501e9ea7e0SNamjae Jeon */ 14511e9ea7e0SNamjae Jeon if (!load_and_init_attrdef(vol)) 14521e9ea7e0SNamjae Jeon goto iput_upcase_err_out; 14531e9ea7e0SNamjae Jeon /* 14541e9ea7e0SNamjae Jeon * Get the cluster allocation bitmap inode and verify the size, no 14551e9ea7e0SNamjae Jeon * need for any locking at this stage as we are already running 14561e9ea7e0SNamjae Jeon * exclusively as we are mount in progress task. 14571e9ea7e0SNamjae Jeon */ 14581e9ea7e0SNamjae Jeon vol->lcnbmp_ino = ntfs_iget(sb, FILE_Bitmap); 14596251f0b0SNamjae Jeon if (IS_ERR(vol->lcnbmp_ino)) { 14601e9ea7e0SNamjae Jeon if (!IS_ERR(vol->lcnbmp_ino)) 14611e9ea7e0SNamjae Jeon iput(vol->lcnbmp_ino); 14621e9ea7e0SNamjae Jeon goto bitmap_failed; 14631e9ea7e0SNamjae Jeon } 14641e9ea7e0SNamjae Jeon lockdep_set_class(&NTFS_I(vol->lcnbmp_ino)->runlist.lock, 14651e9ea7e0SNamjae Jeon &lcnbmp_runlist_lock_key); 14661e9ea7e0SNamjae Jeon lockdep_set_class(&NTFS_I(vol->lcnbmp_ino)->mrec_lock, 14671e9ea7e0SNamjae Jeon &lcnbmp_mrec_lock_key); 14681e9ea7e0SNamjae Jeon 14691e9ea7e0SNamjae Jeon NInoSetSparseDisabled(NTFS_I(vol->lcnbmp_ino)); 14701e9ea7e0SNamjae Jeon if ((vol->nr_clusters + 7) >> 3 > i_size_read(vol->lcnbmp_ino)) { 14711e9ea7e0SNamjae Jeon iput(vol->lcnbmp_ino); 14721e9ea7e0SNamjae Jeon bitmap_failed: 14731e9ea7e0SNamjae Jeon ntfs_error(sb, "Failed to load $Bitmap."); 14741e9ea7e0SNamjae Jeon goto iput_attrdef_err_out; 14751e9ea7e0SNamjae Jeon } 14761e9ea7e0SNamjae Jeon /* 14771e9ea7e0SNamjae Jeon * Get the volume inode and setup our cache of the volume flags and 14781e9ea7e0SNamjae Jeon * version. 14791e9ea7e0SNamjae Jeon */ 14801e9ea7e0SNamjae Jeon vol->vol_ino = ntfs_iget(sb, FILE_Volume); 14816251f0b0SNamjae Jeon if (IS_ERR(vol->vol_ino)) { 14821e9ea7e0SNamjae Jeon if (!IS_ERR(vol->vol_ino)) 14831e9ea7e0SNamjae Jeon iput(vol->vol_ino); 14841e9ea7e0SNamjae Jeon volume_failed: 14851e9ea7e0SNamjae Jeon ntfs_error(sb, "Failed to load $Volume."); 14861e9ea7e0SNamjae Jeon goto iput_lcnbmp_err_out; 14871e9ea7e0SNamjae Jeon } 14881e9ea7e0SNamjae Jeon m = map_mft_record(NTFS_I(vol->vol_ino)); 14891e9ea7e0SNamjae Jeon if (IS_ERR(m)) { 14901e9ea7e0SNamjae Jeon iput_volume_failed: 14911e9ea7e0SNamjae Jeon iput(vol->vol_ino); 14921e9ea7e0SNamjae Jeon goto volume_failed; 14931e9ea7e0SNamjae Jeon } 14946251f0b0SNamjae Jeon 14956251f0b0SNamjae Jeon ctx = ntfs_attr_get_search_ctx(NTFS_I(vol->vol_ino), m); 14966251f0b0SNamjae Jeon if (!ctx) { 14971e9ea7e0SNamjae Jeon ntfs_error(sb, "Failed to get attribute search context."); 14981e9ea7e0SNamjae Jeon goto get_ctx_vol_failed; 14991e9ea7e0SNamjae Jeon } 15006251f0b0SNamjae Jeon 15016251f0b0SNamjae Jeon if (!ntfs_attr_lookup(AT_VOLUME_NAME, NULL, 0, 0, 0, NULL, 0, ctx) && 15026251f0b0SNamjae Jeon !ctx->attr->non_resident && 15036251f0b0SNamjae Jeon !(ctx->attr->flags & (ATTR_IS_SPARSE | ATTR_IS_COMPRESSED)) && 15046251f0b0SNamjae Jeon le32_to_cpu(ctx->attr->data.resident.value_length) > 0) { 15056251f0b0SNamjae Jeon err = ntfs_ucstonls(vol, (__le16 *)((u8 *)ctx->attr + 15066251f0b0SNamjae Jeon le16_to_cpu(ctx->attr->data.resident.value_offset)), 15076251f0b0SNamjae Jeon le32_to_cpu(ctx->attr->data.resident.value_length) / 2, 15086251f0b0SNamjae Jeon &vol->volume_label, NTFS_MAX_LABEL_LEN); 15096251f0b0SNamjae Jeon if (err < 0) 15106251f0b0SNamjae Jeon vol->volume_label = NULL; 15116251f0b0SNamjae Jeon } 15126251f0b0SNamjae Jeon 15131e9ea7e0SNamjae Jeon if (ntfs_attr_lookup(AT_VOLUME_INFORMATION, NULL, 0, 0, 0, NULL, 0, 15141e9ea7e0SNamjae Jeon ctx) || ctx->attr->non_resident || ctx->attr->flags) { 15151e9ea7e0SNamjae Jeon ntfs_attr_put_search_ctx(ctx); 15161e9ea7e0SNamjae Jeon get_ctx_vol_failed: 15171e9ea7e0SNamjae Jeon unmap_mft_record(NTFS_I(vol->vol_ino)); 15181e9ea7e0SNamjae Jeon goto iput_volume_failed; 15191e9ea7e0SNamjae Jeon } 15206251f0b0SNamjae Jeon vi = (struct volume_information *)((char *)ctx->attr + 15211e9ea7e0SNamjae Jeon le16_to_cpu(ctx->attr->data.resident.value_offset)); 15226251f0b0SNamjae Jeon /* Copy the volume flags and version to the struct ntfs_volume structure. */ 15231e9ea7e0SNamjae Jeon vol->vol_flags = vi->flags; 15241e9ea7e0SNamjae Jeon vol->major_ver = vi->major_ver; 15251e9ea7e0SNamjae Jeon vol->minor_ver = vi->minor_ver; 15261e9ea7e0SNamjae Jeon ntfs_attr_put_search_ctx(ctx); 15271e9ea7e0SNamjae Jeon unmap_mft_record(NTFS_I(vol->vol_ino)); 15286251f0b0SNamjae Jeon pr_info("volume version %i.%i, dev %s, cluster size %d\n", 15296251f0b0SNamjae Jeon vol->major_ver, vol->minor_ver, sb->s_id, vol->cluster_size); 15306251f0b0SNamjae Jeon 15311e9ea7e0SNamjae Jeon /* Make sure that no unsupported volume flags are set. */ 15321e9ea7e0SNamjae Jeon if (vol->vol_flags & VOLUME_MUST_MOUNT_RO_MASK) { 15331e9ea7e0SNamjae Jeon static const char *es1a = "Volume is dirty"; 15341e9ea7e0SNamjae Jeon static const char *es1b = "Volume has been modified by chkdsk"; 15351e9ea7e0SNamjae Jeon static const char *es1c = "Volume has unsupported flags set"; 15361e9ea7e0SNamjae Jeon static const char *es2a = ". Run chkdsk and mount in Windows."; 15371e9ea7e0SNamjae Jeon static const char *es2b = ". Mount in Windows."; 15381e9ea7e0SNamjae Jeon const char *es1, *es2; 15391e9ea7e0SNamjae Jeon 15401e9ea7e0SNamjae Jeon es2 = es2a; 15411e9ea7e0SNamjae Jeon if (vol->vol_flags & VOLUME_IS_DIRTY) 15421e9ea7e0SNamjae Jeon es1 = es1a; 15431e9ea7e0SNamjae Jeon else if (vol->vol_flags & VOLUME_MODIFIED_BY_CHKDSK) { 15441e9ea7e0SNamjae Jeon es1 = es1b; 15451e9ea7e0SNamjae Jeon es2 = es2b; 15461e9ea7e0SNamjae Jeon } else { 15471e9ea7e0SNamjae Jeon es1 = es1c; 15486251f0b0SNamjae Jeon ntfs_warning(sb, "Unsupported volume flags 0x%x encountered.", 15496251f0b0SNamjae Jeon (unsigned int)le16_to_cpu(vol->vol_flags)); 15501e9ea7e0SNamjae Jeon } 15511e9ea7e0SNamjae Jeon /* If a read-write mount, convert it to a read-only mount. */ 15526251f0b0SNamjae Jeon if (!sb_rdonly(sb) && vol->on_errors == ON_ERRORS_REMOUNT_RO) { 15531e9ea7e0SNamjae Jeon sb->s_flags |= SB_RDONLY; 15541e9ea7e0SNamjae Jeon ntfs_error(sb, "%s. Mounting read-only%s", es1, es2); 15556251f0b0SNamjae Jeon } 15561e9ea7e0SNamjae Jeon /* 15571e9ea7e0SNamjae Jeon * Do not set NVolErrors() because ntfs_remount() re-checks the 15581e9ea7e0SNamjae Jeon * flags which we need to do in case any flags have changed. 15591e9ea7e0SNamjae Jeon */ 15601e9ea7e0SNamjae Jeon } 15611e9ea7e0SNamjae Jeon /* 15621e9ea7e0SNamjae Jeon * Get the inode for the logfile, check it and determine if the volume 15631e9ea7e0SNamjae Jeon * was shutdown cleanly. 15641e9ea7e0SNamjae Jeon */ 15651e9ea7e0SNamjae Jeon rp = NULL; 15666251f0b0SNamjae Jeon err = load_and_check_logfile(vol, &rp); 15676251f0b0SNamjae Jeon if (err) { 15681e9ea7e0SNamjae Jeon /* If a read-write mount, convert it to a read-only mount. */ 15696251f0b0SNamjae Jeon if (!sb_rdonly(sb) && vol->on_errors == ON_ERRORS_REMOUNT_RO) { 15701e9ea7e0SNamjae Jeon sb->s_flags |= SB_RDONLY; 15716251f0b0SNamjae Jeon ntfs_error(sb, "Failed to load LogFile. Mounting read-only."); 15726251f0b0SNamjae Jeon } 15731e9ea7e0SNamjae Jeon NVolSetErrors(vol); 15741e9ea7e0SNamjae Jeon } 15756251f0b0SNamjae Jeon 15766251f0b0SNamjae Jeon kvfree(rp); 15771e9ea7e0SNamjae Jeon /* Get the root directory inode so we can do path lookups. */ 15781e9ea7e0SNamjae Jeon vol->root_ino = ntfs_iget(sb, FILE_root); 15796251f0b0SNamjae Jeon if (IS_ERR(vol->root_ino)) { 15801e9ea7e0SNamjae Jeon if (!IS_ERR(vol->root_ino)) 15811e9ea7e0SNamjae Jeon iput(vol->root_ino); 15821e9ea7e0SNamjae Jeon ntfs_error(sb, "Failed to load root directory."); 15831e9ea7e0SNamjae Jeon goto iput_logfile_err_out; 15841e9ea7e0SNamjae Jeon } 15851e9ea7e0SNamjae Jeon /* 15861e9ea7e0SNamjae Jeon * Check if Windows is suspended to disk on the target volume. If it 15871e9ea7e0SNamjae Jeon * is hibernated, we must not write *anything* to the disk so set 15881e9ea7e0SNamjae Jeon * NVolErrors() without setting the dirty volume flag and mount 15891e9ea7e0SNamjae Jeon * read-only. This will prevent read-write remounting and it will also 15901e9ea7e0SNamjae Jeon * prevent all writes. 15911e9ea7e0SNamjae Jeon */ 15921e9ea7e0SNamjae Jeon err = check_windows_hibernation_status(vol); 15931e9ea7e0SNamjae Jeon if (unlikely(err)) { 15946251f0b0SNamjae Jeon static const char *es1a = "Failed to determine if Windows is hibernated"; 15951e9ea7e0SNamjae Jeon static const char *es1b = "Windows is hibernated"; 15961e9ea7e0SNamjae Jeon static const char *es2 = ". Run chkdsk."; 15971e9ea7e0SNamjae Jeon const char *es1; 15981e9ea7e0SNamjae Jeon 15991e9ea7e0SNamjae Jeon es1 = err < 0 ? es1a : es1b; 16001e9ea7e0SNamjae Jeon /* If a read-write mount, convert it to a read-only mount. */ 16016251f0b0SNamjae Jeon if (!sb_rdonly(sb) && vol->on_errors == ON_ERRORS_REMOUNT_RO) { 16021e9ea7e0SNamjae Jeon sb->s_flags |= SB_RDONLY; 16031e9ea7e0SNamjae Jeon ntfs_error(sb, "%s. Mounting read-only%s", es1, es2); 16046251f0b0SNamjae Jeon } 16051e9ea7e0SNamjae Jeon NVolSetErrors(vol); 16061e9ea7e0SNamjae Jeon } 16071e9ea7e0SNamjae Jeon 16081e9ea7e0SNamjae Jeon /* If (still) a read-write mount, empty the logfile. */ 16096251f0b0SNamjae Jeon if (!sb_rdonly(sb) && 16106251f0b0SNamjae Jeon vol->logfile_ino && !ntfs_empty_logfile(vol->logfile_ino) && 16116251f0b0SNamjae Jeon vol->on_errors == ON_ERRORS_REMOUNT_RO) { 16126251f0b0SNamjae Jeon static const char *es1 = "Failed to empty LogFile"; 16131e9ea7e0SNamjae Jeon static const char *es2 = ". Mount in Windows."; 16141e9ea7e0SNamjae Jeon 16151e9ea7e0SNamjae Jeon /* Convert to a read-only mount. */ 16161e9ea7e0SNamjae Jeon ntfs_error(sb, "%s. Mounting read-only%s", es1, es2); 16171e9ea7e0SNamjae Jeon sb->s_flags |= SB_RDONLY; 16181e9ea7e0SNamjae Jeon NVolSetErrors(vol); 16191e9ea7e0SNamjae Jeon } 16201e9ea7e0SNamjae Jeon /* If on NTFS versions before 3.0, we are done. */ 16211e9ea7e0SNamjae Jeon if (unlikely(vol->major_ver < 3)) 16221e9ea7e0SNamjae Jeon return true; 16231e9ea7e0SNamjae Jeon /* NTFS 3.0+ specific initialization. */ 16241e9ea7e0SNamjae Jeon /* Get the security descriptors inode. */ 16251e9ea7e0SNamjae Jeon vol->secure_ino = ntfs_iget(sb, FILE_Secure); 16266251f0b0SNamjae Jeon if (IS_ERR(vol->secure_ino)) { 16271e9ea7e0SNamjae Jeon if (!IS_ERR(vol->secure_ino)) 16281e9ea7e0SNamjae Jeon iput(vol->secure_ino); 16291e9ea7e0SNamjae Jeon ntfs_error(sb, "Failed to load $Secure."); 16301e9ea7e0SNamjae Jeon goto iput_root_err_out; 16311e9ea7e0SNamjae Jeon } 16321e9ea7e0SNamjae Jeon /* Get the extended system files' directory inode. */ 16331e9ea7e0SNamjae Jeon vol->extend_ino = ntfs_iget(sb, FILE_Extend); 16346251f0b0SNamjae Jeon if (IS_ERR(vol->extend_ino) || 16351e9ea7e0SNamjae Jeon !S_ISDIR(vol->extend_ino->i_mode)) { 16361e9ea7e0SNamjae Jeon if (!IS_ERR(vol->extend_ino)) 16371e9ea7e0SNamjae Jeon iput(vol->extend_ino); 16381e9ea7e0SNamjae Jeon ntfs_error(sb, "Failed to load $Extend."); 16391e9ea7e0SNamjae Jeon goto iput_sec_err_out; 16401e9ea7e0SNamjae Jeon } 16411e9ea7e0SNamjae Jeon /* Find the quota file, load it if present, and set it up. */ 16426251f0b0SNamjae Jeon if (!load_and_init_quota(vol) && 16436251f0b0SNamjae Jeon vol->on_errors == ON_ERRORS_REMOUNT_RO) { 16441e9ea7e0SNamjae Jeon static const char *es1 = "Failed to load $Quota"; 16451e9ea7e0SNamjae Jeon static const char *es2 = ". Run chkdsk."; 16461e9ea7e0SNamjae Jeon 16471e9ea7e0SNamjae Jeon sb->s_flags |= SB_RDONLY; 16481e9ea7e0SNamjae Jeon ntfs_error(sb, "%s. Mounting read-only%s", es1, es2); 16491e9ea7e0SNamjae Jeon /* This will prevent a read-write remount. */ 16501e9ea7e0SNamjae Jeon NVolSetErrors(vol); 16511e9ea7e0SNamjae Jeon } 16521e9ea7e0SNamjae Jeon 16531e9ea7e0SNamjae Jeon return true; 16546251f0b0SNamjae Jeon 16551e9ea7e0SNamjae Jeon iput_sec_err_out: 16561e9ea7e0SNamjae Jeon iput(vol->secure_ino); 16571e9ea7e0SNamjae Jeon iput_root_err_out: 16581e9ea7e0SNamjae Jeon iput(vol->root_ino); 16591e9ea7e0SNamjae Jeon iput_logfile_err_out: 16606251f0b0SNamjae Jeon if (vol->logfile_ino) 16611e9ea7e0SNamjae Jeon iput(vol->logfile_ino); 16621e9ea7e0SNamjae Jeon iput(vol->vol_ino); 16631e9ea7e0SNamjae Jeon iput_lcnbmp_err_out: 16641e9ea7e0SNamjae Jeon iput(vol->lcnbmp_ino); 16651e9ea7e0SNamjae Jeon iput_attrdef_err_out: 16661e9ea7e0SNamjae Jeon vol->attrdef_size = 0; 16671e9ea7e0SNamjae Jeon if (vol->attrdef) { 16686251f0b0SNamjae Jeon kvfree(vol->attrdef); 16691e9ea7e0SNamjae Jeon vol->attrdef = NULL; 16701e9ea7e0SNamjae Jeon } 16711e9ea7e0SNamjae Jeon iput_upcase_err_out: 16721e9ea7e0SNamjae Jeon vol->upcase_len = 0; 16731e9ea7e0SNamjae Jeon mutex_lock(&ntfs_lock); 16741e9ea7e0SNamjae Jeon if (vol->upcase == default_upcase) { 16751e9ea7e0SNamjae Jeon ntfs_nr_upcase_users--; 16761e9ea7e0SNamjae Jeon vol->upcase = NULL; 16771e9ea7e0SNamjae Jeon } 16781e9ea7e0SNamjae Jeon mutex_unlock(&ntfs_lock); 16791e9ea7e0SNamjae Jeon if (vol->upcase) { 16806251f0b0SNamjae Jeon kvfree(vol->upcase); 16811e9ea7e0SNamjae Jeon vol->upcase = NULL; 16821e9ea7e0SNamjae Jeon } 16831e9ea7e0SNamjae Jeon iput_mftbmp_err_out: 16841e9ea7e0SNamjae Jeon iput(vol->mftbmp_ino); 16851e9ea7e0SNamjae Jeon iput_mirr_err_out: 16861e9ea7e0SNamjae Jeon iput(vol->mftmirr_ino); 16871e9ea7e0SNamjae Jeon return false; 16881e9ea7e0SNamjae Jeon } 16891e9ea7e0SNamjae Jeon 16906251f0b0SNamjae Jeon static void ntfs_volume_free(struct ntfs_volume *vol) 16916251f0b0SNamjae Jeon { 16926251f0b0SNamjae Jeon /* Throw away the table of attribute definitions. */ 16936251f0b0SNamjae Jeon vol->attrdef_size = 0; 16946251f0b0SNamjae Jeon if (vol->attrdef) { 16956251f0b0SNamjae Jeon kvfree(vol->attrdef); 16966251f0b0SNamjae Jeon vol->attrdef = NULL; 16976251f0b0SNamjae Jeon } 16986251f0b0SNamjae Jeon vol->upcase_len = 0; 16996251f0b0SNamjae Jeon /* 17006251f0b0SNamjae Jeon * Destroy the global default upcase table if necessary. Also decrease 17016251f0b0SNamjae Jeon * the number of upcase users if we are a user. 17026251f0b0SNamjae Jeon */ 17036251f0b0SNamjae Jeon mutex_lock(&ntfs_lock); 17046251f0b0SNamjae Jeon if (vol->upcase == default_upcase) { 17056251f0b0SNamjae Jeon ntfs_nr_upcase_users--; 17066251f0b0SNamjae Jeon vol->upcase = NULL; 17076251f0b0SNamjae Jeon } 17086251f0b0SNamjae Jeon 17096251f0b0SNamjae Jeon if (!ntfs_nr_upcase_users && default_upcase) { 17106251f0b0SNamjae Jeon kvfree(default_upcase); 17116251f0b0SNamjae Jeon default_upcase = NULL; 17126251f0b0SNamjae Jeon } 17136251f0b0SNamjae Jeon 17146251f0b0SNamjae Jeon free_compression_buffers(); 17156251f0b0SNamjae Jeon 17166251f0b0SNamjae Jeon mutex_unlock(&ntfs_lock); 17176251f0b0SNamjae Jeon if (vol->upcase) { 17186251f0b0SNamjae Jeon kvfree(vol->upcase); 17196251f0b0SNamjae Jeon vol->upcase = NULL; 17206251f0b0SNamjae Jeon } 17216251f0b0SNamjae Jeon 17226251f0b0SNamjae Jeon unload_nls(vol->nls_map); 17236251f0b0SNamjae Jeon 17246251f0b0SNamjae Jeon if (vol->lcn_empty_bits_per_page) 17256251f0b0SNamjae Jeon kvfree(vol->lcn_empty_bits_per_page); 17266251f0b0SNamjae Jeon kfree(vol->volume_label); 17276251f0b0SNamjae Jeon kfree(vol); 17286251f0b0SNamjae Jeon } 17296251f0b0SNamjae Jeon 17306251f0b0SNamjae Jeon /* 17311e9ea7e0SNamjae Jeon * ntfs_put_super - called by the vfs to unmount a volume 17321e9ea7e0SNamjae Jeon * @sb: vfs superblock of volume to unmount 17331e9ea7e0SNamjae Jeon */ 17341e9ea7e0SNamjae Jeon static void ntfs_put_super(struct super_block *sb) 17351e9ea7e0SNamjae Jeon { 17366251f0b0SNamjae Jeon struct ntfs_volume *vol = NTFS_SB(sb); 17371e9ea7e0SNamjae Jeon 17386251f0b0SNamjae Jeon pr_info("Entering %s, dev %s\n", __func__, sb->s_id); 17391e9ea7e0SNamjae Jeon 17406251f0b0SNamjae Jeon cancel_work_sync(&vol->precalc_work); 17416251f0b0SNamjae Jeon 17421e9ea7e0SNamjae Jeon /* 17431e9ea7e0SNamjae Jeon * Commit all inodes while they are still open in case some of them 17441e9ea7e0SNamjae Jeon * cause others to be dirtied. 17451e9ea7e0SNamjae Jeon */ 17461e9ea7e0SNamjae Jeon ntfs_commit_inode(vol->vol_ino); 17471e9ea7e0SNamjae Jeon 17481e9ea7e0SNamjae Jeon /* NTFS 3.0+ specific. */ 17491e9ea7e0SNamjae Jeon if (vol->major_ver >= 3) { 17501e9ea7e0SNamjae Jeon if (vol->quota_q_ino) 17511e9ea7e0SNamjae Jeon ntfs_commit_inode(vol->quota_q_ino); 17521e9ea7e0SNamjae Jeon if (vol->quota_ino) 17531e9ea7e0SNamjae Jeon ntfs_commit_inode(vol->quota_ino); 17541e9ea7e0SNamjae Jeon if (vol->extend_ino) 17551e9ea7e0SNamjae Jeon ntfs_commit_inode(vol->extend_ino); 17561e9ea7e0SNamjae Jeon if (vol->secure_ino) 17571e9ea7e0SNamjae Jeon ntfs_commit_inode(vol->secure_ino); 17581e9ea7e0SNamjae Jeon } 17591e9ea7e0SNamjae Jeon 17601e9ea7e0SNamjae Jeon ntfs_commit_inode(vol->root_ino); 17611e9ea7e0SNamjae Jeon 17621e9ea7e0SNamjae Jeon ntfs_commit_inode(vol->lcnbmp_ino); 17631e9ea7e0SNamjae Jeon 17646251f0b0SNamjae Jeon /* 17656251f0b0SNamjae Jeon * the GFP_NOFS scope is not needed because ntfs_commit_inode 17666251f0b0SNamjae Jeon * does nothing 17676251f0b0SNamjae Jeon */ 17681e9ea7e0SNamjae Jeon ntfs_commit_inode(vol->mftbmp_ino); 17691e9ea7e0SNamjae Jeon 17701e9ea7e0SNamjae Jeon if (vol->logfile_ino) 17711e9ea7e0SNamjae Jeon ntfs_commit_inode(vol->logfile_ino); 17721e9ea7e0SNamjae Jeon 17731e9ea7e0SNamjae Jeon if (vol->mftmirr_ino) 17741e9ea7e0SNamjae Jeon ntfs_commit_inode(vol->mftmirr_ino); 17751e9ea7e0SNamjae Jeon ntfs_commit_inode(vol->mft_ino); 17761e9ea7e0SNamjae Jeon 17771e9ea7e0SNamjae Jeon /* 17781e9ea7e0SNamjae Jeon * If a read-write mount and no volume errors have occurred, mark the 17791e9ea7e0SNamjae Jeon * volume clean. Also, re-commit all affected inodes. 17801e9ea7e0SNamjae Jeon */ 17811e9ea7e0SNamjae Jeon if (!sb_rdonly(sb)) { 17821e9ea7e0SNamjae Jeon if (!NVolErrors(vol)) { 17831e9ea7e0SNamjae Jeon if (ntfs_clear_volume_flags(vol, VOLUME_IS_DIRTY)) 17846251f0b0SNamjae Jeon ntfs_warning(sb, 17856251f0b0SNamjae Jeon "Failed to clear dirty bit in volume information flags. Run chkdsk."); 17861e9ea7e0SNamjae Jeon ntfs_commit_inode(vol->vol_ino); 17871e9ea7e0SNamjae Jeon ntfs_commit_inode(vol->root_ino); 17881e9ea7e0SNamjae Jeon if (vol->mftmirr_ino) 17891e9ea7e0SNamjae Jeon ntfs_commit_inode(vol->mftmirr_ino); 17901e9ea7e0SNamjae Jeon ntfs_commit_inode(vol->mft_ino); 17911e9ea7e0SNamjae Jeon } else { 17926251f0b0SNamjae Jeon ntfs_warning(sb, 17936251f0b0SNamjae Jeon "Volume has errors. Leaving volume marked dirty. Run chkdsk."); 17941e9ea7e0SNamjae Jeon } 17951e9ea7e0SNamjae Jeon } 17961e9ea7e0SNamjae Jeon 17971e9ea7e0SNamjae Jeon iput(vol->vol_ino); 17981e9ea7e0SNamjae Jeon vol->vol_ino = NULL; 17991e9ea7e0SNamjae Jeon 18001e9ea7e0SNamjae Jeon /* NTFS 3.0+ specific clean up. */ 18011e9ea7e0SNamjae Jeon if (vol->major_ver >= 3) { 18021e9ea7e0SNamjae Jeon if (vol->quota_q_ino) { 18031e9ea7e0SNamjae Jeon iput(vol->quota_q_ino); 18041e9ea7e0SNamjae Jeon vol->quota_q_ino = NULL; 18051e9ea7e0SNamjae Jeon } 18061e9ea7e0SNamjae Jeon if (vol->quota_ino) { 18071e9ea7e0SNamjae Jeon iput(vol->quota_ino); 18081e9ea7e0SNamjae Jeon vol->quota_ino = NULL; 18091e9ea7e0SNamjae Jeon } 18101e9ea7e0SNamjae Jeon if (vol->extend_ino) { 18111e9ea7e0SNamjae Jeon iput(vol->extend_ino); 18121e9ea7e0SNamjae Jeon vol->extend_ino = NULL; 18131e9ea7e0SNamjae Jeon } 18141e9ea7e0SNamjae Jeon if (vol->secure_ino) { 18151e9ea7e0SNamjae Jeon iput(vol->secure_ino); 18161e9ea7e0SNamjae Jeon vol->secure_ino = NULL; 18171e9ea7e0SNamjae Jeon } 18181e9ea7e0SNamjae Jeon } 18191e9ea7e0SNamjae Jeon 18201e9ea7e0SNamjae Jeon iput(vol->root_ino); 18211e9ea7e0SNamjae Jeon vol->root_ino = NULL; 18221e9ea7e0SNamjae Jeon 18231e9ea7e0SNamjae Jeon iput(vol->lcnbmp_ino); 18241e9ea7e0SNamjae Jeon vol->lcnbmp_ino = NULL; 18251e9ea7e0SNamjae Jeon 18261e9ea7e0SNamjae Jeon iput(vol->mftbmp_ino); 18271e9ea7e0SNamjae Jeon vol->mftbmp_ino = NULL; 18281e9ea7e0SNamjae Jeon 18291e9ea7e0SNamjae Jeon if (vol->logfile_ino) { 18301e9ea7e0SNamjae Jeon iput(vol->logfile_ino); 18311e9ea7e0SNamjae Jeon vol->logfile_ino = NULL; 18321e9ea7e0SNamjae Jeon } 18331e9ea7e0SNamjae Jeon if (vol->mftmirr_ino) { 18341e9ea7e0SNamjae Jeon /* Re-commit the mft mirror and mft just in case. */ 18351e9ea7e0SNamjae Jeon ntfs_commit_inode(vol->mftmirr_ino); 18361e9ea7e0SNamjae Jeon ntfs_commit_inode(vol->mft_ino); 18371e9ea7e0SNamjae Jeon iput(vol->mftmirr_ino); 18381e9ea7e0SNamjae Jeon vol->mftmirr_ino = NULL; 18391e9ea7e0SNamjae Jeon } 18401e9ea7e0SNamjae Jeon /* 18411e9ea7e0SNamjae Jeon * We should have no dirty inodes left, due to 18421e9ea7e0SNamjae Jeon * mft.c::ntfs_mft_writepage() cleaning all the dirty pages as 18431e9ea7e0SNamjae Jeon * the underlying mft records are written out and cleaned. 18441e9ea7e0SNamjae Jeon */ 18451e9ea7e0SNamjae Jeon ntfs_commit_inode(vol->mft_ino); 18461e9ea7e0SNamjae Jeon write_inode_now(vol->mft_ino, 1); 18471e9ea7e0SNamjae Jeon 18481e9ea7e0SNamjae Jeon iput(vol->mft_ino); 18491e9ea7e0SNamjae Jeon vol->mft_ino = NULL; 18506251f0b0SNamjae Jeon blkdev_issue_flush(sb->s_bdev); 18511e9ea7e0SNamjae Jeon 18526251f0b0SNamjae Jeon ntfs_volume_free(vol); 18531e9ea7e0SNamjae Jeon } 18546251f0b0SNamjae Jeon 18556251f0b0SNamjae Jeon int ntfs_force_shutdown(struct super_block *sb, u32 flags) 18566251f0b0SNamjae Jeon { 18576251f0b0SNamjae Jeon struct ntfs_volume *vol = NTFS_SB(sb); 18586251f0b0SNamjae Jeon int ret; 18596251f0b0SNamjae Jeon 18606251f0b0SNamjae Jeon if (NVolShutdown(vol)) 18616251f0b0SNamjae Jeon return 0; 18626251f0b0SNamjae Jeon 18636251f0b0SNamjae Jeon switch (flags) { 18646251f0b0SNamjae Jeon case FS_SHUTDOWN_FLAGS_DEFAULT: 18656251f0b0SNamjae Jeon case FS_SHUTDOWN_FLAGS_LOGFLUSH: 18666251f0b0SNamjae Jeon ret = bdev_freeze(sb->s_bdev); 18676251f0b0SNamjae Jeon if (ret) 18686251f0b0SNamjae Jeon return ret; 18696251f0b0SNamjae Jeon bdev_thaw(sb->s_bdev); 18706251f0b0SNamjae Jeon NVolSetShutdown(vol); 18716251f0b0SNamjae Jeon break; 18726251f0b0SNamjae Jeon case FS_SHUTDOWN_FLAGS_NOLOGFLUSH: 18736251f0b0SNamjae Jeon NVolSetShutdown(vol); 18746251f0b0SNamjae Jeon break; 18756251f0b0SNamjae Jeon default: 18766251f0b0SNamjae Jeon return -EINVAL; 18776251f0b0SNamjae Jeon } 18786251f0b0SNamjae Jeon 18796251f0b0SNamjae Jeon return 0; 18806251f0b0SNamjae Jeon } 18816251f0b0SNamjae Jeon 18826251f0b0SNamjae Jeon static void ntfs_shutdown(struct super_block *sb) 18836251f0b0SNamjae Jeon { 18846251f0b0SNamjae Jeon ntfs_force_shutdown(sb, FS_SHUTDOWN_FLAGS_NOLOGFLUSH); 18856251f0b0SNamjae Jeon 18866251f0b0SNamjae Jeon } 18876251f0b0SNamjae Jeon 18886251f0b0SNamjae Jeon static int ntfs_sync_fs(struct super_block *sb, int wait) 18896251f0b0SNamjae Jeon { 18906251f0b0SNamjae Jeon struct ntfs_volume *vol = NTFS_SB(sb); 18916251f0b0SNamjae Jeon int err = 0; 18926251f0b0SNamjae Jeon 18936251f0b0SNamjae Jeon if (NVolShutdown(vol)) 18946251f0b0SNamjae Jeon return -EIO; 18956251f0b0SNamjae Jeon 18966251f0b0SNamjae Jeon if (!wait) 18976251f0b0SNamjae Jeon return 0; 18986251f0b0SNamjae Jeon 18996251f0b0SNamjae Jeon /* If there are some dirty buffers in the bdev inode */ 19006251f0b0SNamjae Jeon if (ntfs_clear_volume_flags(vol, VOLUME_IS_DIRTY)) { 19016251f0b0SNamjae Jeon ntfs_warning(sb, "Failed to clear dirty bit in volume information flags. Run chkdsk."); 19026251f0b0SNamjae Jeon err = -EIO; 19036251f0b0SNamjae Jeon } 19046251f0b0SNamjae Jeon sync_inodes_sb(sb); 19056251f0b0SNamjae Jeon sync_blockdev(sb->s_bdev); 19066251f0b0SNamjae Jeon blkdev_issue_flush(sb->s_bdev); 19076251f0b0SNamjae Jeon return err; 19086251f0b0SNamjae Jeon } 19096251f0b0SNamjae Jeon 19101e9ea7e0SNamjae Jeon /* 19111e9ea7e0SNamjae Jeon * get_nr_free_clusters - return the number of free clusters on a volume 19121e9ea7e0SNamjae Jeon * @vol: ntfs volume for which to obtain free cluster count 19131e9ea7e0SNamjae Jeon * 19141e9ea7e0SNamjae Jeon * Calculate the number of free clusters on the mounted NTFS volume @vol. We 19151e9ea7e0SNamjae Jeon * actually calculate the number of clusters in use instead because this 19161e9ea7e0SNamjae Jeon * allows us to not care about partial pages as these will be just zero filled 19171e9ea7e0SNamjae Jeon * and hence not be counted as allocated clusters. 19181e9ea7e0SNamjae Jeon * 19191e9ea7e0SNamjae Jeon * The only particularity is that clusters beyond the end of the logical ntfs 19201e9ea7e0SNamjae Jeon * volume will be marked as allocated to prevent errors which means we have to 19211e9ea7e0SNamjae Jeon * discount those at the end. This is important as the cluster bitmap always 19221e9ea7e0SNamjae Jeon * has a size in multiples of 8 bytes, i.e. up to 63 clusters could be outside 19231e9ea7e0SNamjae Jeon * the logical volume and marked in use when they are not as they do not exist. 19241e9ea7e0SNamjae Jeon * 19251e9ea7e0SNamjae Jeon * If any pages cannot be read we assume all clusters in the erroring pages are 19261e9ea7e0SNamjae Jeon * in use. This means we return an underestimate on errors which is better than 19271e9ea7e0SNamjae Jeon * an overestimate. 19281e9ea7e0SNamjae Jeon */ 19296251f0b0SNamjae Jeon s64 get_nr_free_clusters(struct ntfs_volume *vol) 19301e9ea7e0SNamjae Jeon { 19311e9ea7e0SNamjae Jeon s64 nr_free = vol->nr_clusters; 19326251f0b0SNamjae Jeon u32 nr_used; 19331e9ea7e0SNamjae Jeon struct address_space *mapping = vol->lcnbmp_ino->i_mapping; 19346251f0b0SNamjae Jeon struct folio *folio; 19351e9ea7e0SNamjae Jeon pgoff_t index, max_index; 19366251f0b0SNamjae Jeon struct file_ra_state *ra; 19371e9ea7e0SNamjae Jeon 19381e9ea7e0SNamjae Jeon ntfs_debug("Entering."); 19391e9ea7e0SNamjae Jeon /* Serialize accesses to the cluster bitmap. */ 19406251f0b0SNamjae Jeon 19416251f0b0SNamjae Jeon if (NVolFreeClusterKnown(vol)) 19426251f0b0SNamjae Jeon return atomic64_read(&vol->free_clusters); 19436251f0b0SNamjae Jeon 19446251f0b0SNamjae Jeon ra = kzalloc(sizeof(*ra), GFP_NOFS); 19456251f0b0SNamjae Jeon if (!ra) 19466251f0b0SNamjae Jeon return 0; 19476251f0b0SNamjae Jeon 19486251f0b0SNamjae Jeon file_ra_state_init(ra, mapping); 19496251f0b0SNamjae Jeon 19501e9ea7e0SNamjae Jeon /* 19511e9ea7e0SNamjae Jeon * Convert the number of bits into bytes rounded up, then convert into 19521e9ea7e0SNamjae Jeon * multiples of PAGE_SIZE, rounding up so that if we have one 19531e9ea7e0SNamjae Jeon * full and one partial page max_index = 2. 19541e9ea7e0SNamjae Jeon */ 19551e9ea7e0SNamjae Jeon max_index = (((vol->nr_clusters + 7) >> 3) + PAGE_SIZE - 1) >> 19561e9ea7e0SNamjae Jeon PAGE_SHIFT; 19571e9ea7e0SNamjae Jeon /* Use multiples of 4 bytes, thus max_size is PAGE_SIZE / 4. */ 19581e9ea7e0SNamjae Jeon ntfs_debug("Reading $Bitmap, max_index = 0x%lx, max_size = 0x%lx.", 19591e9ea7e0SNamjae Jeon max_index, PAGE_SIZE / 4); 19601e9ea7e0SNamjae Jeon for (index = 0; index < max_index; index++) { 19611e9ea7e0SNamjae Jeon unsigned long *kaddr; 19621e9ea7e0SNamjae Jeon 19631e9ea7e0SNamjae Jeon /* 19646251f0b0SNamjae Jeon * Get folio from page cache, getting it from backing store 19651e9ea7e0SNamjae Jeon * if necessary, and increment the use count. 19661e9ea7e0SNamjae Jeon */ 19676251f0b0SNamjae Jeon folio = ntfs_get_locked_folio(mapping, index, max_index, ra); 19686251f0b0SNamjae Jeon 19691e9ea7e0SNamjae Jeon /* Ignore pages which errored synchronously. */ 19706251f0b0SNamjae Jeon if (IS_ERR(folio)) { 19716251f0b0SNamjae Jeon ntfs_debug("Skipping page (index 0x%lx).", index); 19721e9ea7e0SNamjae Jeon nr_free -= PAGE_SIZE * 8; 19736251f0b0SNamjae Jeon vol->lcn_empty_bits_per_page[index] = 0; 19741e9ea7e0SNamjae Jeon continue; 19751e9ea7e0SNamjae Jeon } 19766251f0b0SNamjae Jeon 19776251f0b0SNamjae Jeon kaddr = kmap_local_folio(folio, 0); 19781e9ea7e0SNamjae Jeon /* 19791e9ea7e0SNamjae Jeon * Subtract the number of set bits. If this 19801e9ea7e0SNamjae Jeon * is the last page and it is partial we don't really care as 19811e9ea7e0SNamjae Jeon * it just means we do a little extra work but it won't affect 19821e9ea7e0SNamjae Jeon * the result as all out of range bytes are set to zero by 19831e9ea7e0SNamjae Jeon * ntfs_readpage(). 19841e9ea7e0SNamjae Jeon */ 19856251f0b0SNamjae Jeon nr_used = bitmap_weight(kaddr, PAGE_SIZE * BITS_PER_BYTE); 19866251f0b0SNamjae Jeon nr_free -= nr_used; 19876251f0b0SNamjae Jeon vol->lcn_empty_bits_per_page[index] = PAGE_SIZE * BITS_PER_BYTE - nr_used; 19886251f0b0SNamjae Jeon kunmap_local(kaddr); 19896251f0b0SNamjae Jeon folio_unlock(folio); 19906251f0b0SNamjae Jeon folio_put(folio); 19911e9ea7e0SNamjae Jeon } 19921e9ea7e0SNamjae Jeon ntfs_debug("Finished reading $Bitmap, last index = 0x%lx.", index - 1); 19931e9ea7e0SNamjae Jeon /* 19941e9ea7e0SNamjae Jeon * Fixup for eventual bits outside logical ntfs volume (see function 19951e9ea7e0SNamjae Jeon * description above). 19961e9ea7e0SNamjae Jeon */ 19971e9ea7e0SNamjae Jeon if (vol->nr_clusters & 63) 19981e9ea7e0SNamjae Jeon nr_free += 64 - (vol->nr_clusters & 63); 19996251f0b0SNamjae Jeon 20001e9ea7e0SNamjae Jeon /* If errors occurred we may well have gone below zero, fix this. */ 20011e9ea7e0SNamjae Jeon if (nr_free < 0) 20021e9ea7e0SNamjae Jeon nr_free = 0; 20036251f0b0SNamjae Jeon else 20046251f0b0SNamjae Jeon atomic64_set(&vol->free_clusters, nr_free); 20056251f0b0SNamjae Jeon 20066251f0b0SNamjae Jeon kfree(ra); 20076251f0b0SNamjae Jeon NVolSetFreeClusterKnown(vol); 20086251f0b0SNamjae Jeon wake_up_all(&vol->free_waitq); 20091e9ea7e0SNamjae Jeon ntfs_debug("Exiting."); 20101e9ea7e0SNamjae Jeon return nr_free; 20111e9ea7e0SNamjae Jeon } 20121e9ea7e0SNamjae Jeon 20136251f0b0SNamjae Jeon /* 20146251f0b0SNamjae Jeon * @nr_clusters is the number of clusters requested for allocation. 20156251f0b0SNamjae Jeon * 20166251f0b0SNamjae Jeon * Return the number of clusters available for allocation within 20176251f0b0SNamjae Jeon * the range of @nr_clusters, which is counts that considered 20186251f0b0SNamjae Jeon * for delayed allocation. 20196251f0b0SNamjae Jeon */ 20206251f0b0SNamjae Jeon s64 ntfs_available_clusters_count(struct ntfs_volume *vol, s64 nr_clusters) 20216251f0b0SNamjae Jeon { 20226251f0b0SNamjae Jeon s64 free_clusters; 20236251f0b0SNamjae Jeon 20246251f0b0SNamjae Jeon /* wait event */ 20256251f0b0SNamjae Jeon if (!NVolFreeClusterKnown(vol)) 20266251f0b0SNamjae Jeon wait_event(vol->free_waitq, NVolFreeClusterKnown(vol)); 20276251f0b0SNamjae Jeon 20286251f0b0SNamjae Jeon free_clusters = atomic64_read(&vol->free_clusters) - 20296251f0b0SNamjae Jeon atomic64_read(&vol->dirty_clusters); 20306251f0b0SNamjae Jeon if (free_clusters <= 0) 20316251f0b0SNamjae Jeon return -ENOSPC; 20326251f0b0SNamjae Jeon else if (free_clusters < nr_clusters) 20336251f0b0SNamjae Jeon nr_clusters = free_clusters; 20346251f0b0SNamjae Jeon 20356251f0b0SNamjae Jeon return nr_clusters; 20366251f0b0SNamjae Jeon } 20376251f0b0SNamjae Jeon 20386251f0b0SNamjae Jeon /* 20391e9ea7e0SNamjae Jeon * __get_nr_free_mft_records - return the number of free inodes on a volume 20401e9ea7e0SNamjae Jeon * @vol: ntfs volume for which to obtain free inode count 20411e9ea7e0SNamjae Jeon * @nr_free: number of mft records in filesystem 20421e9ea7e0SNamjae Jeon * @max_index: maximum number of pages containing set bits 20431e9ea7e0SNamjae Jeon * 20441e9ea7e0SNamjae Jeon * Calculate the number of free mft records (inodes) on the mounted NTFS 20451e9ea7e0SNamjae Jeon * volume @vol. We actually calculate the number of mft records in use instead 20461e9ea7e0SNamjae Jeon * because this allows us to not care about partial pages as these will be just 20471e9ea7e0SNamjae Jeon * zero filled and hence not be counted as allocated mft record. 20481e9ea7e0SNamjae Jeon * 20491e9ea7e0SNamjae Jeon * If any pages cannot be read we assume all mft records in the erroring pages 20501e9ea7e0SNamjae Jeon * are in use. This means we return an underestimate on errors which is better 20511e9ea7e0SNamjae Jeon * than an overestimate. 20521e9ea7e0SNamjae Jeon * 20531e9ea7e0SNamjae Jeon * NOTE: Caller must hold mftbmp_lock rw_semaphore for reading or writing. 20541e9ea7e0SNamjae Jeon */ 20556251f0b0SNamjae Jeon static unsigned long __get_nr_free_mft_records(struct ntfs_volume *vol, 20561e9ea7e0SNamjae Jeon s64 nr_free, const pgoff_t max_index) 20571e9ea7e0SNamjae Jeon { 20581e9ea7e0SNamjae Jeon struct address_space *mapping = vol->mftbmp_ino->i_mapping; 20596251f0b0SNamjae Jeon struct folio *folio; 20601e9ea7e0SNamjae Jeon pgoff_t index; 20616251f0b0SNamjae Jeon struct file_ra_state *ra; 20621e9ea7e0SNamjae Jeon 20631e9ea7e0SNamjae Jeon ntfs_debug("Entering."); 20646251f0b0SNamjae Jeon 20656251f0b0SNamjae Jeon ra = kzalloc(sizeof(*ra), GFP_NOFS); 20666251f0b0SNamjae Jeon if (!ra) 20676251f0b0SNamjae Jeon return 0; 20686251f0b0SNamjae Jeon 20696251f0b0SNamjae Jeon file_ra_state_init(ra, mapping); 20706251f0b0SNamjae Jeon 20711e9ea7e0SNamjae Jeon /* Use multiples of 4 bytes, thus max_size is PAGE_SIZE / 4. */ 20726251f0b0SNamjae Jeon ntfs_debug("Reading $MFT/$BITMAP, max_index = 0x%lx, max_size = 0x%lx.", 20736251f0b0SNamjae Jeon max_index, PAGE_SIZE / 4); 20741e9ea7e0SNamjae Jeon for (index = 0; index < max_index; index++) { 20751e9ea7e0SNamjae Jeon unsigned long *kaddr; 20761e9ea7e0SNamjae Jeon 20771e9ea7e0SNamjae Jeon /* 20786251f0b0SNamjae Jeon * Get folio from page cache, getting it from backing store 20791e9ea7e0SNamjae Jeon * if necessary, and increment the use count. 20801e9ea7e0SNamjae Jeon */ 20816251f0b0SNamjae Jeon folio = ntfs_get_locked_folio(mapping, index, max_index, ra); 20826251f0b0SNamjae Jeon 20831e9ea7e0SNamjae Jeon /* Ignore pages which errored synchronously. */ 20846251f0b0SNamjae Jeon if (IS_ERR(folio)) { 20856251f0b0SNamjae Jeon ntfs_debug("read_mapping_page() error. Skipping page (index 0x%lx).", 20866251f0b0SNamjae Jeon index); 20871e9ea7e0SNamjae Jeon nr_free -= PAGE_SIZE * 8; 20881e9ea7e0SNamjae Jeon continue; 20891e9ea7e0SNamjae Jeon } 20906251f0b0SNamjae Jeon 20916251f0b0SNamjae Jeon kaddr = kmap_local_folio(folio, 0); 20921e9ea7e0SNamjae Jeon /* 20931e9ea7e0SNamjae Jeon * Subtract the number of set bits. If this 20941e9ea7e0SNamjae Jeon * is the last page and it is partial we don't really care as 20951e9ea7e0SNamjae Jeon * it just means we do a little extra work but it won't affect 20961e9ea7e0SNamjae Jeon * the result as all out of range bytes are set to zero by 20971e9ea7e0SNamjae Jeon * ntfs_readpage(). 20981e9ea7e0SNamjae Jeon */ 20991e9ea7e0SNamjae Jeon nr_free -= bitmap_weight(kaddr, 21001e9ea7e0SNamjae Jeon PAGE_SIZE * BITS_PER_BYTE); 21016251f0b0SNamjae Jeon kunmap_local(kaddr); 21026251f0b0SNamjae Jeon folio_unlock(folio); 21036251f0b0SNamjae Jeon folio_put(folio); 21041e9ea7e0SNamjae Jeon } 21051e9ea7e0SNamjae Jeon ntfs_debug("Finished reading $MFT/$BITMAP, last index = 0x%lx.", 21061e9ea7e0SNamjae Jeon index - 1); 21071e9ea7e0SNamjae Jeon /* If errors occurred we may well have gone below zero, fix this. */ 21081e9ea7e0SNamjae Jeon if (nr_free < 0) 21091e9ea7e0SNamjae Jeon nr_free = 0; 21106251f0b0SNamjae Jeon else 21116251f0b0SNamjae Jeon atomic64_set(&vol->free_mft_records, nr_free); 21126251f0b0SNamjae Jeon 21136251f0b0SNamjae Jeon kfree(ra); 21141e9ea7e0SNamjae Jeon ntfs_debug("Exiting."); 21151e9ea7e0SNamjae Jeon return nr_free; 21161e9ea7e0SNamjae Jeon } 21171e9ea7e0SNamjae Jeon 21186251f0b0SNamjae Jeon /* 21191e9ea7e0SNamjae Jeon * ntfs_statfs - return information about mounted NTFS volume 21201e9ea7e0SNamjae Jeon * @dentry: dentry from mounted volume 21211e9ea7e0SNamjae Jeon * @sfs: statfs structure in which to return the information 21221e9ea7e0SNamjae Jeon * 21231e9ea7e0SNamjae Jeon * Return information about the mounted NTFS volume @dentry in the statfs structure 21241e9ea7e0SNamjae Jeon * pointed to by @sfs (this is initialized with zeros before ntfs_statfs is 21251e9ea7e0SNamjae Jeon * called). We interpret the values to be correct of the moment in time at 21261e9ea7e0SNamjae Jeon * which we are called. Most values are variable otherwise and this isn't just 21271e9ea7e0SNamjae Jeon * the free values but the totals as well. For example we can increase the 21281e9ea7e0SNamjae Jeon * total number of file nodes if we run out and we can keep doing this until 21291e9ea7e0SNamjae Jeon * there is no more space on the volume left at all. 21301e9ea7e0SNamjae Jeon * 21311e9ea7e0SNamjae Jeon * Called from vfs_statfs which is used to handle the statfs, fstatfs, and 21321e9ea7e0SNamjae Jeon * ustat system calls. 21331e9ea7e0SNamjae Jeon * 21341e9ea7e0SNamjae Jeon * Return 0 on success or -errno on error. 21351e9ea7e0SNamjae Jeon */ 21361e9ea7e0SNamjae Jeon static int ntfs_statfs(struct dentry *dentry, struct kstatfs *sfs) 21371e9ea7e0SNamjae Jeon { 21381e9ea7e0SNamjae Jeon struct super_block *sb = dentry->d_sb; 21391e9ea7e0SNamjae Jeon s64 size; 21406251f0b0SNamjae Jeon struct ntfs_volume *vol = NTFS_SB(sb); 21416251f0b0SNamjae Jeon struct ntfs_inode *mft_ni = NTFS_I(vol->mft_ino); 21421e9ea7e0SNamjae Jeon unsigned long flags; 21431e9ea7e0SNamjae Jeon 21441e9ea7e0SNamjae Jeon ntfs_debug("Entering."); 21451e9ea7e0SNamjae Jeon /* Type of filesystem. */ 21461e9ea7e0SNamjae Jeon sfs->f_type = NTFS_SB_MAGIC; 21471e9ea7e0SNamjae Jeon /* Optimal transfer block size. */ 21486251f0b0SNamjae Jeon sfs->f_bsize = vol->cluster_size; 21496251f0b0SNamjae Jeon /* Fundamental file system block size, used as the unit. */ 21506251f0b0SNamjae Jeon sfs->f_frsize = vol->cluster_size; 21516251f0b0SNamjae Jeon 21521e9ea7e0SNamjae Jeon /* 21531e9ea7e0SNamjae Jeon * Total data blocks in filesystem in units of f_bsize and since 21541e9ea7e0SNamjae Jeon * inodes are also stored in data blocs ($MFT is a file) this is just 21551e9ea7e0SNamjae Jeon * the total clusters. 21561e9ea7e0SNamjae Jeon */ 21576251f0b0SNamjae Jeon sfs->f_blocks = vol->nr_clusters; 21586251f0b0SNamjae Jeon 21596251f0b0SNamjae Jeon /* wait event */ 21606251f0b0SNamjae Jeon if (!NVolFreeClusterKnown(vol)) 21616251f0b0SNamjae Jeon wait_event(vol->free_waitq, NVolFreeClusterKnown(vol)); 21626251f0b0SNamjae Jeon 21631e9ea7e0SNamjae Jeon /* Free data blocks in filesystem in units of f_bsize. */ 21646251f0b0SNamjae Jeon size = atomic64_read(&vol->free_clusters) - 21656251f0b0SNamjae Jeon atomic64_read(&vol->dirty_clusters); 21661e9ea7e0SNamjae Jeon if (size < 0LL) 21671e9ea7e0SNamjae Jeon size = 0LL; 21686251f0b0SNamjae Jeon 21691e9ea7e0SNamjae Jeon /* Free blocks avail to non-superuser, same as above on NTFS. */ 21701e9ea7e0SNamjae Jeon sfs->f_bavail = sfs->f_bfree = size; 21716251f0b0SNamjae Jeon 21721e9ea7e0SNamjae Jeon /* Number of inodes in filesystem (at this point in time). */ 21736251f0b0SNamjae Jeon read_lock_irqsave(&mft_ni->size_lock, flags); 21746251f0b0SNamjae Jeon sfs->f_files = i_size_read(vol->mft_ino) >> vol->mft_record_size_bits; 21756251f0b0SNamjae Jeon read_unlock_irqrestore(&mft_ni->size_lock, flags); 21766251f0b0SNamjae Jeon 21771e9ea7e0SNamjae Jeon /* Free inodes in fs (based on current total count). */ 21786251f0b0SNamjae Jeon sfs->f_ffree = atomic64_read(&vol->free_mft_records); 21796251f0b0SNamjae Jeon 21801e9ea7e0SNamjae Jeon /* 21811e9ea7e0SNamjae Jeon * File system id. This is extremely *nix flavour dependent and even 21821e9ea7e0SNamjae Jeon * within Linux itself all fs do their own thing. I interpret this to 21831e9ea7e0SNamjae Jeon * mean a unique id associated with the mounted fs and not the id 21841e9ea7e0SNamjae Jeon * associated with the filesystem driver, the latter is already given 21851e9ea7e0SNamjae Jeon * by the filesystem type in sfs->f_type. Thus we use the 64-bit 21861e9ea7e0SNamjae Jeon * volume serial number splitting it into two 32-bit parts. We enter 21871e9ea7e0SNamjae Jeon * the least significant 32-bits in f_fsid[0] and the most significant 21881e9ea7e0SNamjae Jeon * 32-bits in f_fsid[1]. 21891e9ea7e0SNamjae Jeon */ 21901e9ea7e0SNamjae Jeon sfs->f_fsid = u64_to_fsid(vol->serial_no); 21911e9ea7e0SNamjae Jeon /* Maximum length of filenames. */ 21921e9ea7e0SNamjae Jeon sfs->f_namelen = NTFS_MAX_NAME_LEN; 21936251f0b0SNamjae Jeon 21941e9ea7e0SNamjae Jeon return 0; 21951e9ea7e0SNamjae Jeon } 21961e9ea7e0SNamjae Jeon 21971e9ea7e0SNamjae Jeon static int ntfs_write_inode(struct inode *vi, struct writeback_control *wbc) 21981e9ea7e0SNamjae Jeon { 21991e9ea7e0SNamjae Jeon return __ntfs_write_inode(vi, wbc->sync_mode == WB_SYNC_ALL); 22001e9ea7e0SNamjae Jeon } 22011e9ea7e0SNamjae Jeon 22021e9ea7e0SNamjae Jeon /* 22031e9ea7e0SNamjae Jeon * The complete super operations. 22041e9ea7e0SNamjae Jeon */ 22051e9ea7e0SNamjae Jeon static const struct super_operations ntfs_sops = { 22061e9ea7e0SNamjae Jeon .alloc_inode = ntfs_alloc_big_inode, /* VFS: Allocate new inode. */ 22071e9ea7e0SNamjae Jeon .free_inode = ntfs_free_big_inode, /* VFS: Deallocate inode. */ 22086251f0b0SNamjae Jeon .drop_inode = ntfs_drop_big_inode, 22096251f0b0SNamjae Jeon .write_inode = ntfs_write_inode, /* VFS: Write dirty inode to disk. */ 22101e9ea7e0SNamjae Jeon .put_super = ntfs_put_super, /* Syscall: umount. */ 22116251f0b0SNamjae Jeon .shutdown = ntfs_shutdown, 22126251f0b0SNamjae Jeon .sync_fs = ntfs_sync_fs, /* Syscall: sync. */ 22131e9ea7e0SNamjae Jeon .statfs = ntfs_statfs, /* Syscall: statfs */ 22146251f0b0SNamjae Jeon .evict_inode = ntfs_evict_big_inode, 22156251f0b0SNamjae Jeon .show_options = ntfs_show_options, /* Show mount options in proc. */ 22161e9ea7e0SNamjae Jeon }; 22171e9ea7e0SNamjae Jeon 22186251f0b0SNamjae Jeon static void precalc_free_clusters(struct work_struct *work) 22196251f0b0SNamjae Jeon { 22206251f0b0SNamjae Jeon struct ntfs_volume *vol = container_of(work, struct ntfs_volume, precalc_work); 22216251f0b0SNamjae Jeon s64 nr_free; 22226251f0b0SNamjae Jeon 22236251f0b0SNamjae Jeon nr_free = get_nr_free_clusters(vol); 22246251f0b0SNamjae Jeon 22256251f0b0SNamjae Jeon ntfs_debug("pre-calculate free clusters(%lld) using workqueue", 22266251f0b0SNamjae Jeon nr_free); 22276251f0b0SNamjae Jeon } 22286251f0b0SNamjae Jeon 22296251f0b0SNamjae Jeon static struct lock_class_key ntfs_mft_inval_lock_key; 22306251f0b0SNamjae Jeon 22316251f0b0SNamjae Jeon /* 22321e9ea7e0SNamjae Jeon * ntfs_fill_super - mount an ntfs filesystem 22336251f0b0SNamjae Jeon * @sb: super block of the device to mount 22346251f0b0SNamjae Jeon * @fc: filesystem context containing mount options 22351e9ea7e0SNamjae Jeon * 22361e9ea7e0SNamjae Jeon * ntfs_fill_super() is called by the VFS to mount the device described by @sb 22371e9ea7e0SNamjae Jeon * with the mount otions in @data with the NTFS filesystem. 22381e9ea7e0SNamjae Jeon * 22391e9ea7e0SNamjae Jeon * If @silent is true, remain silent even if errors are detected. This is used 22401e9ea7e0SNamjae Jeon * during bootup, when the kernel tries to mount the root filesystem with all 22411e9ea7e0SNamjae Jeon * registered filesystems one after the other until one succeeds. This implies 22421e9ea7e0SNamjae Jeon * that all filesystems except the correct one will quite correctly and 22431e9ea7e0SNamjae Jeon * expectedly return an error, but nobody wants to see error messages when in 22441e9ea7e0SNamjae Jeon * fact this is what is supposed to happen. 22451e9ea7e0SNamjae Jeon */ 22466251f0b0SNamjae Jeon static int ntfs_fill_super(struct super_block *sb, struct fs_context *fc) 22471e9ea7e0SNamjae Jeon { 22486251f0b0SNamjae Jeon char *boot; 22491e9ea7e0SNamjae Jeon struct inode *tmp_ino; 22501e9ea7e0SNamjae Jeon int blocksize, result; 22516251f0b0SNamjae Jeon pgoff_t lcn_bit_pages; 22526251f0b0SNamjae Jeon struct ntfs_volume *vol = NTFS_SB(sb); 22536251f0b0SNamjae Jeon int silent = fc->sb_flags & SB_SILENT; 22546251f0b0SNamjae Jeon 22556251f0b0SNamjae Jeon vol->sb = sb; 22561e9ea7e0SNamjae Jeon 22571e9ea7e0SNamjae Jeon /* 22581e9ea7e0SNamjae Jeon * We do a pretty difficult piece of bootstrap by reading the 22591e9ea7e0SNamjae Jeon * MFT (and other metadata) from disk into memory. We'll only 22601e9ea7e0SNamjae Jeon * release this metadata during umount, so the locking patterns 22611e9ea7e0SNamjae Jeon * observed during bootstrap do not count. So turn off the 22621e9ea7e0SNamjae Jeon * observation of locking patterns (strictly for this context 22631e9ea7e0SNamjae Jeon * only) while mounting NTFS. [The validator is still active 22641e9ea7e0SNamjae Jeon * otherwise, even for this context: it will for example record 22651e9ea7e0SNamjae Jeon * lock class registrations.] 22661e9ea7e0SNamjae Jeon */ 22671e9ea7e0SNamjae Jeon lockdep_off(); 22681e9ea7e0SNamjae Jeon ntfs_debug("Entering."); 22696251f0b0SNamjae Jeon 22706251f0b0SNamjae Jeon if (vol->nls_map && !strcmp(vol->nls_map->charset, "utf8")) 22716251f0b0SNamjae Jeon vol->nls_utf8 = true; 22726251f0b0SNamjae Jeon if (NVolDisableSparse(vol)) 22736251f0b0SNamjae Jeon vol->preallocated_size = 0; 22746251f0b0SNamjae Jeon 22756251f0b0SNamjae Jeon if (NVolDiscard(vol) && !bdev_max_discard_sectors(sb->s_bdev)) { 22766251f0b0SNamjae Jeon ntfs_warning( 22776251f0b0SNamjae Jeon sb, 22786251f0b0SNamjae Jeon "Discard requested but device does not support discard. Discard disabled."); 22796251f0b0SNamjae Jeon NVolClearDiscard(vol); 22801e9ea7e0SNamjae Jeon } 22811e9ea7e0SNamjae Jeon 22821e9ea7e0SNamjae Jeon /* We support sector sizes up to the PAGE_SIZE. */ 22831e9ea7e0SNamjae Jeon if (bdev_logical_block_size(sb->s_bdev) > PAGE_SIZE) { 22841e9ea7e0SNamjae Jeon if (!silent) 22856251f0b0SNamjae Jeon ntfs_error(sb, 22866251f0b0SNamjae Jeon "Device has unsupported sector size (%i). The maximum supported sector size on this architecture is %lu bytes.", 22871e9ea7e0SNamjae Jeon bdev_logical_block_size(sb->s_bdev), 22881e9ea7e0SNamjae Jeon PAGE_SIZE); 22891e9ea7e0SNamjae Jeon goto err_out_now; 22901e9ea7e0SNamjae Jeon } 22916251f0b0SNamjae Jeon 22921e9ea7e0SNamjae Jeon /* 22931e9ea7e0SNamjae Jeon * Setup the device access block size to NTFS_BLOCK_SIZE or the hard 22941e9ea7e0SNamjae Jeon * sector size, whichever is bigger. 22951e9ea7e0SNamjae Jeon */ 22961e9ea7e0SNamjae Jeon blocksize = sb_min_blocksize(sb, NTFS_BLOCK_SIZE); 22971e9ea7e0SNamjae Jeon if (blocksize < NTFS_BLOCK_SIZE) { 22981e9ea7e0SNamjae Jeon if (!silent) 22991e9ea7e0SNamjae Jeon ntfs_error(sb, "Unable to set device block size."); 23001e9ea7e0SNamjae Jeon goto err_out_now; 23011e9ea7e0SNamjae Jeon } 23026251f0b0SNamjae Jeon 23031e9ea7e0SNamjae Jeon ntfs_debug("Set device block size to %i bytes (block size bits %i).", 23041e9ea7e0SNamjae Jeon blocksize, sb->s_blocksize_bits); 23051e9ea7e0SNamjae Jeon /* Determine the size of the device in units of block_size bytes. */ 23066251f0b0SNamjae Jeon if (!bdev_nr_bytes(sb->s_bdev)) { 23071e9ea7e0SNamjae Jeon if (!silent) 23081e9ea7e0SNamjae Jeon ntfs_error(sb, "Unable to determine device size."); 23091e9ea7e0SNamjae Jeon goto err_out_now; 23101e9ea7e0SNamjae Jeon } 23116251f0b0SNamjae Jeon vol->nr_blocks = bdev_nr_bytes(sb->s_bdev) >> 23126251f0b0SNamjae Jeon sb->s_blocksize_bits; 23131e9ea7e0SNamjae Jeon /* Read the boot sector and return unlocked buffer head to it. */ 23146251f0b0SNamjae Jeon boot = read_ntfs_boot_sector(sb, silent); 23156251f0b0SNamjae Jeon if (!boot) { 23161e9ea7e0SNamjae Jeon if (!silent) 23171e9ea7e0SNamjae Jeon ntfs_error(sb, "Not an NTFS volume."); 23181e9ea7e0SNamjae Jeon goto err_out_now; 23191e9ea7e0SNamjae Jeon } 23201e9ea7e0SNamjae Jeon /* 23211e9ea7e0SNamjae Jeon * Extract the data from the boot sector and setup the ntfs volume 23221e9ea7e0SNamjae Jeon * using it. 23231e9ea7e0SNamjae Jeon */ 23246251f0b0SNamjae Jeon result = parse_ntfs_boot_sector(vol, (struct ntfs_boot_sector *)boot); 23256251f0b0SNamjae Jeon kfree(boot); 23261e9ea7e0SNamjae Jeon if (!result) { 23271e9ea7e0SNamjae Jeon if (!silent) 23281e9ea7e0SNamjae Jeon ntfs_error(sb, "Unsupported NTFS filesystem."); 23291e9ea7e0SNamjae Jeon goto err_out_now; 23301e9ea7e0SNamjae Jeon } 23316251f0b0SNamjae Jeon 23321e9ea7e0SNamjae Jeon if (vol->sector_size > blocksize) { 23331e9ea7e0SNamjae Jeon blocksize = sb_set_blocksize(sb, vol->sector_size); 23341e9ea7e0SNamjae Jeon if (blocksize != vol->sector_size) { 23351e9ea7e0SNamjae Jeon if (!silent) 23366251f0b0SNamjae Jeon ntfs_error(sb, 23376251f0b0SNamjae Jeon "Unable to set device block size to sector size (%i).", 23381e9ea7e0SNamjae Jeon vol->sector_size); 23391e9ea7e0SNamjae Jeon goto err_out_now; 23401e9ea7e0SNamjae Jeon } 23416251f0b0SNamjae Jeon vol->nr_blocks = bdev_nr_bytes(sb->s_bdev) >> 23426251f0b0SNamjae Jeon sb->s_blocksize_bits; 23436251f0b0SNamjae Jeon ntfs_debug("Changed device block size to %i bytes (block size bits %i) to match volume sector size.", 23441e9ea7e0SNamjae Jeon blocksize, sb->s_blocksize_bits); 23451e9ea7e0SNamjae Jeon } 23461e9ea7e0SNamjae Jeon /* Initialize the cluster and mft allocators. */ 23471e9ea7e0SNamjae Jeon ntfs_setup_allocators(vol); 23481e9ea7e0SNamjae Jeon /* Setup remaining fields in the super block. */ 23491e9ea7e0SNamjae Jeon sb->s_magic = NTFS_SB_MAGIC; 23501e9ea7e0SNamjae Jeon /* 23511e9ea7e0SNamjae Jeon * Ntfs allows 63 bits for the file size, i.e. correct would be: 23521e9ea7e0SNamjae Jeon * sb->s_maxbytes = ~0ULL >> 1; 23531e9ea7e0SNamjae Jeon * But the kernel uses a long as the page cache page index which on 23541e9ea7e0SNamjae Jeon * 32-bit architectures is only 32-bits. MAX_LFS_FILESIZE is kernel 23551e9ea7e0SNamjae Jeon * defined to the maximum the page cache page index can cope with 23561e9ea7e0SNamjae Jeon * without overflowing the index or to 2^63 - 1, whichever is smaller. 23571e9ea7e0SNamjae Jeon */ 23581e9ea7e0SNamjae Jeon sb->s_maxbytes = MAX_LFS_FILESIZE; 23591e9ea7e0SNamjae Jeon /* Ntfs measures time in 100ns intervals. */ 23601e9ea7e0SNamjae Jeon sb->s_time_gran = 100; 23616251f0b0SNamjae Jeon 23626251f0b0SNamjae Jeon sb->s_xattr = ntfs_xattr_handlers; 23631e9ea7e0SNamjae Jeon /* 23641e9ea7e0SNamjae Jeon * Now load the metadata required for the page cache and our address 23651e9ea7e0SNamjae Jeon * space operations to function. We do this by setting up a specialised 23661e9ea7e0SNamjae Jeon * read_inode method and then just calling the normal iget() to obtain 23671e9ea7e0SNamjae Jeon * the inode for $MFT which is sufficient to allow our normal inode 23681e9ea7e0SNamjae Jeon * operations and associated address space operations to function. 23691e9ea7e0SNamjae Jeon */ 23701e9ea7e0SNamjae Jeon sb->s_op = &ntfs_sops; 23711e9ea7e0SNamjae Jeon tmp_ino = new_inode(sb); 23721e9ea7e0SNamjae Jeon if (!tmp_ino) { 23731e9ea7e0SNamjae Jeon if (!silent) 23741e9ea7e0SNamjae Jeon ntfs_error(sb, "Failed to load essential metadata."); 23751e9ea7e0SNamjae Jeon goto err_out_now; 23761e9ea7e0SNamjae Jeon } 23776251f0b0SNamjae Jeon 23781e9ea7e0SNamjae Jeon tmp_ino->i_ino = FILE_MFT; 23791e9ea7e0SNamjae Jeon insert_inode_hash(tmp_ino); 23801e9ea7e0SNamjae Jeon if (ntfs_read_inode_mount(tmp_ino) < 0) { 23811e9ea7e0SNamjae Jeon if (!silent) 23821e9ea7e0SNamjae Jeon ntfs_error(sb, "Failed to load essential metadata."); 23831e9ea7e0SNamjae Jeon goto iput_tmp_ino_err_out_now; 23841e9ea7e0SNamjae Jeon } 23856251f0b0SNamjae Jeon lockdep_set_class(&tmp_ino->i_mapping->invalidate_lock, 23866251f0b0SNamjae Jeon &ntfs_mft_inval_lock_key); 23876251f0b0SNamjae Jeon 23881e9ea7e0SNamjae Jeon mutex_lock(&ntfs_lock); 23896251f0b0SNamjae Jeon 23901e9ea7e0SNamjae Jeon /* 23911e9ea7e0SNamjae Jeon * Generate the global default upcase table if necessary. Also 23921e9ea7e0SNamjae Jeon * temporarily increment the number of upcase users to avoid race 23931e9ea7e0SNamjae Jeon * conditions with concurrent (u)mounts. 23941e9ea7e0SNamjae Jeon */ 23951e9ea7e0SNamjae Jeon if (!default_upcase) 23961e9ea7e0SNamjae Jeon default_upcase = generate_default_upcase(); 23971e9ea7e0SNamjae Jeon ntfs_nr_upcase_users++; 23981e9ea7e0SNamjae Jeon mutex_unlock(&ntfs_lock); 23996251f0b0SNamjae Jeon 24006251f0b0SNamjae Jeon lcn_bit_pages = (((vol->nr_clusters + 7) >> 3) + PAGE_SIZE - 1) >> PAGE_SHIFT; 24016251f0b0SNamjae Jeon vol->lcn_empty_bits_per_page = kvmalloc_array(lcn_bit_pages, sizeof(unsigned int), 24026251f0b0SNamjae Jeon GFP_KERNEL); 24036251f0b0SNamjae Jeon if (!vol->lcn_empty_bits_per_page) { 24046251f0b0SNamjae Jeon ntfs_error(sb, 24056251f0b0SNamjae Jeon "Unable to allocate pages for storing LCN empty bit counts\n"); 24066251f0b0SNamjae Jeon goto unl_upcase_iput_tmp_ino_err_out_now; 24076251f0b0SNamjae Jeon } 24086251f0b0SNamjae Jeon 24091e9ea7e0SNamjae Jeon /* 24101e9ea7e0SNamjae Jeon * From now on, ignore @silent parameter. If we fail below this line, 24111e9ea7e0SNamjae Jeon * it will be due to a corrupt fs or a system error, so we report it. 24121e9ea7e0SNamjae Jeon */ 24131e9ea7e0SNamjae Jeon /* 24141e9ea7e0SNamjae Jeon * Open the system files with normal access functions and complete 24151e9ea7e0SNamjae Jeon * setting up the ntfs super block. 24161e9ea7e0SNamjae Jeon */ 24171e9ea7e0SNamjae Jeon if (!load_system_files(vol)) { 24181e9ea7e0SNamjae Jeon ntfs_error(sb, "Failed to load system files."); 24191e9ea7e0SNamjae Jeon goto unl_upcase_iput_tmp_ino_err_out_now; 24201e9ea7e0SNamjae Jeon } 24211e9ea7e0SNamjae Jeon 24221e9ea7e0SNamjae Jeon /* We grab a reference, simulating an ntfs_iget(). */ 24231e9ea7e0SNamjae Jeon ihold(vol->root_ino); 24246251f0b0SNamjae Jeon sb->s_root = d_make_root(vol->root_ino); 24256251f0b0SNamjae Jeon if (sb->s_root) { 24266251f0b0SNamjae Jeon s64 nr_records; 24276251f0b0SNamjae Jeon 24281e9ea7e0SNamjae Jeon ntfs_debug("Exiting, status successful."); 24296251f0b0SNamjae Jeon 24301e9ea7e0SNamjae Jeon /* Release the default upcase if it has no users. */ 24311e9ea7e0SNamjae Jeon mutex_lock(&ntfs_lock); 24321e9ea7e0SNamjae Jeon if (!--ntfs_nr_upcase_users && default_upcase) { 24336251f0b0SNamjae Jeon kvfree(default_upcase); 24341e9ea7e0SNamjae Jeon default_upcase = NULL; 24351e9ea7e0SNamjae Jeon } 24361e9ea7e0SNamjae Jeon mutex_unlock(&ntfs_lock); 24371e9ea7e0SNamjae Jeon sb->s_export_op = &ntfs_export_ops; 24381e9ea7e0SNamjae Jeon lockdep_on(); 24396251f0b0SNamjae Jeon 24406251f0b0SNamjae Jeon nr_records = __get_nr_free_mft_records(vol, 24416251f0b0SNamjae Jeon i_size_read(vol->mft_ino) >> vol->mft_record_size_bits, 24426251f0b0SNamjae Jeon ((((NTFS_I(vol->mft_ino)->initialized_size >> 24436251f0b0SNamjae Jeon vol->mft_record_size_bits) + 24446251f0b0SNamjae Jeon 7) >> 3) + PAGE_SIZE - 1) >> PAGE_SHIFT); 24456251f0b0SNamjae Jeon ntfs_debug("Free mft records(%lld)", nr_records); 24466251f0b0SNamjae Jeon 24476251f0b0SNamjae Jeon init_waitqueue_head(&vol->free_waitq); 24486251f0b0SNamjae Jeon INIT_WORK(&vol->precalc_work, precalc_free_clusters); 24496251f0b0SNamjae Jeon queue_work(ntfs_wq, &vol->precalc_work); 24501e9ea7e0SNamjae Jeon return 0; 24511e9ea7e0SNamjae Jeon } 24521e9ea7e0SNamjae Jeon ntfs_error(sb, "Failed to allocate root directory."); 24531e9ea7e0SNamjae Jeon /* Clean up after the successful load_system_files() call from above. */ 24541e9ea7e0SNamjae Jeon iput(vol->vol_ino); 24551e9ea7e0SNamjae Jeon vol->vol_ino = NULL; 24561e9ea7e0SNamjae Jeon /* NTFS 3.0+ specific clean up. */ 24571e9ea7e0SNamjae Jeon if (vol->major_ver >= 3) { 24581e9ea7e0SNamjae Jeon if (vol->quota_q_ino) { 24591e9ea7e0SNamjae Jeon iput(vol->quota_q_ino); 24601e9ea7e0SNamjae Jeon vol->quota_q_ino = NULL; 24611e9ea7e0SNamjae Jeon } 24621e9ea7e0SNamjae Jeon if (vol->quota_ino) { 24631e9ea7e0SNamjae Jeon iput(vol->quota_ino); 24641e9ea7e0SNamjae Jeon vol->quota_ino = NULL; 24651e9ea7e0SNamjae Jeon } 24661e9ea7e0SNamjae Jeon if (vol->extend_ino) { 24671e9ea7e0SNamjae Jeon iput(vol->extend_ino); 24681e9ea7e0SNamjae Jeon vol->extend_ino = NULL; 24691e9ea7e0SNamjae Jeon } 24701e9ea7e0SNamjae Jeon if (vol->secure_ino) { 24711e9ea7e0SNamjae Jeon iput(vol->secure_ino); 24721e9ea7e0SNamjae Jeon vol->secure_ino = NULL; 24731e9ea7e0SNamjae Jeon } 24741e9ea7e0SNamjae Jeon } 24751e9ea7e0SNamjae Jeon iput(vol->root_ino); 24761e9ea7e0SNamjae Jeon vol->root_ino = NULL; 24771e9ea7e0SNamjae Jeon iput(vol->lcnbmp_ino); 24781e9ea7e0SNamjae Jeon vol->lcnbmp_ino = NULL; 24791e9ea7e0SNamjae Jeon iput(vol->mftbmp_ino); 24801e9ea7e0SNamjae Jeon vol->mftbmp_ino = NULL; 24811e9ea7e0SNamjae Jeon if (vol->logfile_ino) { 24821e9ea7e0SNamjae Jeon iput(vol->logfile_ino); 24831e9ea7e0SNamjae Jeon vol->logfile_ino = NULL; 24841e9ea7e0SNamjae Jeon } 24851e9ea7e0SNamjae Jeon if (vol->mftmirr_ino) { 24861e9ea7e0SNamjae Jeon iput(vol->mftmirr_ino); 24871e9ea7e0SNamjae Jeon vol->mftmirr_ino = NULL; 24881e9ea7e0SNamjae Jeon } 24891e9ea7e0SNamjae Jeon /* Throw away the table of attribute definitions. */ 24901e9ea7e0SNamjae Jeon vol->attrdef_size = 0; 24911e9ea7e0SNamjae Jeon if (vol->attrdef) { 24926251f0b0SNamjae Jeon kvfree(vol->attrdef); 24931e9ea7e0SNamjae Jeon vol->attrdef = NULL; 24941e9ea7e0SNamjae Jeon } 24951e9ea7e0SNamjae Jeon vol->upcase_len = 0; 24961e9ea7e0SNamjae Jeon mutex_lock(&ntfs_lock); 24971e9ea7e0SNamjae Jeon if (vol->upcase == default_upcase) { 24981e9ea7e0SNamjae Jeon ntfs_nr_upcase_users--; 24991e9ea7e0SNamjae Jeon vol->upcase = NULL; 25001e9ea7e0SNamjae Jeon } 25011e9ea7e0SNamjae Jeon mutex_unlock(&ntfs_lock); 25021e9ea7e0SNamjae Jeon if (vol->upcase) { 25036251f0b0SNamjae Jeon kvfree(vol->upcase); 25041e9ea7e0SNamjae Jeon vol->upcase = NULL; 25051e9ea7e0SNamjae Jeon } 25061e9ea7e0SNamjae Jeon if (vol->nls_map) { 25071e9ea7e0SNamjae Jeon unload_nls(vol->nls_map); 25081e9ea7e0SNamjae Jeon vol->nls_map = NULL; 25091e9ea7e0SNamjae Jeon } 25101e9ea7e0SNamjae Jeon /* Error exit code path. */ 25111e9ea7e0SNamjae Jeon unl_upcase_iput_tmp_ino_err_out_now: 25126251f0b0SNamjae Jeon if (vol->lcn_empty_bits_per_page) 25136251f0b0SNamjae Jeon kvfree(vol->lcn_empty_bits_per_page); 25141e9ea7e0SNamjae Jeon /* 25151e9ea7e0SNamjae Jeon * Decrease the number of upcase users and destroy the global default 25161e9ea7e0SNamjae Jeon * upcase table if necessary. 25171e9ea7e0SNamjae Jeon */ 25181e9ea7e0SNamjae Jeon mutex_lock(&ntfs_lock); 25191e9ea7e0SNamjae Jeon if (!--ntfs_nr_upcase_users && default_upcase) { 25206251f0b0SNamjae Jeon kvfree(default_upcase); 25211e9ea7e0SNamjae Jeon default_upcase = NULL; 25221e9ea7e0SNamjae Jeon } 25236251f0b0SNamjae Jeon 25241e9ea7e0SNamjae Jeon mutex_unlock(&ntfs_lock); 25251e9ea7e0SNamjae Jeon iput_tmp_ino_err_out_now: 25261e9ea7e0SNamjae Jeon iput(tmp_ino); 25271e9ea7e0SNamjae Jeon if (vol->mft_ino && vol->mft_ino != tmp_ino) 25281e9ea7e0SNamjae Jeon iput(vol->mft_ino); 25291e9ea7e0SNamjae Jeon vol->mft_ino = NULL; 25301e9ea7e0SNamjae Jeon /* Errors at this stage are irrelevant. */ 25311e9ea7e0SNamjae Jeon err_out_now: 25321e9ea7e0SNamjae Jeon sb->s_fs_info = NULL; 25331e9ea7e0SNamjae Jeon kfree(vol); 25341e9ea7e0SNamjae Jeon ntfs_debug("Failed, returning -EINVAL."); 25351e9ea7e0SNamjae Jeon lockdep_on(); 25361e9ea7e0SNamjae Jeon return -EINVAL; 25371e9ea7e0SNamjae Jeon } 25381e9ea7e0SNamjae Jeon 25391e9ea7e0SNamjae Jeon /* 25401e9ea7e0SNamjae Jeon * This is a slab cache to optimize allocations and deallocations of Unicode 25411e9ea7e0SNamjae Jeon * strings of the maximum length allowed by NTFS, which is NTFS_MAX_NAME_LEN 25421e9ea7e0SNamjae Jeon * (255) Unicode characters + a terminating NULL Unicode character. 25431e9ea7e0SNamjae Jeon */ 25441e9ea7e0SNamjae Jeon struct kmem_cache *ntfs_name_cache; 25451e9ea7e0SNamjae Jeon 25461e9ea7e0SNamjae Jeon /* Slab caches for efficient allocation/deallocation of inodes. */ 25471e9ea7e0SNamjae Jeon struct kmem_cache *ntfs_inode_cache; 25481e9ea7e0SNamjae Jeon struct kmem_cache *ntfs_big_inode_cache; 25491e9ea7e0SNamjae Jeon 25501e9ea7e0SNamjae Jeon /* Init once constructor for the inode slab cache. */ 25511e9ea7e0SNamjae Jeon static void ntfs_big_inode_init_once(void *foo) 25521e9ea7e0SNamjae Jeon { 25536251f0b0SNamjae Jeon struct ntfs_inode *ni = foo; 25541e9ea7e0SNamjae Jeon 25551e9ea7e0SNamjae Jeon inode_init_once(VFS_I(ni)); 25561e9ea7e0SNamjae Jeon } 25571e9ea7e0SNamjae Jeon 25581e9ea7e0SNamjae Jeon /* 25591e9ea7e0SNamjae Jeon * Slab caches to optimize allocations and deallocations of attribute search 25601e9ea7e0SNamjae Jeon * contexts and index contexts, respectively. 25611e9ea7e0SNamjae Jeon */ 25621e9ea7e0SNamjae Jeon struct kmem_cache *ntfs_attr_ctx_cache; 25631e9ea7e0SNamjae Jeon struct kmem_cache *ntfs_index_ctx_cache; 25641e9ea7e0SNamjae Jeon 25651e9ea7e0SNamjae Jeon /* Driver wide mutex. */ 25661e9ea7e0SNamjae Jeon DEFINE_MUTEX(ntfs_lock); 25671e9ea7e0SNamjae Jeon 25686251f0b0SNamjae Jeon static int ntfs_get_tree(struct fs_context *fc) 25691e9ea7e0SNamjae Jeon { 25706251f0b0SNamjae Jeon return get_tree_bdev(fc, ntfs_fill_super); 25716251f0b0SNamjae Jeon } 25726251f0b0SNamjae Jeon 25736251f0b0SNamjae Jeon static void ntfs_free_fs_context(struct fs_context *fc) 25746251f0b0SNamjae Jeon { 25756251f0b0SNamjae Jeon struct ntfs_volume *vol = fc->s_fs_info; 25766251f0b0SNamjae Jeon 25776251f0b0SNamjae Jeon if (vol) 25786251f0b0SNamjae Jeon ntfs_volume_free(vol); 25796251f0b0SNamjae Jeon } 25806251f0b0SNamjae Jeon 25816251f0b0SNamjae Jeon static const struct fs_context_operations ntfs_context_ops = { 25826251f0b0SNamjae Jeon .parse_param = ntfs_parse_param, 25836251f0b0SNamjae Jeon .get_tree = ntfs_get_tree, 25846251f0b0SNamjae Jeon .free = ntfs_free_fs_context, 25856251f0b0SNamjae Jeon .reconfigure = ntfs_reconfigure, 25866251f0b0SNamjae Jeon }; 25876251f0b0SNamjae Jeon 25886251f0b0SNamjae Jeon static int ntfs_init_fs_context(struct fs_context *fc) 25896251f0b0SNamjae Jeon { 25906251f0b0SNamjae Jeon struct ntfs_volume *vol; 25916251f0b0SNamjae Jeon 25926251f0b0SNamjae Jeon /* Allocate a new struct ntfs_volume and place it in sb->s_fs_info. */ 25936251f0b0SNamjae Jeon vol = kmalloc(sizeof(struct ntfs_volume), GFP_NOFS); 25946251f0b0SNamjae Jeon if (!vol) 25956251f0b0SNamjae Jeon return -ENOMEM; 25966251f0b0SNamjae Jeon 25976251f0b0SNamjae Jeon /* Initialize struct ntfs_volume structure. */ 25986251f0b0SNamjae Jeon *vol = (struct ntfs_volume) { 25996251f0b0SNamjae Jeon .uid = INVALID_UID, 26006251f0b0SNamjae Jeon .gid = INVALID_GID, 26016251f0b0SNamjae Jeon .fmask = 0, 26026251f0b0SNamjae Jeon .dmask = 0, 26036251f0b0SNamjae Jeon .mft_zone_multiplier = 1, 26046251f0b0SNamjae Jeon .on_errors = ON_ERRORS_CONTINUE, 26056251f0b0SNamjae Jeon .nls_map = load_nls_default(), 26066251f0b0SNamjae Jeon .preallocated_size = NTFS_DEF_PREALLOC_SIZE, 26076251f0b0SNamjae Jeon }; 26086251f0b0SNamjae Jeon 26096251f0b0SNamjae Jeon NVolSetShowHiddenFiles(vol); 26106251f0b0SNamjae Jeon NVolSetCaseSensitive(vol); 26116251f0b0SNamjae Jeon init_rwsem(&vol->mftbmp_lock); 26126251f0b0SNamjae Jeon init_rwsem(&vol->lcnbmp_lock); 26136251f0b0SNamjae Jeon 26146251f0b0SNamjae Jeon fc->s_fs_info = vol; 26156251f0b0SNamjae Jeon fc->ops = &ntfs_context_ops; 26166251f0b0SNamjae Jeon return 0; 26171e9ea7e0SNamjae Jeon } 26181e9ea7e0SNamjae Jeon 26191e9ea7e0SNamjae Jeon static struct file_system_type ntfs_fs_type = { 26201e9ea7e0SNamjae Jeon .owner = THIS_MODULE, 26211e9ea7e0SNamjae Jeon .name = "ntfs", 26226251f0b0SNamjae Jeon .init_fs_context = ntfs_init_fs_context, 26236251f0b0SNamjae Jeon .parameters = ntfs_parameters, 26241e9ea7e0SNamjae Jeon .kill_sb = kill_block_super, 26256251f0b0SNamjae Jeon .fs_flags = FS_REQUIRES_DEV | FS_ALLOW_IDMAP, 26261e9ea7e0SNamjae Jeon }; 2627*040457cfSWoody Suwalski MODULE_ALIAS_FS("ntfs"); 26286251f0b0SNamjae Jeon 26296251f0b0SNamjae Jeon static int ntfs_workqueue_init(void) 26306251f0b0SNamjae Jeon { 26316251f0b0SNamjae Jeon ntfs_wq = alloc_workqueue("ntfs-bg-io", 0, 0); 26326251f0b0SNamjae Jeon if (!ntfs_wq) 26336251f0b0SNamjae Jeon return -ENOMEM; 26346251f0b0SNamjae Jeon return 0; 26356251f0b0SNamjae Jeon } 26366251f0b0SNamjae Jeon 26376251f0b0SNamjae Jeon static void ntfs_workqueue_destroy(void) 26386251f0b0SNamjae Jeon { 26396251f0b0SNamjae Jeon destroy_workqueue(ntfs_wq); 26406251f0b0SNamjae Jeon ntfs_wq = NULL; 26416251f0b0SNamjae Jeon } 26421e9ea7e0SNamjae Jeon 26431e9ea7e0SNamjae Jeon /* Stable names for the slab caches. */ 26441e9ea7e0SNamjae Jeon static const char ntfs_index_ctx_cache_name[] = "ntfs_index_ctx_cache"; 26451e9ea7e0SNamjae Jeon static const char ntfs_attr_ctx_cache_name[] = "ntfs_attr_ctx_cache"; 26461e9ea7e0SNamjae Jeon static const char ntfs_name_cache_name[] = "ntfs_name_cache"; 26471e9ea7e0SNamjae Jeon static const char ntfs_inode_cache_name[] = "ntfs_inode_cache"; 26481e9ea7e0SNamjae Jeon static const char ntfs_big_inode_cache_name[] = "ntfs_big_inode_cache"; 26491e9ea7e0SNamjae Jeon 26501e9ea7e0SNamjae Jeon static int __init init_ntfs_fs(void) 26511e9ea7e0SNamjae Jeon { 26521e9ea7e0SNamjae Jeon int err = 0; 26531e9ea7e0SNamjae Jeon 26546251f0b0SNamjae Jeon err = ntfs_workqueue_init(); 26556251f0b0SNamjae Jeon if (err) { 26566251f0b0SNamjae Jeon pr_crit("Failed to register workqueue!\n"); 26576251f0b0SNamjae Jeon return err; 26586251f0b0SNamjae Jeon } 26591e9ea7e0SNamjae Jeon 26601e9ea7e0SNamjae Jeon ntfs_index_ctx_cache = kmem_cache_create(ntfs_index_ctx_cache_name, 26616251f0b0SNamjae Jeon sizeof(struct ntfs_index_context), 0 /* offset */, 26621e9ea7e0SNamjae Jeon SLAB_HWCACHE_ALIGN, NULL /* ctor */); 26631e9ea7e0SNamjae Jeon if (!ntfs_index_ctx_cache) { 26641e9ea7e0SNamjae Jeon pr_crit("Failed to create %s!\n", ntfs_index_ctx_cache_name); 26651e9ea7e0SNamjae Jeon goto ictx_err_out; 26661e9ea7e0SNamjae Jeon } 26671e9ea7e0SNamjae Jeon ntfs_attr_ctx_cache = kmem_cache_create(ntfs_attr_ctx_cache_name, 26686251f0b0SNamjae Jeon sizeof(struct ntfs_attr_search_ctx), 0 /* offset */, 26691e9ea7e0SNamjae Jeon SLAB_HWCACHE_ALIGN, NULL /* ctor */); 26701e9ea7e0SNamjae Jeon if (!ntfs_attr_ctx_cache) { 26711e9ea7e0SNamjae Jeon pr_crit("NTFS: Failed to create %s!\n", 26721e9ea7e0SNamjae Jeon ntfs_attr_ctx_cache_name); 26731e9ea7e0SNamjae Jeon goto actx_err_out; 26741e9ea7e0SNamjae Jeon } 26751e9ea7e0SNamjae Jeon 26761e9ea7e0SNamjae Jeon ntfs_name_cache = kmem_cache_create(ntfs_name_cache_name, 26776251f0b0SNamjae Jeon (NTFS_MAX_NAME_LEN+2) * sizeof(__le16), 0, 26781e9ea7e0SNamjae Jeon SLAB_HWCACHE_ALIGN, NULL); 26791e9ea7e0SNamjae Jeon if (!ntfs_name_cache) { 26801e9ea7e0SNamjae Jeon pr_crit("Failed to create %s!\n", ntfs_name_cache_name); 26811e9ea7e0SNamjae Jeon goto name_err_out; 26821e9ea7e0SNamjae Jeon } 26831e9ea7e0SNamjae Jeon 26841e9ea7e0SNamjae Jeon ntfs_inode_cache = kmem_cache_create(ntfs_inode_cache_name, 26856251f0b0SNamjae Jeon sizeof(struct ntfs_inode), 0, SLAB_RECLAIM_ACCOUNT, NULL); 26861e9ea7e0SNamjae Jeon if (!ntfs_inode_cache) { 26871e9ea7e0SNamjae Jeon pr_crit("Failed to create %s!\n", ntfs_inode_cache_name); 26881e9ea7e0SNamjae Jeon goto inode_err_out; 26891e9ea7e0SNamjae Jeon } 26901e9ea7e0SNamjae Jeon 26911e9ea7e0SNamjae Jeon ntfs_big_inode_cache = kmem_cache_create(ntfs_big_inode_cache_name, 26926251f0b0SNamjae Jeon sizeof(struct big_ntfs_inode), 0, SLAB_HWCACHE_ALIGN | 26936251f0b0SNamjae Jeon SLAB_RECLAIM_ACCOUNT | SLAB_ACCOUNT, 26946251f0b0SNamjae Jeon ntfs_big_inode_init_once); 26951e9ea7e0SNamjae Jeon if (!ntfs_big_inode_cache) { 26961e9ea7e0SNamjae Jeon pr_crit("Failed to create %s!\n", ntfs_big_inode_cache_name); 26971e9ea7e0SNamjae Jeon goto big_inode_err_out; 26981e9ea7e0SNamjae Jeon } 26991e9ea7e0SNamjae Jeon 27001e9ea7e0SNamjae Jeon /* Register the ntfs sysctls. */ 27011e9ea7e0SNamjae Jeon err = ntfs_sysctl(1); 27021e9ea7e0SNamjae Jeon if (err) { 27031e9ea7e0SNamjae Jeon pr_crit("Failed to register NTFS sysctls!\n"); 27041e9ea7e0SNamjae Jeon goto sysctl_err_out; 27051e9ea7e0SNamjae Jeon } 27061e9ea7e0SNamjae Jeon 27071e9ea7e0SNamjae Jeon err = register_filesystem(&ntfs_fs_type); 27081e9ea7e0SNamjae Jeon if (!err) { 27091e9ea7e0SNamjae Jeon ntfs_debug("NTFS driver registered successfully."); 27101e9ea7e0SNamjae Jeon return 0; /* Success! */ 27111e9ea7e0SNamjae Jeon } 27121e9ea7e0SNamjae Jeon pr_crit("Failed to register NTFS filesystem driver!\n"); 27131e9ea7e0SNamjae Jeon 27141e9ea7e0SNamjae Jeon /* Unregister the ntfs sysctls. */ 27151e9ea7e0SNamjae Jeon ntfs_sysctl(0); 27161e9ea7e0SNamjae Jeon sysctl_err_out: 27171e9ea7e0SNamjae Jeon kmem_cache_destroy(ntfs_big_inode_cache); 27181e9ea7e0SNamjae Jeon big_inode_err_out: 27191e9ea7e0SNamjae Jeon kmem_cache_destroy(ntfs_inode_cache); 27201e9ea7e0SNamjae Jeon inode_err_out: 27211e9ea7e0SNamjae Jeon kmem_cache_destroy(ntfs_name_cache); 27221e9ea7e0SNamjae Jeon name_err_out: 27231e9ea7e0SNamjae Jeon kmem_cache_destroy(ntfs_attr_ctx_cache); 27241e9ea7e0SNamjae Jeon actx_err_out: 27251e9ea7e0SNamjae Jeon kmem_cache_destroy(ntfs_index_ctx_cache); 27261e9ea7e0SNamjae Jeon ictx_err_out: 27271e9ea7e0SNamjae Jeon if (!err) { 27281e9ea7e0SNamjae Jeon pr_crit("Aborting NTFS filesystem driver registration...\n"); 27291e9ea7e0SNamjae Jeon err = -ENOMEM; 27301e9ea7e0SNamjae Jeon } 27311e9ea7e0SNamjae Jeon return err; 27321e9ea7e0SNamjae Jeon } 27331e9ea7e0SNamjae Jeon 27341e9ea7e0SNamjae Jeon static void __exit exit_ntfs_fs(void) 27351e9ea7e0SNamjae Jeon { 27361e9ea7e0SNamjae Jeon ntfs_debug("Unregistering NTFS driver."); 27371e9ea7e0SNamjae Jeon 27381e9ea7e0SNamjae Jeon unregister_filesystem(&ntfs_fs_type); 27391e9ea7e0SNamjae Jeon 27401e9ea7e0SNamjae Jeon /* 27411e9ea7e0SNamjae Jeon * Make sure all delayed rcu free inodes are flushed before we 27421e9ea7e0SNamjae Jeon * destroy cache. 27431e9ea7e0SNamjae Jeon */ 27441e9ea7e0SNamjae Jeon rcu_barrier(); 27451e9ea7e0SNamjae Jeon kmem_cache_destroy(ntfs_big_inode_cache); 27461e9ea7e0SNamjae Jeon kmem_cache_destroy(ntfs_inode_cache); 27471e9ea7e0SNamjae Jeon kmem_cache_destroy(ntfs_name_cache); 27481e9ea7e0SNamjae Jeon kmem_cache_destroy(ntfs_attr_ctx_cache); 27491e9ea7e0SNamjae Jeon kmem_cache_destroy(ntfs_index_ctx_cache); 27506251f0b0SNamjae Jeon ntfs_workqueue_destroy(); 27511e9ea7e0SNamjae Jeon /* Unregister the ntfs sysctls. */ 27521e9ea7e0SNamjae Jeon ntfs_sysctl(0); 27531e9ea7e0SNamjae Jeon } 27541e9ea7e0SNamjae Jeon 27556251f0b0SNamjae Jeon module_init(init_ntfs_fs); 27566251f0b0SNamjae Jeon module_exit(exit_ntfs_fs); 27576251f0b0SNamjae Jeon 27586251f0b0SNamjae Jeon MODULE_AUTHOR("Anton Altaparmakov <anton@tuxera.com>"); /* Original read-only NTFS driver */ 27596251f0b0SNamjae Jeon MODULE_AUTHOR("Namjae Jeon <linkinjeon@kernel.org>"); /* Add write, iomap and various features */ 27606251f0b0SNamjae Jeon MODULE_DESCRIPTION("NTFS read-write filesystem driver"); 27611e9ea7e0SNamjae Jeon MODULE_LICENSE("GPL"); 27621e9ea7e0SNamjae Jeon #ifdef DEBUG 27636251f0b0SNamjae Jeon module_param(debug_msgs, uint, 0); 27641e9ea7e0SNamjae Jeon MODULE_PARM_DESC(debug_msgs, "Enable debug messages."); 27651e9ea7e0SNamjae Jeon #endif 2766