11da177e4SLinus Torvalds /* 21da177e4SLinus Torvalds * volume.h - Defines for volume structures in NTFS Linux kernel driver. Part 31da177e4SLinus Torvalds * of the Linux-NTFS project. 41da177e4SLinus Torvalds * 5c002f425SAnton Altaparmakov * Copyright (c) 2001-2005 Anton Altaparmakov 61da177e4SLinus Torvalds * Copyright (c) 2002 Richard Russon 71da177e4SLinus Torvalds * 81da177e4SLinus Torvalds * This program/include file is free software; you can redistribute it and/or 91da177e4SLinus Torvalds * modify it under the terms of the GNU General Public License as published 101da177e4SLinus Torvalds * by the Free Software Foundation; either version 2 of the License, or 111da177e4SLinus Torvalds * (at your option) any later version. 121da177e4SLinus Torvalds * 131da177e4SLinus Torvalds * This program/include file is distributed in the hope that it will be 141da177e4SLinus Torvalds * useful, but WITHOUT ANY WARRANTY; without even the implied warranty 151da177e4SLinus Torvalds * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 161da177e4SLinus Torvalds * GNU General Public License for more details. 171da177e4SLinus Torvalds * 181da177e4SLinus Torvalds * You should have received a copy of the GNU General Public License 191da177e4SLinus Torvalds * along with this program (in the main directory of the Linux-NTFS 201da177e4SLinus Torvalds * distribution in the file COPYING); if not, write to the Free Software 211da177e4SLinus Torvalds * Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 221da177e4SLinus Torvalds */ 231da177e4SLinus Torvalds 241da177e4SLinus Torvalds #ifndef _LINUX_NTFS_VOLUME_H 251da177e4SLinus Torvalds #define _LINUX_NTFS_VOLUME_H 261da177e4SLinus Torvalds 271da177e4SLinus Torvalds #include <linux/rwsem.h> 281da177e4SLinus Torvalds 291da177e4SLinus Torvalds #include "types.h" 301da177e4SLinus Torvalds #include "layout.h" 311da177e4SLinus Torvalds 321da177e4SLinus Torvalds /* 331da177e4SLinus Torvalds * The NTFS in memory super block structure. 341da177e4SLinus Torvalds */ 351da177e4SLinus Torvalds typedef struct { 361da177e4SLinus Torvalds /* 371da177e4SLinus Torvalds * FIXME: Reorder to have commonly used together element within the 381da177e4SLinus Torvalds * same cache line, aiming at a cache line size of 32 bytes. Aim for 391da177e4SLinus Torvalds * 64 bytes for less commonly used together elements. Put most commonly 401da177e4SLinus Torvalds * used elements to front of structure. Obviously do this only when the 411da177e4SLinus Torvalds * structure has stabilized... (AIA) 421da177e4SLinus Torvalds */ 431da177e4SLinus Torvalds /* Device specifics. */ 441da177e4SLinus Torvalds struct super_block *sb; /* Pointer back to the super_block, 451da177e4SLinus Torvalds so we don't have to get the offset 461da177e4SLinus Torvalds every time. */ 471da177e4SLinus Torvalds LCN nr_blocks; /* Number of NTFS_BLOCK_SIZE bytes 481da177e4SLinus Torvalds sized blocks on the device. */ 491da177e4SLinus Torvalds /* Configuration provided by user at mount time. */ 501da177e4SLinus Torvalds unsigned long flags; /* Miscellaneous flags, see below. */ 511da177e4SLinus Torvalds uid_t uid; /* uid that files will be mounted as. */ 521da177e4SLinus Torvalds gid_t gid; /* gid that files will be mounted as. */ 531da177e4SLinus Torvalds mode_t fmask; /* The mask for file permissions. */ 541da177e4SLinus Torvalds mode_t dmask; /* The mask for directory 551da177e4SLinus Torvalds permissions. */ 561da177e4SLinus Torvalds u8 mft_zone_multiplier; /* Initial mft zone multiplier. */ 571da177e4SLinus Torvalds u8 on_errors; /* What to do on filesystem errors. */ 581da177e4SLinus Torvalds /* NTFS bootsector provided information. */ 591da177e4SLinus Torvalds u16 sector_size; /* in bytes */ 601da177e4SLinus Torvalds u8 sector_size_bits; /* log2(sector_size) */ 611da177e4SLinus Torvalds u32 cluster_size; /* in bytes */ 621da177e4SLinus Torvalds u32 cluster_size_mask; /* cluster_size - 1 */ 631da177e4SLinus Torvalds u8 cluster_size_bits; /* log2(cluster_size) */ 641da177e4SLinus Torvalds u32 mft_record_size; /* in bytes */ 651da177e4SLinus Torvalds u32 mft_record_size_mask; /* mft_record_size - 1 */ 661da177e4SLinus Torvalds u8 mft_record_size_bits; /* log2(mft_record_size) */ 671da177e4SLinus Torvalds u32 index_record_size; /* in bytes */ 681da177e4SLinus Torvalds u32 index_record_size_mask; /* index_record_size - 1 */ 691da177e4SLinus Torvalds u8 index_record_size_bits; /* log2(index_record_size) */ 701da177e4SLinus Torvalds LCN nr_clusters; /* Volume size in clusters == number of 711da177e4SLinus Torvalds bits in lcn bitmap. */ 721da177e4SLinus Torvalds LCN mft_lcn; /* Cluster location of mft data. */ 731da177e4SLinus Torvalds LCN mftmirr_lcn; /* Cluster location of copy of mft. */ 741da177e4SLinus Torvalds u64 serial_no; /* The volume serial number. */ 751da177e4SLinus Torvalds /* Mount specific NTFS information. */ 761da177e4SLinus Torvalds u32 upcase_len; /* Number of entries in upcase[]. */ 771da177e4SLinus Torvalds ntfschar *upcase; /* The upcase table. */ 781da177e4SLinus Torvalds 791da177e4SLinus Torvalds s32 attrdef_size; /* Size of the attribute definition 801da177e4SLinus Torvalds table in bytes. */ 811da177e4SLinus Torvalds ATTR_DEF *attrdef; /* Table of attribute definitions. 821da177e4SLinus Torvalds Obtained from FILE_AttrDef. */ 831da177e4SLinus Torvalds 841da177e4SLinus Torvalds #ifdef NTFS_RW 851da177e4SLinus Torvalds /* Variables used by the cluster and mft allocators. */ 861da177e4SLinus Torvalds s64 mft_data_pos; /* Mft record number at which to 871da177e4SLinus Torvalds allocate the next mft record. */ 881da177e4SLinus Torvalds LCN mft_zone_start; /* First cluster of the mft zone. */ 891da177e4SLinus Torvalds LCN mft_zone_end; /* First cluster beyond the mft zone. */ 901da177e4SLinus Torvalds LCN mft_zone_pos; /* Current position in the mft zone. */ 911da177e4SLinus Torvalds LCN data1_zone_pos; /* Current position in the first data 921da177e4SLinus Torvalds zone. */ 931da177e4SLinus Torvalds LCN data2_zone_pos; /* Current position in the second data 941da177e4SLinus Torvalds zone. */ 951da177e4SLinus Torvalds #endif /* NTFS_RW */ 961da177e4SLinus Torvalds 971da177e4SLinus Torvalds struct inode *mft_ino; /* The VFS inode of $MFT. */ 981da177e4SLinus Torvalds 991da177e4SLinus Torvalds struct inode *mftbmp_ino; /* Attribute inode for $MFT/$BITMAP. */ 1001da177e4SLinus Torvalds struct rw_semaphore mftbmp_lock; /* Lock for serializing accesses to the 1011da177e4SLinus Torvalds mft record bitmap ($MFT/$BITMAP). */ 1021da177e4SLinus Torvalds #ifdef NTFS_RW 1031da177e4SLinus Torvalds struct inode *mftmirr_ino; /* The VFS inode of $MFTMirr. */ 1041da177e4SLinus Torvalds int mftmirr_size; /* Size of mft mirror in mft records. */ 1051da177e4SLinus Torvalds 1061da177e4SLinus Torvalds struct inode *logfile_ino; /* The VFS inode of $LogFile. */ 1071da177e4SLinus Torvalds #endif /* NTFS_RW */ 1081da177e4SLinus Torvalds 1091da177e4SLinus Torvalds struct inode *lcnbmp_ino; /* The VFS inode of $Bitmap. */ 1101da177e4SLinus Torvalds struct rw_semaphore lcnbmp_lock; /* Lock for serializing accesses to the 1111da177e4SLinus Torvalds cluster bitmap ($Bitmap/$DATA). */ 1121da177e4SLinus Torvalds 1131da177e4SLinus Torvalds struct inode *vol_ino; /* The VFS inode of $Volume. */ 1141da177e4SLinus Torvalds VOLUME_FLAGS vol_flags; /* Volume flags. */ 1151da177e4SLinus Torvalds u8 major_ver; /* Ntfs major version of volume. */ 1161da177e4SLinus Torvalds u8 minor_ver; /* Ntfs minor version of volume. */ 1171da177e4SLinus Torvalds 1181da177e4SLinus Torvalds struct inode *root_ino; /* The VFS inode of the root 1191da177e4SLinus Torvalds directory. */ 1201da177e4SLinus Torvalds struct inode *secure_ino; /* The VFS inode of $Secure (NTFS3.0+ 1211da177e4SLinus Torvalds only, otherwise NULL). */ 1221da177e4SLinus Torvalds struct inode *extend_ino; /* The VFS inode of $Extend (NTFS3.0+ 1231da177e4SLinus Torvalds only, otherwise NULL). */ 1241da177e4SLinus Torvalds #ifdef NTFS_RW 1251da177e4SLinus Torvalds /* $Quota stuff is NTFS3.0+ specific. Unused/NULL otherwise. */ 1261da177e4SLinus Torvalds struct inode *quota_ino; /* The VFS inode of $Quota. */ 1271da177e4SLinus Torvalds struct inode *quota_q_ino; /* Attribute inode for $Quota/$Q. */ 128*3f2faef0SAnton Altaparmakov /* $UsnJrnl stuff is NTFS3.0+ specific. Unused/NULL otherwise. */ 129*3f2faef0SAnton Altaparmakov struct inode *usnjrnl_ino; /* The VFS inode of $UsnJrnl. */ 130*3f2faef0SAnton Altaparmakov struct inode *usnjrnl_max_ino; /* Attribute inode for $UsnJrnl/$Max. */ 131*3f2faef0SAnton Altaparmakov struct inode *usnjrnl_j_ino; /* Attribute inode for $UsnJrnl/$J. */ 1321da177e4SLinus Torvalds #endif /* NTFS_RW */ 1331da177e4SLinus Torvalds struct nls_table *nls_map; 1341da177e4SLinus Torvalds } ntfs_volume; 1351da177e4SLinus Torvalds 1361da177e4SLinus Torvalds /* 1371da177e4SLinus Torvalds * Defined bits for the flags field in the ntfs_volume structure. 1381da177e4SLinus Torvalds */ 1391da177e4SLinus Torvalds typedef enum { 1401da177e4SLinus Torvalds NV_Errors, /* 1: Volume has errors, prevent remount rw. */ 1411da177e4SLinus Torvalds NV_ShowSystemFiles, /* 1: Return system files in ntfs_readdir(). */ 1421da177e4SLinus Torvalds NV_CaseSensitive, /* 1: Treat file names as case sensitive and 1431da177e4SLinus Torvalds create filenames in the POSIX namespace. 1441da177e4SLinus Torvalds Otherwise be case insensitive and create 1451da177e4SLinus Torvalds file names in WIN32 namespace. */ 1461da177e4SLinus Torvalds NV_LogFileEmpty, /* 1: $LogFile journal is empty. */ 1471da177e4SLinus Torvalds NV_QuotaOutOfDate, /* 1: $Quota is out of date. */ 148*3f2faef0SAnton Altaparmakov NV_UsnJrnlStamped, /* 1: $UsnJrnl has been stamped. */ 149c002f425SAnton Altaparmakov NV_SparseEnabled, /* 1: May create sparse files. */ 1501da177e4SLinus Torvalds } ntfs_volume_flags; 1511da177e4SLinus Torvalds 1521da177e4SLinus Torvalds /* 1531da177e4SLinus Torvalds * Macro tricks to expand the NVolFoo(), NVolSetFoo(), and NVolClearFoo() 1541da177e4SLinus Torvalds * functions. 1551da177e4SLinus Torvalds */ 1561da177e4SLinus Torvalds #define NVOL_FNS(flag) \ 1571da177e4SLinus Torvalds static inline int NVol##flag(ntfs_volume *vol) \ 1581da177e4SLinus Torvalds { \ 1591da177e4SLinus Torvalds return test_bit(NV_##flag, &(vol)->flags); \ 1601da177e4SLinus Torvalds } \ 1611da177e4SLinus Torvalds static inline void NVolSet##flag(ntfs_volume *vol) \ 1621da177e4SLinus Torvalds { \ 1631da177e4SLinus Torvalds set_bit(NV_##flag, &(vol)->flags); \ 1641da177e4SLinus Torvalds } \ 1651da177e4SLinus Torvalds static inline void NVolClear##flag(ntfs_volume *vol) \ 1661da177e4SLinus Torvalds { \ 1671da177e4SLinus Torvalds clear_bit(NV_##flag, &(vol)->flags); \ 1681da177e4SLinus Torvalds } 1691da177e4SLinus Torvalds 1701da177e4SLinus Torvalds /* Emit the ntfs volume bitops functions. */ 1711da177e4SLinus Torvalds NVOL_FNS(Errors) 1721da177e4SLinus Torvalds NVOL_FNS(ShowSystemFiles) 1731da177e4SLinus Torvalds NVOL_FNS(CaseSensitive) 1741da177e4SLinus Torvalds NVOL_FNS(LogFileEmpty) 1751da177e4SLinus Torvalds NVOL_FNS(QuotaOutOfDate) 176*3f2faef0SAnton Altaparmakov NVOL_FNS(UsnJrnlStamped) 177c002f425SAnton Altaparmakov NVOL_FNS(SparseEnabled) 1781da177e4SLinus Torvalds 1791da177e4SLinus Torvalds #endif /* _LINUX_NTFS_VOLUME_H */ 180