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