Blame view

fs/ntfs/inode.h 11.1 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
  /*
   * inode.h - Defines for inode structures NTFS Linux kernel driver. Part of
   *	     the Linux-NTFS project.
   *
8331191e5   Anton Altaparmakov   NTFS: 2.1.28 - Fi...
5
   * Copyright (c) 2001-2007 Anton Altaparmakov
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
   * Copyright (c) 2002 Richard Russon
   *
   * This program/include file is free software; you can redistribute it and/or
   * modify it under the terms of the GNU General Public License as published
   * by the Free Software Foundation; either version 2 of the License, or
   * (at your option) any later version.
   *
   * This program/include file is distributed in the hope that it will be
   * useful, but WITHOUT ANY WARRANTY; without even the implied warranty
   * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * along with this program (in the main directory of the Linux-NTFS
   * distribution in the file COPYING); if not, write to the Free Software
   * Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   */
  
  #ifndef _LINUX_NTFS_INODE_H
  #define _LINUX_NTFS_INODE_H
60063497a   Arun Sharma   atomic: use <linu...
26
  #include <linux/atomic.h>
4e5e529ad   Ingo Molnar   NTFS: Semaphore t...
27

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
28
  #include <linux/fs.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
29
  #include <linux/list.h>
4e5e529ad   Ingo Molnar   NTFS: Semaphore t...
30
31
32
  #include <linux/mm.h>
  #include <linux/mutex.h>
  #include <linux/seq_file.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
