1*1da177e4SLinus Torvalds /* 2*1da177e4SLinus Torvalds * volume.h - Defines for volume structures in NTFS Linux kernel driver. Part 3*1da177e4SLinus Torvalds * of the Linux-NTFS project. 4*1da177e4SLinus Torvalds * 5*1da177e4SLinus Torvalds * Copyright (c) 2001-2004 Anton Altaparmakov 6*1da177e4SLinus Torvalds * Copyright (c) 2002 Richard Russon 7*1da177e4SLinus Torvalds * 8*1da177e4SLinus Torvalds * This program/include file is free software; you can redistribute it and/or 9*1da177e4SLinus Torvalds * modify it under the terms of the GNU General Public License as published 10*1da177e4SLinus Torvalds * by the Free Software Foundation; either version 2 of the License, or 11*1da177e4SLinus Torvalds * (at your option) any later version. 12*1da177e4SLinus Torvalds * 13*1da177e4SLinus Torvalds * This program/include file is distributed in the hope that it will be 14*1da177e4SLinus Torvalds * useful, but WITHOUT ANY WARRANTY; without even the implied warranty 15*1da177e4SLinus Torvalds * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16*1da177e4SLinus Torvalds * GNU General Public License for more details. 17*1da177e4SLinus Torvalds * 18*1da177e4SLinus Torvalds * You should have received a copy of the GNU General Public License 19*1da177e4SLinus Torvalds * along with this program (in the main directory of the Linux-NTFS 20*1da177e4SLinus Torvalds * distribution in the file COPYING); if not, write to the Free Software 21*1da177e4SLinus Torvalds * Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 22*1da177e4SLinus Torvalds */ 23*1da177e4SLinus Torvalds 24*1da177e4SLinus Torvalds #ifndef _LINUX_NTFS_VOLUME_H 25*1da177e4SLinus Torvalds #define _LINUX_NTFS_VOLUME_H 26*1da177e4SLinus Torvalds 27*1da177e4SLinus Torvalds #include <linux/rwsem.h> 28*1da177e4SLinus Torvalds 29*1da177e4SLinus Torvalds #include "types.h" 30*1da177e4SLinus Torvalds #include "layout.h" 31*1da177e4SLinus Torvalds 32*1da177e4SLinus Torvalds /* 33*1da177e4SLinus Torvalds * The NTFS in memory super block structure. 34*1da177e4SLinus Torvalds */ 35*1da177e4SLinus Torvalds typedef struct { 36*1da177e4SLinus Torvalds /* 37*1da177e4SLinus Torvalds * FIXME: Reorder to have commonly used together element within the 38*1da177e4SLinus Torvalds * same cache line, aiming at a cache line size of 32 bytes. Aim for 39*1da177e4SLinus Torvalds * 64 bytes for less commonly used together elements. Put most commonly 40*1da177e4SLinus Torvalds * used elements to front of structure. Obviously do this only when the 41*1da177e4SLinus Torvalds * structure has stabilized... (AIA) 42*1da177e4SLinus Torvalds */ 43*1da177e4SLinus Torvalds /* Device specifics. */ 44*1da177e4SLinus Torvalds struct super_block *sb; /* Pointer back to the super_block, 45*1da177e4SLinus Torvalds so we don't have to get the offset 46*1da177e4SLinus Torvalds every time. */ 47*1da177e4SLinus Torvalds LCN nr_blocks; /* Number of NTFS_BLOCK_SIZE bytes 48*1da177e4SLinus Torvalds sized blocks on the device. */ 49*1da177e4SLinus Torvalds /* Configuration provided by user at mount time. */ 50*1da177e4SLinus Torvalds unsigned long flags; /* Miscellaneous flags, see below. */ 51*1da177e4SLinus Torvalds uid_t uid; /* uid that files will be mounted as. */ 52*1da177e4SLinus Torvalds gid_t gid; /* gid that files will be mounted as. */ 53*1da177e4SLinus Torvalds mode_t fmask; /* The mask for file permissions. */ 54*1da177e4SLinus Torvalds mode_t dmask; /* The mask for directory 55*1da177e4SLinus Torvalds permissions. */ 56*1da177e4SLinus Torvalds u8 mft_zone_multiplier; /* Initial mft zone multiplier. */ 57*1da177e4SLinus Torvalds u8 on_errors; /* What to do on file system errors. */ 58*1da177e4SLinus Torvalds /* NTFS bootsector provided information. */ 59*1da177e4SLinus Torvalds u16 sector_size; /* in bytes */ 60*1da177e4SLinus Torvalds u8 sector_size_bits; /* log2(sector_size) */ 61*1da177e4SLinus Torvalds u32 cluster_size; /* in bytes */ 62*1da177e4SLinus Torvalds u32 cluster_size_mask; /* cluster_size - 1 */ 63*1da177e4SLinus Torvalds u8 cluster_size_bits; /* log2(cluster_size) */ 64*1da177e4SLinus Torvalds u32 mft_record_size; /* in bytes */ 65*1da177e4SLinus Torvalds u32 mft_record_size_mask; /* mft_record_size - 1 */ 66*1da177e4SLinus Torvalds u8 mft_record_size_bits; /* log2(mft_record_size) */ 67*1da177e4SLinus Torvalds u32 index_record_size; /* in bytes */ 68*1da177e4SLinus Torvalds u32 index_record_size_mask; /* index_record_size - 1 */ 69*1da177e4SLinus Torvalds u8 index_record_size_bits; /* log2(index_record_size) */ 70*1da177e4SLinus Torvalds LCN nr_clusters; /* Volume size in clusters == number of 71*1da177e4SLinus Torvalds bits in lcn bitmap. */ 72*1da177e4SLinus Torvalds LCN mft_lcn; /* Cluster location of mft data. */ 73*1da177e4SLinus Torvalds LCN mftmirr_lcn; /* Cluster location of copy of mft. */ 74*1da177e4SLinus Torvalds u64 serial_no; /* The volume serial number. */ 75*1da177e4SLinus Torvalds /* Mount specific NTFS information. */ 76*1da177e4SLinus Torvalds u32 upcase_len; /* Number of entries in upcase[]. */ 77*1da177e4SLinus Torvalds ntfschar *upcase; /* The upcase table. */ 78*1da177e4SLinus Torvalds 79*1da177e4SLinus Torvalds s32 attrdef_size; /* Size of the attribute definition 80*1da177e4SLinus Torvalds table in bytes. */ 81*1da177e4SLinus Torvalds ATTR_DEF *attrdef; /* Table of attribute definitions. 82*1da177e4SLinus Torvalds Obtained from FILE_AttrDef. */ 83*1da177e4SLinus Torvalds 84*1da177e4SLinus Torvalds #ifdef NTFS_RW 85*1da177e4SLinus Torvalds /* Variables used by the cluster and mft allocators. */ 86*1da177e4SLinus Torvalds s64 mft_data_pos; /* Mft record number at which to 87*1da177e4SLinus Torvalds allocate the next mft record. */ 88*1da177e4SLinus Torvalds LCN mft_zone_start; /* First cluster of the mft zone. */ 89*1da177e4SLinus Torvalds LCN mft_zone_end; /* First cluster beyond the mft zone. */ 90*1da177e4SLinus Torvalds LCN mft_zone_pos; /* Current position in the mft zone. */ 91*1da177e4SLinus Torvalds LCN data1_zone_pos; /* Current position in the first data 92*1da177e4SLinus Torvalds zone. */ 93*1da177e4SLinus Torvalds LCN data2_zone_pos; /* Current position in the second data 94*1da177e4SLinus Torvalds zone. */ 95*1da177e4SLinus Torvalds #endif /* NTFS_RW */ 96*1da177e4SLinus Torvalds 97*1da177e4SLinus Torvalds struct inode *mft_ino; /* The VFS inode of $MFT. */ 98*1da177e4SLinus Torvalds 99*1da177e4SLinus Torvalds struct inode *mftbmp_ino; /* Attribute inode for $MFT/$BITMAP. */ 100*1da177e4SLinus Torvalds struct rw_semaphore mftbmp_lock; /* Lock for serializing accesses to the 101*1da177e4SLinus Torvalds mft record bitmap ($MFT/$BITMAP). */ 102*1da177e4SLinus Torvalds #ifdef NTFS_RW 103*1da177e4SLinus Torvalds struct inode *mftmirr_ino; /* The VFS inode of $MFTMirr. */ 104*1da177e4SLinus Torvalds int mftmirr_size; /* Size of mft mirror in mft records. */ 105*1da177e4SLinus Torvalds 106*1da177e4SLinus Torvalds struct inode *logfile_ino; /* The VFS inode of $LogFile. */ 107*1da177e4SLinus Torvalds #endif /* NTFS_RW */ 108*1da177e4SLinus Torvalds 109*1da177e4SLinus Torvalds struct inode *lcnbmp_ino; /* The VFS inode of $Bitmap. */ 110*1da177e4SLinus Torvalds struct rw_semaphore lcnbmp_lock; /* Lock for serializing accesses to the 111*1da177e4SLinus Torvalds cluster bitmap ($Bitmap/$DATA). */ 112*1da177e4SLinus Torvalds 113*1da177e4SLinus Torvalds struct inode *vol_ino; /* The VFS inode of $Volume. */ 114*1da177e4SLinus Torvalds VOLUME_FLAGS vol_flags; /* Volume flags. */ 115*1da177e4SLinus Torvalds u8 major_ver; /* Ntfs major version of volume. */ 116*1da177e4SLinus Torvalds u8 minor_ver; /* Ntfs minor version of volume. */ 117*1da177e4SLinus Torvalds 118*1da177e4SLinus Torvalds struct inode *root_ino; /* The VFS inode of the root 119*1da177e4SLinus Torvalds directory. */ 120*1da177e4SLinus Torvalds struct inode *secure_ino; /* The VFS inode of $Secure (NTFS3.0+ 121*1da177e4SLinus Torvalds only, otherwise NULL). */ 122*1da177e4SLinus Torvalds struct inode *extend_ino; /* The VFS inode of $Extend (NTFS3.0+ 123*1da177e4SLinus Torvalds only, otherwise NULL). */ 124*1da177e4SLinus Torvalds #ifdef NTFS_RW 125*1da177e4SLinus Torvalds /* $Quota stuff is NTFS3.0+ specific. Unused/NULL otherwise. */ 126*1da177e4SLinus Torvalds struct inode *quota_ino; /* The VFS inode of $Quota. */ 127*1da177e4SLinus Torvalds struct inode *quota_q_ino; /* Attribute inode for $Quota/$Q. */ 128*1da177e4SLinus Torvalds #endif /* NTFS_RW */ 129*1da177e4SLinus Torvalds struct nls_table *nls_map; 130*1da177e4SLinus Torvalds } ntfs_volume; 131*1da177e4SLinus Torvalds 132*1da177e4SLinus Torvalds /* 133*1da177e4SLinus Torvalds * Defined bits for the flags field in the ntfs_volume structure. 134*1da177e4SLinus Torvalds */ 135*1da177e4SLinus Torvalds typedef enum { 136*1da177e4SLinus Torvalds NV_Errors, /* 1: Volume has errors, prevent remount rw. */ 137*1da177e4SLinus Torvalds NV_ShowSystemFiles, /* 1: Return system files in ntfs_readdir(). */ 138*1da177e4SLinus Torvalds NV_CaseSensitive, /* 1: Treat file names as case sensitive and 139*1da177e4SLinus Torvalds create filenames in the POSIX namespace. 140*1da177e4SLinus Torvalds Otherwise be case insensitive and create 141*1da177e4SLinus Torvalds file names in WIN32 namespace. */ 142*1da177e4SLinus Torvalds NV_LogFileEmpty, /* 1: $LogFile journal is empty. */ 143*1da177e4SLinus Torvalds NV_QuotaOutOfDate, /* 1: $Quota is out of date. */ 144*1da177e4SLinus Torvalds } ntfs_volume_flags; 145*1da177e4SLinus Torvalds 146*1da177e4SLinus Torvalds /* 147*1da177e4SLinus Torvalds * Macro tricks to expand the NVolFoo(), NVolSetFoo(), and NVolClearFoo() 148*1da177e4SLinus Torvalds * functions. 149*1da177e4SLinus Torvalds */ 150*1da177e4SLinus Torvalds #define NVOL_FNS(flag) \ 151*1da177e4SLinus Torvalds static inline int NVol##flag(ntfs_volume *vol) \ 152*1da177e4SLinus Torvalds { \ 153*1da177e4SLinus Torvalds return test_bit(NV_##flag, &(vol)->flags); \ 154*1da177e4SLinus Torvalds } \ 155*1da177e4SLinus Torvalds static inline void NVolSet##flag(ntfs_volume *vol) \ 156*1da177e4SLinus Torvalds { \ 157*1da177e4SLinus Torvalds set_bit(NV_##flag, &(vol)->flags); \ 158*1da177e4SLinus Torvalds } \ 159*1da177e4SLinus Torvalds static inline void NVolClear##flag(ntfs_volume *vol) \ 160*1da177e4SLinus Torvalds { \ 161*1da177e4SLinus Torvalds clear_bit(NV_##flag, &(vol)->flags); \ 162*1da177e4SLinus Torvalds } 163*1da177e4SLinus Torvalds 164*1da177e4SLinus Torvalds /* Emit the ntfs volume bitops functions. */ 165*1da177e4SLinus Torvalds NVOL_FNS(Errors) 166*1da177e4SLinus Torvalds NVOL_FNS(ShowSystemFiles) 167*1da177e4SLinus Torvalds NVOL_FNS(CaseSensitive) 168*1da177e4SLinus Torvalds NVOL_FNS(LogFileEmpty) 169*1da177e4SLinus Torvalds NVOL_FNS(QuotaOutOfDate) 170*1da177e4SLinus Torvalds 171*1da177e4SLinus Torvalds #endif /* _LINUX_NTFS_VOLUME_H */ 172