xref: /linux/fs/ntfs/super.c (revision cdd4dc3aebeab43a72ce0bc2b5bab6f0a80b97a5)
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