33
34
35
36
37
38
39
40
41
42
43
44
45
46
  
  #include "layout.h"
  #include "volume.h"
  #include "types.h"
  #include "runlist.h"
  #include "debug.h"
  
  typedef struct _ntfs_inode ntfs_inode;
  
  /*
   * The NTFS in-memory inode structure. It is just used as an extension to the
   * fields already provided in the VFS inode.
   */
  struct _ntfs_inode {
367636772   Anton Altaparmakov   NTFS: - In fs/ntf...
47
  	rwlock_t size_lock;	/* Lock serializing access to inode sizes. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
  	s64 initialized_size;	/* Copy from the attribute record. */
  	s64 allocated_size;	/* Copy from the attribute record. */
  	unsigned long state;	/* NTFS specific flags describing this inode.
  				   See ntfs_inode_state_bits below. */
  	unsigned long mft_no;	/* Number of the mft record / inode. */
  	u16 seq_no;		/* Sequence number of the mft record. */
  	atomic_t count;		/* Inode reference count for book keeping. */
  	ntfs_volume *vol;	/* Pointer to the ntfs volume of this inode. */
  	/*
  	 * If NInoAttr() is true, the below fields describe the attribute which
  	 * this fake inode belongs to. The actual inode of this attribute is
  	 * pointed to by base_ntfs_ino and nr_extents is always set to -1 (see
  	 * below). For real inodes, we also set the type (AT_DATA for files and
  	 * AT_INDEX_ALLOCATION for directories), with the name = NULL and
  	 * name_len = 0 for files and name = I30 (global constant) and
  	 * name_len = 4 for directories.
  	 */
  	ATTR_TYPE type;	/* Attribute type of this fake inode. */
  	ntfschar *name;		/* Attribute name of this fake inode. */
  	u32 name_len;		/* Attribute name length of this fake inode. */
  	runlist runlist;	/* If state has the NI_NonResident bit set,
  				   the runlist of the unnamed data attribute
  				   (if a file) or of the index allocation
  				   attribute (directory) or of the attribute
  				   described by the fake inode (if NInoAttr()).
  				   If runlist.rl is NULL, the runlist has not
  				   been read in yet or has been unmapped. If
  				   NI_NonResident is clear, the attribute is
  				   resident (file and fake inode) or there is
  				   no $I30 index allocation attribute
  				   (small directory). In the latter case
  				   runlist.rl is always NULL.*/
  	/*
  	 * The following fields are only valid for real inodes and extent
  	 * inodes.
  	 */
4e5e529ad   Ingo Molnar   NTFS: Semaphore t...
84
  	struct mutex mrec_lock;	/* Lock for serializing access to the
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
  				   mft record belonging to this inode. */
  	struct page *page;	/* The page containing the mft record of the
  				   inode. This should only be touched by the
  				   (un)map_mft_record*() functions. */
  	int page_ofs;		/* Offset into the page at which the mft record
  				   begins. This should only be touched by the
  				   (un)map_mft_record*() functions. */
  	/*
  	 * Attribute list support (only for use by the attribute lookup
  	 * functions). Setup during read_inode for all inodes with attribute
  	 * lists. Only valid if NI_AttrList is set in state, and attr_list_rl is
  	 * further only valid if NI_AttrListNonResident is set.
  	 */
  	u32 attr_list_size;	/* Length of attribute list value in bytes. */
  	u8 *attr_list;		/* Attribute list value itself. */
  	runlist attr_list_rl;	/* Run list for the attribute list value. */
  	union {
  		struct { /* It is a directory, $MFT, or an index inode. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
103
104
105
106
107
108
109
110
  			u32 block_size;		/* Size of an index block. */
  			u32 vcn_size;		/* Size of a vcn in this
  						   index. */
  			COLLATION_RULE collation_rule; /* The collation rule
  						   for the index. */
  			u8 block_size_bits; 	/* Log2 of the above. */
  			u8 vcn_size_bits;	/* Log2 of the above. */
  		} index;
3bd1f4a17   Anton Altaparmakov   NTFS: Fix several...
111
  		struct { /* It is a compressed/sparse file/attribute inode. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
112
113
114
115
116
117
118
119
  			s64 size;		/* Copy of compressed_size from
  						   $DATA. */
  			u32 block_size;		/* Size of a compression block
  						   (cb). */
  			u8 block_size_bits;	/* Log2 of the size of a cb. */
  			u8 block_clusters;	/* Number of clusters per cb. */
  		} compressed;
  	} itype;
4e5e529ad   Ingo Molnar   NTFS: Semaphore t...
120
  	struct mutex extent_lock;	/* Lock for accessing/modifying the
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
  					   below . */
  	s32 nr_extents;	/* For a base mft record, the number of attached extent
  			   inodes (0 if none), for extent records and for fake
  			   inodes describing an attribute this is -1. */
  	union {		/* This union is only used if nr_extents != 0. */
  		ntfs_inode **extent_ntfs_inos;	/* For nr_extents > 0, array of
  						   the ntfs inodes of the extent
  						   mft records belonging to
  						   this base inode which have
  						   been loaded. */
  		ntfs_inode *base_ntfs_ino;	/* For nr_extents == -1, the
  						   ntfs inode of the base mft
  						   record. For fake inodes, the
  						   real (base) inode to which
  						   the attribute belongs. */
  	} ext;
  };
  
  /*
   * Defined bits for the state field in the ntfs_inode structure.
   * (f) = files only, (d) = directories only, (a) = attributes/fake inodes only
   */
  typedef enum {
  	NI_Dirty,		/* 1: Mft record needs to be written to disk. */
  	NI_AttrList,		/* 1: Mft record contains an attribute list. */
  	NI_AttrListNonResident,	/* 1: Attribute list is non-resident. Implies
  				      NI_AttrList is set. */
  
  	NI_Attr,		/* 1: Fake inode for attribute i/o.
  				   0: Real inode or extent inode. */
  
  	NI_MstProtected,	/* 1: Attribute is protected by MST fixups.
  				   0: Attribute is not protected by fixups. */
  	NI_NonResident,		/* 1: Unnamed data attr is non-resident (f).
  				   1: Attribute is non-resident (a). */
  	NI_IndexAllocPresent = NI_NonResident,	/* 1: $I30 index alloc attr is
  						   present (d). */
  	NI_Compressed,		/* 1: Unnamed data attr is compressed (f).
  				   1: Create compressed files by default (d).
  				   1: Attribute is compressed (a). */
  	NI_Encrypted,		/* 1: Unnamed data attr is encrypted (f).
  				   1: Create encrypted files by default (d).
  				   1: Attribute is encrypted (a). */
  	NI_Sparse,		/* 1: Unnamed data attr is sparse (f).
  				   1: Create sparse files by default (d).
  				   1: Attribute is sparse (a). */
c002f4254   Anton Altaparmakov   NTFS: - Add disab...
167
  	NI_SparseDisabled,	/* 1: May not create sparse regions. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
  	NI_TruncateFailed,	/* 1: Last ntfs_truncate() call failed. */
  } ntfs_inode_state_bits;
  
  /*
   * NOTE: We should be adding dirty mft records to a list somewhere and they
   * should be independent of the (ntfs/vfs) inode structure so that an inode can
   * be removed but the record can be left dirty for syncing later.
   */
  
  /*
   * Macro tricks to expand the NInoFoo(), NInoSetFoo(), and NInoClearFoo()
   * functions.
   */
  #define NINO_FNS(flag)					\
  static inline int NIno##flag(ntfs_inode *ni)		\
  {							\
  	return test_bit(NI_##flag, &(ni)->state);	\
  }							\
  static inline void NInoSet##flag(ntfs_inode *ni)	\
  {							\
  	set_bit(NI_##flag, &(ni)->state);		\
  }							\
  static inline void NInoClear##flag(ntfs_inode *ni)	\
  {							\
  	clear_bit(NI_##flag, &(ni)->state);		\
  }
  
  /*
   * As above for NInoTestSetFoo() and NInoTestClearFoo().
   */
  #define TAS_NINO_FNS(flag)					\
  static inline int NInoTestSet##flag(ntfs_inode *ni)		\
  {								\
  	return test_and_set_bit(NI_##flag, &(ni)->state);	\
  }								\
  static inline int NInoTestClear##flag(ntfs_inode *ni)		\
  {								\
  	return test_and_clear_bit(NI_##flag, &(ni)->state);	\
  }
  
  /* Emit the ntfs inode bitops functions. */
  NINO_FNS(Dirty)
  TAS_NINO_FNS(Dirty)
  NINO_FNS(AttrList)
  NINO_FNS(AttrListNonResident)
  NINO_FNS(Attr)
  NINO_FNS(MstProtected)
  NINO_FNS(NonResident)
  NINO_FNS(IndexAllocPresent)
  NINO_FNS(Compressed)
  NINO_FNS(Encrypted)
  NINO_FNS(Sparse)
c002f4254   Anton Altaparmakov   NTFS: - Add disab...
220
  NINO_FNS(SparseDisabled)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
  NINO_FNS(TruncateFailed)
  
  /*
   * The full structure containing a ntfs_inode and a vfs struct inode. Used for
   * all real and fake inodes but not for extent inodes which lack the vfs struct
   * inode.
   */
  typedef struct {
  	ntfs_inode ntfs_inode;
  	struct inode vfs_inode;		/* The vfs inode structure. */
  } big_ntfs_inode;
  
  /**
   * NTFS_I - return the ntfs inode given a vfs inode
   * @inode:	VFS inode
   *
   * NTFS_I() returns the ntfs inode associated with the VFS @inode.
   */
  static inline ntfs_inode *NTFS_I(struct inode *inode)
  {
db6172c41   Rasmus Villemoes   fs: cleanup sligh...
241
  	return (ntfs_inode *)container_of(inode, big_ntfs_inode, vfs_inode);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
  }
  
  static inline struct inode *VFS_I(ntfs_inode *ni)
  {
  	return &((big_ntfs_inode *)ni)->vfs_inode;
  }
  
  /**
   * ntfs_attr - ntfs in memory attribute structure
   * @mft_no:	mft record number of the base mft record of this attribute
   * @name:	Unicode name of the attribute (NULL if unnamed)
   * @name_len:	length of @name in Unicode characters (0 if unnamed)
   * @type:	attribute type (see layout.h)
   *
   * This structure exists only to provide a small structure for the
   * ntfs_{attr_}iget()/ntfs_test_inode()/ntfs_init_locked_inode() mechanism.
   *
   * NOTE: Elements are ordered by size to make the structure as compact as
   * possible on all architectures.
   */
  typedef struct {
  	unsigned long mft_no;
  	ntfschar *name;
  	u32 name_len;
  	ATTR_TYPE type;
  } ntfs_attr;
  
  typedef int (*test_t)(struct inode *, void *);
  
  extern int ntfs_test_inode(struct inode *vi, ntfs_attr *na);
  
  extern struct inode *ntfs_iget(struct super_block *sb, unsigned long mft_no);
  extern struct inode *ntfs_attr_iget(struct inode *base_vi, ATTR_TYPE type,
  		ntfschar *name, u32 name_len);
  extern struct inode *ntfs_index_iget(struct inode *base_vi, ntfschar *name,
  		u32 name_len);
  
  extern struct inode *ntfs_alloc_big_inode(struct super_block *sb);
  extern void ntfs_destroy_big_inode(struct inode *inode);
b57922d97   Al Viro   convert remaining...
281
  extern void ntfs_evict_big_inode(struct inode *vi);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
  
  extern void __ntfs_init_inode(struct super_block *sb, ntfs_inode *ni);
  
  static inline void ntfs_init_big_inode(struct inode *vi)
  {
  	ntfs_inode *ni = NTFS_I(vi);
  
  	ntfs_debug("Entering.");
  	__ntfs_init_inode(vi->i_sb, ni);
  	ni->mft_no = vi->i_ino;
  }
  
  extern ntfs_inode *ntfs_new_extent_inode(struct super_block *sb,
  		unsigned long mft_no);
  extern void ntfs_clear_extent_inode(ntfs_inode *ni);
  
  extern int ntfs_read_inode_mount(struct inode *vi);
34c80b1d9   Al Viro   vfs: switch ->sho...
299
  extern int ntfs_show_options(struct seq_file *sf, struct dentry *root);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
300
301
302
303
304
305
306
  
  #ifdef NTFS_RW
  
  extern int ntfs_truncate(struct inode *vi);
  extern void ntfs_truncate_vfs(struct inode *vi);
  
  extern int ntfs_setattr(struct dentry *dentry, struct iattr *attr);
a9185b41a   Christoph Hellwig   pass writeback_co...
307
  extern int __ntfs_write_inode(struct inode *vi, int sync);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
308
309
310
311
  
  static inline void ntfs_commit_inode(struct inode *vi)
  {
  	if (!is_bad_inode(vi))
a9185b41a   Christoph Hellwig   pass writeback_co...
312
  		__ntfs_write_inode(vi, 1);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
313
314
  	return;
  }
9014da752   Marco Stornelli   ntfs: drop vmtrun...
315
316
317
  #else
  
  static inline void ntfs_truncate_vfs(struct inode *vi) {}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
318
319
320
  #endif /* NTFS_RW */
  
  #endif /* _LINUX_NTFS_INODE_H */