xref: /linux/fs/ntfs/ntfs.h (revision cdd4dc3aebeab43a72ce0bc2b5bab6f0a80b97a5)
11e9ea7e0SNamjae Jeon /* SPDX-License-Identifier: GPL-2.0-or-later */
21e9ea7e0SNamjae Jeon /*
3*40796051SNamjae Jeon  * Defines for NTFS Linux kernel driver.
41e9ea7e0SNamjae Jeon  *
51e9ea7e0SNamjae Jeon  * Copyright (c) 2001-2014 Anton Altaparmakov and Tuxera Inc.
61e9ea7e0SNamjae Jeon  * Copyright (C) 2002 Richard Russon
7*40796051SNamjae Jeon  * Copyright (c) 2025 LG Electronics Co., Ltd.
81e9ea7e0SNamjae Jeon  */
91e9ea7e0SNamjae Jeon 
101e9ea7e0SNamjae Jeon #ifndef _LINUX_NTFS_H
111e9ea7e0SNamjae Jeon #define _LINUX_NTFS_H
121e9ea7e0SNamjae Jeon 
131e9ea7e0SNamjae Jeon #include <linux/stddef.h>
141e9ea7e0SNamjae Jeon #include <linux/kernel.h>
15*40796051SNamjae Jeon #include <linux/hex.h>
161e9ea7e0SNamjae Jeon #include <linux/module.h>
171e9ea7e0SNamjae Jeon #include <linux/compiler.h>
181e9ea7e0SNamjae Jeon #include <linux/fs.h>
191e9ea7e0SNamjae Jeon #include <linux/nls.h>
201e9ea7e0SNamjae Jeon #include <linux/smp.h>
211e9ea7e0SNamjae Jeon #include <linux/pagemap.h>
22*40796051SNamjae Jeon #include <linux/uidgid.h>
231e9ea7e0SNamjae Jeon 
241e9ea7e0SNamjae Jeon #include "volume.h"
251e9ea7e0SNamjae Jeon #include "layout.h"
26*40796051SNamjae Jeon #include "inode.h"
271e9ea7e0SNamjae Jeon 
28*40796051SNamjae Jeon #ifdef pr_fmt
29*40796051SNamjae Jeon #undef pr_fmt
30*40796051SNamjae Jeon #endif
31*40796051SNamjae Jeon 
32*40796051SNamjae Jeon #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
33*40796051SNamjae Jeon 
34*40796051SNamjae Jeon /*
35*40796051SNamjae Jeon  * Default pre-allocation size is optimize runlist merge overhead
36*40796051SNamjae Jeon  * with small chunk size.
37*40796051SNamjae Jeon  */
38*40796051SNamjae Jeon #define NTFS_DEF_PREALLOC_SIZE		65536
39*40796051SNamjae Jeon 
40*40796051SNamjae Jeon /*
41*40796051SNamjae Jeon  * The log2 of the standard number of clusters per compression block.
42*40796051SNamjae Jeon  * A value of 4 corresponds to 16 clusters (1 << 4), which is the
43*40796051SNamjae Jeon  * default chunk size used by NTFS LZNT1 compression.
44*40796051SNamjae Jeon  */
45*40796051SNamjae Jeon #define STANDARD_COMPRESSION_UNIT	4
46*40796051SNamjae Jeon 
47*40796051SNamjae Jeon /*
48*40796051SNamjae Jeon  * The maximum cluster size (4KB) allowed for compression to be enabled.
49*40796051SNamjae Jeon  * By design, NTFS does not support compression on volumes where the
50*40796051SNamjae Jeon  * cluster size exceeds 4096 bytes.
51*40796051SNamjae Jeon  */
52*40796051SNamjae Jeon #define MAX_COMPRESSION_CLUSTER_SIZE 4096
53*40796051SNamjae Jeon 
54*40796051SNamjae Jeon #define NTFS_B_TO_CLU(vol, b) ((b) >> (vol)->cluster_size_bits)
55*40796051SNamjae Jeon #define NTFS_CLU_TO_B(vol, clu) ((u64)(clu) << (vol)->cluster_size_bits)
56*40796051SNamjae Jeon #define NTFS_B_TO_CLU_OFS(vol, clu) ((u64)(clu) & (vol)->cluster_size_mask)
57*40796051SNamjae Jeon 
58*40796051SNamjae Jeon #define NTFS_MFT_NR_TO_CLU(vol, mft_no) (((u64)mft_no << (vol)->mft_record_size_bits) >> \
59*40796051SNamjae Jeon 					 (vol)->cluster_size_bits)
60*40796051SNamjae Jeon #define NTFS_MFT_NR_TO_PIDX(vol, mft_no) (mft_no >> (PAGE_SHIFT - \
61*40796051SNamjae Jeon 					  (vol)->mft_record_size_bits))
62*40796051SNamjae Jeon #define NTFS_MFT_NR_TO_POFS(vol, mft_no) (((u64)mft_no << (vol)->mft_record_size_bits) & \
63*40796051SNamjae Jeon 					  ~PAGE_MASK)
64*40796051SNamjae Jeon 
65*40796051SNamjae Jeon #define NTFS_PIDX_TO_BLK(vol, idx) (((u64)idx << PAGE_SHIFT) >> \
66*40796051SNamjae Jeon 				    ((vol)->sb)->s_blocksize_bits)
67*40796051SNamjae Jeon #define NTFS_PIDX_TO_CLU(vol, idx) (((u64)idx << PAGE_SHIFT) >> \
68*40796051SNamjae Jeon 				    (vol)->cluster_size_bits)
69*40796051SNamjae Jeon #define NTFS_CLU_TO_PIDX(vol, clu) (((u64)(clu) << (vol)->cluster_size_bits) >> \
70*40796051SNamjae Jeon 				    PAGE_SHIFT)
71*40796051SNamjae Jeon #define NTFS_CLU_TO_POFS(vol, clu) (((u64)(clu) << (vol)->cluster_size_bits) & \
72*40796051SNamjae Jeon 				    ~PAGE_MASK)
73*40796051SNamjae Jeon 
74*40796051SNamjae Jeon #define NTFS_B_TO_SECTOR(vol, b) ((b) >> ((vol)->sb)->s_blocksize_bits)
75*40796051SNamjae Jeon 
76*40796051SNamjae Jeon enum {
771e9ea7e0SNamjae Jeon 	NTFS_BLOCK_SIZE		= 512,
781e9ea7e0SNamjae Jeon 	NTFS_BLOCK_SIZE_BITS	= 9,
791e9ea7e0SNamjae Jeon 	NTFS_SB_MAGIC		= 0x5346544e,	/* 'NTFS' */
801e9ea7e0SNamjae Jeon 	NTFS_MAX_NAME_LEN	= 255,
81*40796051SNamjae Jeon 	NTFS_MAX_LABEL_LEN	= 128,
82*40796051SNamjae Jeon };
83*40796051SNamjae Jeon 
84*40796051SNamjae Jeon enum {
85*40796051SNamjae Jeon 	CASE_SENSITIVE = 0,
86*40796051SNamjae Jeon 	IGNORE_CASE = 1,
87*40796051SNamjae Jeon };
88*40796051SNamjae Jeon 
89*40796051SNamjae Jeon /*
90*40796051SNamjae Jeon  * Conversion helpers for NTFS units.
91*40796051SNamjae Jeon  */
92*40796051SNamjae Jeon 
93*40796051SNamjae Jeon /* Convert bytes to cluster count */
94*40796051SNamjae Jeon static inline u64 ntfs_bytes_to_cluster(const struct ntfs_volume *vol,
95*40796051SNamjae Jeon 		s64 bytes)
96*40796051SNamjae Jeon {
97*40796051SNamjae Jeon 	return bytes >> vol->cluster_size_bits;
98*40796051SNamjae Jeon }
99*40796051SNamjae Jeon 
100*40796051SNamjae Jeon /* Convert cluster count to bytes */
101*40796051SNamjae Jeon static inline u64 ntfs_cluster_to_bytes(const struct ntfs_volume *vol,
102*40796051SNamjae Jeon 		u64 clusters)
103*40796051SNamjae Jeon {
104*40796051SNamjae Jeon 	return clusters << vol->cluster_size_bits;
105*40796051SNamjae Jeon }
106*40796051SNamjae Jeon 
107*40796051SNamjae Jeon /* Get the byte offset within a cluster from a linear byte address */
108*40796051SNamjae Jeon static inline u64 ntfs_bytes_to_cluster_off(const struct ntfs_volume *vol,
109*40796051SNamjae Jeon 		u64 bytes)
110*40796051SNamjae Jeon {
111*40796051SNamjae Jeon 	return bytes & vol->cluster_size_mask;
112*40796051SNamjae Jeon }
113*40796051SNamjae Jeon 
114*40796051SNamjae Jeon /* Calculate the physical cluster number containing a specific MFT record. */
115*40796051SNamjae Jeon static inline u64 ntfs_mft_no_to_cluster(const struct ntfs_volume *vol,
116*40796051SNamjae Jeon 		unsigned long mft_no)
117*40796051SNamjae Jeon {
118*40796051SNamjae Jeon 	return ((u64)mft_no << vol->mft_record_size_bits) >>
119*40796051SNamjae Jeon 		vol->cluster_size_bits;
120*40796051SNamjae Jeon }
121*40796051SNamjae Jeon 
122*40796051SNamjae Jeon /* Calculate the folio index where the MFT record resides. */
123*40796051SNamjae Jeon static inline pgoff_t ntfs_mft_no_to_pidx(const struct ntfs_volume *vol,
124*40796051SNamjae Jeon 		unsigned long mft_no)
125*40796051SNamjae Jeon {
126*40796051SNamjae Jeon 	return mft_no >> (PAGE_SHIFT - vol->mft_record_size_bits);
127*40796051SNamjae Jeon }
128*40796051SNamjae Jeon 
129*40796051SNamjae Jeon /* Calculate the byte offset within a folio for an MFT record. */
130*40796051SNamjae Jeon static inline u64 ntfs_mft_no_to_poff(const struct ntfs_volume *vol,
131*40796051SNamjae Jeon 		unsigned long mft_no)
132*40796051SNamjae Jeon {
133*40796051SNamjae Jeon 	return ((u64)mft_no << vol->mft_record_size_bits) & ~PAGE_MASK;
134*40796051SNamjae Jeon }
135*40796051SNamjae Jeon 
136*40796051SNamjae Jeon /* Convert folio index to cluster number. */
137*40796051SNamjae Jeon static inline u64 ntfs_pidx_to_cluster(const struct ntfs_volume *vol,
138*40796051SNamjae Jeon 		pgoff_t idx)
139*40796051SNamjae Jeon {
140*40796051SNamjae Jeon 	return ((u64)idx << PAGE_SHIFT) >> vol->cluster_size_bits;
141*40796051SNamjae Jeon }
142*40796051SNamjae Jeon 
143*40796051SNamjae Jeon /* Convert cluster number to folio index. */
144*40796051SNamjae Jeon static inline pgoff_t ntfs_cluster_to_pidx(const struct ntfs_volume *vol,
145*40796051SNamjae Jeon 		u64 clu)
146*40796051SNamjae Jeon {
147*40796051SNamjae Jeon 	return (clu << vol->cluster_size_bits) >> PAGE_SHIFT;
148*40796051SNamjae Jeon }
149*40796051SNamjae Jeon 
150*40796051SNamjae Jeon /* Get the byte offset within a folio from a cluster number */
151*40796051SNamjae Jeon static inline u64 ntfs_cluster_to_poff(const struct ntfs_volume *vol,
152*40796051SNamjae Jeon 		u64 clu)
153*40796051SNamjae Jeon {
154*40796051SNamjae Jeon 	return (clu << vol->cluster_size_bits) & ~PAGE_MASK;
155*40796051SNamjae Jeon }
156*40796051SNamjae Jeon 
157*40796051SNamjae Jeon /* Convert byte offset to sector (block) number. */
158*40796051SNamjae Jeon static inline sector_t ntfs_bytes_to_sector(const struct ntfs_volume *vol,
159*40796051SNamjae Jeon 		u64 bytes)
160*40796051SNamjae Jeon {
161*40796051SNamjae Jeon 	return bytes >> vol->sb->s_blocksize_bits;
162*40796051SNamjae Jeon }
1631e9ea7e0SNamjae Jeon 
1641e9ea7e0SNamjae Jeon /* Global variables. */
1651e9ea7e0SNamjae Jeon 
1661e9ea7e0SNamjae Jeon /* Slab caches (from super.c). */
1671e9ea7e0SNamjae Jeon extern struct kmem_cache *ntfs_name_cache;
1681e9ea7e0SNamjae Jeon extern struct kmem_cache *ntfs_inode_cache;
1691e9ea7e0SNamjae Jeon extern struct kmem_cache *ntfs_big_inode_cache;
1701e9ea7e0SNamjae Jeon extern struct kmem_cache *ntfs_attr_ctx_cache;
1711e9ea7e0SNamjae Jeon extern struct kmem_cache *ntfs_index_ctx_cache;
1721e9ea7e0SNamjae Jeon 
1731e9ea7e0SNamjae Jeon /* The various operations structs defined throughout the driver files. */
174*40796051SNamjae Jeon extern const struct address_space_operations ntfs_aops;
175*40796051SNamjae Jeon extern const struct address_space_operations ntfs_mft_aops;
1761e9ea7e0SNamjae Jeon 
1771e9ea7e0SNamjae Jeon extern const struct  file_operations ntfs_file_ops;
1781e9ea7e0SNamjae Jeon extern const struct inode_operations ntfs_file_inode_ops;
179*40796051SNamjae Jeon extern const  struct inode_operations ntfs_symlink_inode_operations;
180*40796051SNamjae Jeon extern const struct inode_operations ntfs_special_inode_operations;
1811e9ea7e0SNamjae Jeon 
1821e9ea7e0SNamjae Jeon extern const struct  file_operations ntfs_dir_ops;
1831e9ea7e0SNamjae Jeon extern const struct inode_operations ntfs_dir_inode_ops;
1841e9ea7e0SNamjae Jeon 
1851e9ea7e0SNamjae Jeon extern const struct  file_operations ntfs_empty_file_ops;
1861e9ea7e0SNamjae Jeon extern const struct inode_operations ntfs_empty_inode_ops;
1871e9ea7e0SNamjae Jeon 
1881e9ea7e0SNamjae Jeon extern const struct export_operations ntfs_export_ops;
1891e9ea7e0SNamjae Jeon 
190*40796051SNamjae Jeon /*
1911e9ea7e0SNamjae Jeon  * NTFS_SB - return the ntfs volume given a vfs super block
1921e9ea7e0SNamjae Jeon  * @sb:		VFS super block
1931e9ea7e0SNamjae Jeon  *
1941e9ea7e0SNamjae Jeon  * NTFS_SB() returns the ntfs volume associated with the VFS super block @sb.
1951e9ea7e0SNamjae Jeon  */
196*40796051SNamjae Jeon static inline struct ntfs_volume *NTFS_SB(struct super_block *sb)
1971e9ea7e0SNamjae Jeon {
1981e9ea7e0SNamjae Jeon 	return sb->s_fs_info;
1991e9ea7e0SNamjae Jeon }
2001e9ea7e0SNamjae Jeon 
2011e9ea7e0SNamjae Jeon /* Declarations of functions and global variables. */
2021e9ea7e0SNamjae Jeon 
2031e9ea7e0SNamjae Jeon /* From fs/ntfs/compress.c */
204*40796051SNamjae Jeon int ntfs_read_compressed_block(struct folio *folio);
205*40796051SNamjae Jeon int allocate_compression_buffers(void);
206*40796051SNamjae Jeon void free_compression_buffers(void);
207*40796051SNamjae Jeon int ntfs_compress_write(struct ntfs_inode *ni, loff_t pos, size_t count,
208*40796051SNamjae Jeon 		struct iov_iter *from);
2091e9ea7e0SNamjae Jeon 
2101e9ea7e0SNamjae Jeon /* From fs/ntfs/super.c */
2111e9ea7e0SNamjae Jeon #define default_upcase_len 0x10000
2121e9ea7e0SNamjae Jeon extern struct mutex ntfs_lock;
2131e9ea7e0SNamjae Jeon 
214*40796051SNamjae Jeon struct option_t {
2151e9ea7e0SNamjae Jeon 	int val;
2161e9ea7e0SNamjae Jeon 	char *str;
217*40796051SNamjae Jeon };
218*40796051SNamjae Jeon extern const struct option_t on_errors_arr[];
219*40796051SNamjae Jeon int ntfs_set_volume_flags(struct ntfs_volume *vol, __le16 flags);
220*40796051SNamjae Jeon int ntfs_clear_volume_flags(struct ntfs_volume *vol, __le16 flags);
221*40796051SNamjae Jeon int ntfs_write_volume_label(struct ntfs_volume *vol, char *label);
2221e9ea7e0SNamjae Jeon 
2231e9ea7e0SNamjae Jeon /* From fs/ntfs/mst.c */
224*40796051SNamjae Jeon int post_read_mst_fixup(struct ntfs_record *b, const u32 size);
225*40796051SNamjae Jeon int pre_write_mst_fixup(struct ntfs_record *b, const u32 size);
226*40796051SNamjae Jeon void post_write_mst_fixup(struct ntfs_record *b);
2271e9ea7e0SNamjae Jeon 
2281e9ea7e0SNamjae Jeon /* From fs/ntfs/unistr.c */
229*40796051SNamjae Jeon bool ntfs_are_names_equal(const __le16 *s1, size_t s1_len,
230*40796051SNamjae Jeon 		const __le16 *s2, size_t s2_len,
231*40796051SNamjae Jeon 		const u32 ic,
232*40796051SNamjae Jeon 		const __le16 *upcase, const u32 upcase_size);
233*40796051SNamjae Jeon int ntfs_collate_names(const __le16 *name1, const u32 name1_len,
234*40796051SNamjae Jeon 		const __le16 *name2, const u32 name2_len,
235*40796051SNamjae Jeon 		const int err_val, const u32 ic,
236*40796051SNamjae Jeon 		const __le16 *upcase, const u32 upcase_len);
237*40796051SNamjae Jeon int ntfs_ucsncmp(const __le16 *s1, const __le16 *s2, size_t n);
238*40796051SNamjae Jeon int ntfs_ucsncasecmp(const __le16 *s1, const __le16 *s2, size_t n,
239*40796051SNamjae Jeon 		const __le16 *upcase, const u32 upcase_size);
240*40796051SNamjae Jeon int ntfs_file_compare_values(const struct file_name_attr *file_name_attr1,
241*40796051SNamjae Jeon 		const struct file_name_attr *file_name_attr2,
242*40796051SNamjae Jeon 		const int err_val, const u32 ic,
243*40796051SNamjae Jeon 		const __le16 *upcase, const u32 upcase_len);
244*40796051SNamjae Jeon int ntfs_nlstoucs(const struct ntfs_volume *vol, const char *ins,
245*40796051SNamjae Jeon 		const int ins_len, __le16 **outs, int max_name_len);
246*40796051SNamjae Jeon int ntfs_ucstonls(const struct ntfs_volume *vol, const __le16 *ins,
2471e9ea7e0SNamjae Jeon 		const int ins_len, unsigned char **outs, int outs_len);
248*40796051SNamjae Jeon __le16 *ntfs_ucsndup(const __le16 *s, u32 maxlen);
249*40796051SNamjae Jeon bool ntfs_names_are_equal(const __le16 *s1, size_t s1_len,
250*40796051SNamjae Jeon 		const __le16 *s2, size_t s2_len,
251*40796051SNamjae Jeon 		const u32 ic,
252*40796051SNamjae Jeon 		const __le16 *upcase, const u32 upcase_size);
253*40796051SNamjae Jeon int ntfs_force_shutdown(struct super_block *sb, u32 flags);
254*40796051SNamjae Jeon long ntfs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg);
255*40796051SNamjae Jeon #ifdef CONFIG_COMPAT
256*40796051SNamjae Jeon long ntfs_compat_ioctl(struct file *filp, unsigned int cmd,
257*40796051SNamjae Jeon 		unsigned long arg);
258*40796051SNamjae Jeon #endif
2591e9ea7e0SNamjae Jeon 
2601e9ea7e0SNamjae Jeon /* From fs/ntfs/upcase.c */
261*40796051SNamjae Jeon __le16 *generate_default_upcase(void);
2621e9ea7e0SNamjae Jeon 
2631e9ea7e0SNamjae Jeon static inline int ntfs_ffs(int x)
2641e9ea7e0SNamjae Jeon {
2651e9ea7e0SNamjae Jeon 	int r = 1;
2661e9ea7e0SNamjae Jeon 
2671e9ea7e0SNamjae Jeon 	if (!x)
2681e9ea7e0SNamjae Jeon 		return 0;
2691e9ea7e0SNamjae Jeon 	if (!(x & 0xffff)) {
2701e9ea7e0SNamjae Jeon 		x >>= 16;
2711e9ea7e0SNamjae Jeon 		r += 16;
2721e9ea7e0SNamjae Jeon 	}
2731e9ea7e0SNamjae Jeon 	if (!(x & 0xff)) {
2741e9ea7e0SNamjae Jeon 		x >>= 8;
2751e9ea7e0SNamjae Jeon 		r += 8;
2761e9ea7e0SNamjae Jeon 	}
2771e9ea7e0SNamjae Jeon 	if (!(x & 0xf)) {
2781e9ea7e0SNamjae Jeon 		x >>= 4;
2791e9ea7e0SNamjae Jeon 		r += 4;
2801e9ea7e0SNamjae Jeon 	}
2811e9ea7e0SNamjae Jeon 	if (!(x & 3)) {
2821e9ea7e0SNamjae Jeon 		x >>= 2;
2831e9ea7e0SNamjae Jeon 		r += 2;
2841e9ea7e0SNamjae Jeon 	}
285*40796051SNamjae Jeon 	if (!(x & 1))
2861e9ea7e0SNamjae Jeon 		r += 1;
2871e9ea7e0SNamjae Jeon 	return r;
2881e9ea7e0SNamjae Jeon }
2891e9ea7e0SNamjae Jeon 
290*40796051SNamjae Jeon /* From fs/ntfs/bdev-io.c */
291*40796051SNamjae Jeon int ntfs_bdev_read(struct block_device *bdev, char *data, loff_t start, size_t size);
292*40796051SNamjae Jeon int ntfs_bdev_write(struct super_block *sb, void *buf, loff_t start, size_t size);
293*40796051SNamjae Jeon 
2941e9ea7e0SNamjae Jeon #endif /* _LINUX_NTFS_H */
295