inode.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. /*
  2. * inode.h - Defines for inode structures NTFS Linux kernel driver. Part of
  3. * the Linux-NTFS project.
  4. *
  5. * Copyright (c) 2001-2007 Anton Altaparmakov
  6. * Copyright (c) 2002 Richard Russon
  7. *
  8. * This program/include file is free software; you can redistribute it and/or
  9. * modify it under the terms of the GNU General Public License as published
  10. * by the Free Software Foundation; either version 2 of the License, or
  11. * (at your option) any later version.
  12. *
  13. * This program/include file is distributed in the hope that it will be
  14. * useful, but WITHOUT ANY WARRANTY; without even the implied warranty
  15. * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program (in the main directory of the Linux-NTFS
  20. * distribution in the file COPYING); if not, write to the Free Software
  21. * Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  22. */
  23. #ifndef _LINUX_NTFS_INODE_H
  24. #define _LINUX_NTFS_INODE_H
  25. #include <asm/atomic.h>
  26. #include <linux/fs.h>
  27. #include <linux/list.h>
  28. #include <linux/mm.h>
  29. #include <linux/mutex.h>
  30. #include <linux/seq_file.h>
  31. #include "layout.h"
  32. #include "volume.h"
  33. #include "types.h"
  34. #include "runlist.h"
  35. #include "debug.h"
  36. typedef struct _ntfs_inode ntfs_inode;
  37. /*
  38. * The NTFS in-memory inode structure. It is just used as an extension to the
  39. * fields already provided in the VFS inode.
  40. */
  41. struct _ntfs_inode {
  42. rwlock_t size_lock; /* Lock serializing access to inode sizes. */
  43. s64 initialized_size; /* Copy from the attribute record. */
  44. s64 allocated_size; /* Copy from the attribute record. */
  45. unsigned long state; /* NTFS specific flags describing this inode.
  46. See ntfs_inode_state_bits below. */
  47. unsigned long mft_no; /* Number of the mft record / inode. */
  48. u16 seq_no; /* Sequence number of the mft record. */
  49. atomic_t count; /* Inode reference count for book keeping. */
  50. ntfs_volume *vol; /* Pointer to the ntfs volume of this inode. */
  51. /*
  52. * If NInoAttr() is true, the below fields describe the attribute which
  53. * this fake inode belongs to. The actual inode of this attribute is
  54. * pointed to by base_ntfs_ino and nr_extents is always set to -1 (see
  55. * below). For real inodes, we also set the type (AT_DATA for files and
  56. * AT_INDEX_ALLOCATION for directories), with the name = NULL and
  57. * name_len = 0 for files and name = I30 (global constant) and
  58. * name_len = 4 for directories.
  59. */
  60. ATTR_TYPE type; /* Attribute type of this fake inode. */
  61. ntfschar *name; /* Attribute name of this fake inode. */
  62. u32 name_len; /* Attribute name length of this fake inode. */
  63. runlist runlist; /* If state has the NI_NonResident bit set,
  64. the runlist of the unnamed data attribute
  65. (if a file) or of the index allocation
  66. attribute (directory) or of the attribute
  67. described by the fake inode (if NInoAttr()).
  68. If runlist.rl is NULL, the runlist has not
  69. been read in yet or has been unmapped. If
  70. NI_NonResident is clear, the attribute is
  71. resident (file and fake inode) or there is
  72. no $I30 index allocation attribute
  73. (small directory). In the latter case
  74. runlist.rl is always NULL.*/
  75. /*
  76. * The following fields are only valid for real inodes and extent
  77. * inodes.
  78. */
  79. struct mutex mrec_lock; /* Lock for serializing access to the
  80. mft record belonging to this inode. */
  81. struct page *page; /* The page containing the mft record of the
  82. inode. This should only be touched by the
  83. (un)map_mft_record*() functions. */
  84. int page_ofs; /* Offset into the page at which the mft record
  85. begins. This should only be touched by the
  86. (un)map_mft_record*() functions. */
  87. /*
  88. * Attribute list support (only for use by the attribute lookup
  89. * functions). Setup during read_inode for all inodes with attribute
  90. * lists. Only valid if NI_AttrList is set in state, and attr_list_rl is
  91. * further only valid if NI_AttrListNonResident is set.
  92. */
  93. u32 attr_list_size; /* Length of attribute list value in bytes. */
  94. u8 *attr_list; /* Attribute list value itself. */
  95. runlist attr_list_rl; /* Run list for the attribute list value. */
  96. union {
  97. struct { /* It is a directory, $MFT, or an index inode. */
  98. u32 block_size; /* Size of an index block. */
  99. u32 vcn_size; /* Size of a vcn in this
  100. index. */
  101. COLLATION_RULE collation_rule; /* The collation rule
  102. for the index. */
  103. u8 block_size_bits; /* Log2 of the above. */
  104. u8 vcn_size_bits; /* Log2 of the above. */
  105. } index;
  106. struct { /* It is a compressed/sparse file/attribute inode. */
  107. s64 size; /* Copy of compressed_size from
  108. $DATA. */
  109. u32 block_size; /* Size of a compression block
  110. (cb). */
  111. u8 block_size_bits; /* Log2 of the size of a cb. */
  112. u8 block_clusters; /* Number of clusters per cb. */
  113. } compressed;
  114. } itype;
  115. struct mutex extent_lock; /* Lock for accessing/modifying the
  116. below . */
  117. s32 nr_extents; /* For a base mft record, the number of attached extent
  118. inodes (0 if none), for extent records and for fake
  119. inodes describing an attribute this is -1. */
  120. union { /* This union is only used if nr_extents != 0. */
  121. ntfs_inode **extent_ntfs_inos; /* For nr_extents > 0, array of
  122. the ntfs inodes of the extent
  123. mft records belonging to
  124. this base inode which have
  125. been loaded. */
  126. ntfs_inode *base_ntfs_ino; /* For nr_extents == -1, the
  127. ntfs inode of the base mft
  128. record. For fake inodes, the
  129. real (base) inode to which
  130. the attribute belongs. */
  131. } ext;
  132. };
  133. /*
  134. * Defined bits for the state field in the ntfs_inode structure.
  135. * (f) = files only, (d) = directories only, (a) = attributes/fake inodes only
  136. */
  137. typedef enum {
  138. NI_Dirty, /* 1: Mft record needs to be written to disk. */
  139. NI_AttrList, /* 1: Mft record contains an attribute list. */
  140. NI_AttrListNonResident, /* 1: Attribute list is non-resident. Implies
  141. NI_AttrList is set. */
  142. NI_Attr, /* 1: Fake inode for attribute i/o.
  143. 0: Real inode or extent inode. */
  144. NI_MstProtected, /* 1: Attribute is protected by MST fixups.
  145. 0: Attribute is not protected by fixups. */
  146. NI_NonResident, /* 1: Unnamed data attr is non-resident (f).
  147. 1: Attribute is non-resident (a). */
  148. NI_IndexAllocPresent = NI_NonResident, /* 1: $I30 index alloc attr is
  149. present (d). */
  150. NI_Compressed, /* 1: Unnamed data attr is compressed (f).
  151. 1: Create compressed files by default (d).
  152. 1: Attribute is compressed (a). */
  153. NI_Encrypted, /* 1: Unnamed data attr is encrypted (f).
  154. 1: Create encrypted files by default (d).
  155. 1: Attribute is encrypted (a). */
  156. NI_Sparse, /* 1: Unnamed data attr is sparse (f).
  157. 1: Create sparse files by default (d).
  158. 1: Attribute is sparse (a). */
  159. NI_SparseDisabled, /* 1: May not create sparse regions. */
  160. NI_TruncateFailed, /* 1: Last ntfs_truncate() call failed. */
  161. } ntfs_inode_state_bits;
  162. /*
  163. * NOTE: We should be adding dirty mft records to a list somewhere and they
  164. * should be independent of the (ntfs/vfs) inode structure so that an inode can
  165. * be removed but the record can be left dirty for syncing later.
  166. */
  167. /*
  168. * Macro tricks to expand the NInoFoo(), NInoSetFoo(), and NInoClearFoo()
  169. * functions.
  170. */
  171. #define NINO_FNS(flag) \
  172. static inline int NIno##flag(ntfs_inode *ni) \
  173. { \
  174. return test_bit(NI_##flag, &(ni)->state); \
  175. } \
  176. static inline void NInoSet##flag(ntfs_inode *ni) \
  177. { \
  178. set_bit(NI_##flag, &(ni)->state); \
  179. } \
  180. static inline void NInoClear##flag(ntfs_inode *ni) \
  181. { \
  182. clear_bit(NI_##flag, &(ni)->state); \
  183. }
  184. /*
  185. * As above for NInoTestSetFoo() and NInoTestClearFoo().
  186. */
  187. #define TAS_NINO_FNS(flag) \
  188. static inline int NInoTestSet##flag(ntfs_inode *ni) \
  189. { \
  190. return test_and_set_bit(NI_##flag, &(ni)->state); \
  191. } \
  192. static inline int NInoTestClear##flag(ntfs_inode *ni) \
  193. { \
  194. return test_and_clear_bit(NI_##flag, &(ni)->state); \
  195. }
  196. /* Emit the ntfs inode bitops functions. */
  197. NINO_FNS(Dirty)
  198. TAS_NINO_FNS(Dirty)
  199. NINO_FNS(AttrList)
  200. NINO_FNS(AttrListNonResident)
  201. NINO_FNS(Attr)
  202. NINO_FNS(MstProtected)
  203. NINO_FNS(NonResident)
  204. NINO_FNS(IndexAllocPresent)
  205. NINO_FNS(Compressed)
  206. NINO_FNS(Encrypted)
  207. NINO_FNS(Sparse)
  208. NINO_FNS(SparseDisabled)
  209. NINO_FNS(TruncateFailed)
  210. /*
  211. * The full structure containing a ntfs_inode and a vfs struct inode. Used for
  212. * all real and fake inodes but not for extent inodes which lack the vfs struct
  213. * inode.
  214. */
  215. typedef struct {
  216. ntfs_inode ntfs_inode;
  217. struct inode vfs_inode; /* The vfs inode structure. */
  218. } big_ntfs_inode;
  219. /**
  220. * NTFS_I - return the ntfs inode given a vfs inode
  221. * @inode: VFS inode
  222. *
  223. * NTFS_I() returns the ntfs inode associated with the VFS @inode.
  224. */
  225. static inline ntfs_inode *NTFS_I(struct inode *inode)
  226. {
  227. return (ntfs_inode *)list_entry(inode, big_ntfs_inode, vfs_inode);
  228. }
  229. static inline struct inode *VFS_I(ntfs_inode *ni)
  230. {
  231. return &((big_ntfs_inode *)ni)->vfs_inode;
  232. }
  233. /**
  234. * ntfs_attr - ntfs in memory attribute structure
  235. * @mft_no: mft record number of the base mft record of this attribute
  236. * @name: Unicode name of the attribute (NULL if unnamed)
  237. * @name_len: length of @name in Unicode characters (0 if unnamed)
  238. * @type: attribute type (see layout.h)
  239. *
  240. * This structure exists only to provide a small structure for the
  241. * ntfs_{attr_}iget()/ntfs_test_inode()/ntfs_init_locked_inode() mechanism.
  242. *
  243. * NOTE: Elements are ordered by size to make the structure as compact as
  244. * possible on all architectures.
  245. */
  246. typedef struct {
  247. unsigned long mft_no;
  248. ntfschar *name;
  249. u32 name_len;
  250. ATTR_TYPE type;
  251. } ntfs_attr;
  252. typedef int (*test_t)(struct inode *, void *);
  253. extern int ntfs_test_inode(struct inode *vi, ntfs_attr *na);
  254. extern struct inode *ntfs_iget(struct super_block *sb, unsigned long mft_no);
  255. extern struct inode *ntfs_attr_iget(struct inode *base_vi, ATTR_TYPE type,
  256. ntfschar *name, u32 name_len);
  257. extern struct inode *ntfs_index_iget(struct inode *base_vi, ntfschar *name,
  258. u32 name_len);
  259. extern struct inode *ntfs_alloc_big_inode(struct super_block *sb);
  260. extern void ntfs_destroy_big_inode(struct inode *inode);
  261. extern void ntfs_evict_big_inode(struct inode *vi);
  262. extern void __ntfs_init_inode(struct super_block *sb, ntfs_inode *ni);
  263. static inline void ntfs_init_big_inode(struct inode *vi)
  264. {
  265. ntfs_inode *ni = NTFS_I(vi);
  266. ntfs_debug("Entering.");
  267. __ntfs_init_inode(vi->i_sb, ni);
  268. ni->mft_no = vi->i_ino;
  269. }
  270. extern ntfs_inode *ntfs_new_extent_inode(struct super_block *sb,
  271. unsigned long mft_no);
  272. extern void ntfs_clear_extent_inode(ntfs_inode *ni);
  273. extern int ntfs_read_inode_mount(struct inode *vi);
  274. extern int ntfs_show_options(struct seq_file *sf, struct vfsmount *mnt);
  275. #ifdef NTFS_RW
  276. extern int ntfs_truncate(struct inode *vi);
  277. extern void ntfs_truncate_vfs(struct inode *vi);
  278. extern int ntfs_setattr(struct dentry *dentry, struct iattr *attr);
  279. extern int __ntfs_write_inode(struct inode *vi, int sync);
  280. static inline void ntfs_commit_inode(struct inode *vi)
  281. {
  282. if (!is_bad_inode(vi))
  283. __ntfs_write_inode(vi, 1);
  284. return;
  285. }
  286. #endif /* NTFS_RW */
  287. #endif /* _LINUX_NTFS_INODE_H */