[POWERPC] Merge iSeries i/o operations with the rest
[linux-2.6/linux-loongson.git] / fs / ntfs / inode.h
blobf088291e017caa377ad8174a8aaf57af0d28ff26
1 /*
2 * inode.h - Defines for inode structures NTFS Linux kernel driver. Part of
3 * the Linux-NTFS project.
5 * Copyright (c) 2001-2005 Anton Altaparmakov
6 * Copyright (c) 2002 Richard Russon
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.
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.
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
24 #ifndef _LINUX_NTFS_INODE_H
25 #define _LINUX_NTFS_INODE_H
27 #include <asm/atomic.h>
29 #include <linux/fs.h>
30 #include <linux/list.h>
31 #include <linux/mm.h>
32 #include <linux/mutex.h>
33 #include <linux/seq_file.h>
35 #include "layout.h"
36 #include "volume.h"
37 #include "types.h"
38 #include "runlist.h"
39 #include "debug.h"
41 typedef struct _ntfs_inode ntfs_inode;
44 * The NTFS in-memory inode structure. It is just used as an extension to the
45 * fields already provided in the VFS inode.
47 struct _ntfs_inode {
48 rwlock_t size_lock; /* Lock serializing access to inode sizes. */
49 s64 initialized_size; /* Copy from the attribute record. */
50 s64 allocated_size; /* Copy from the attribute record. */
51 unsigned long state; /* NTFS specific flags describing this inode.
52 See ntfs_inode_state_bits below. */
53 unsigned long mft_no; /* Number of the mft record / inode. */
54 u16 seq_no; /* Sequence number of the mft record. */
55 atomic_t count; /* Inode reference count for book keeping. */
56 ntfs_volume *vol; /* Pointer to the ntfs volume of this inode. */
58 * If NInoAttr() is true, the below fields describe the attribute which
59 * this fake inode belongs to. The actual inode of this attribute is
60 * pointed to by base_ntfs_ino and nr_extents is always set to -1 (see
61 * below). For real inodes, we also set the type (AT_DATA for files and
62 * AT_INDEX_ALLOCATION for directories), with the name = NULL and
63 * name_len = 0 for files and name = I30 (global constant) and
64 * name_len = 4 for directories.
66 ATTR_TYPE type; /* Attribute type of this fake inode. */
67 ntfschar *name; /* Attribute name of this fake inode. */
68 u32 name_len; /* Attribute name length of this fake inode. */
69 runlist runlist; /* If state has the NI_NonResident bit set,
70 the runlist of the unnamed data attribute
71 (if a file) or of the index allocation
72 attribute (directory) or of the attribute
73 described by the fake inode (if NInoAttr()).
74 If runlist.rl is NULL, the runlist has not
75 been read in yet or has been unmapped. If
76 NI_NonResident is clear, the attribute is
77 resident (file and fake inode) or there is
78 no $I30 index allocation attribute
79 (small directory). In the latter case
80 runlist.rl is always NULL.*/
82 * The following fields are only valid for real inodes and extent
83 * inodes.
85 struct mutex mrec_lock; /* Lock for serializing access to the
86 mft record belonging to this inode. */
87 struct page *page; /* The page containing the mft record of the
88 inode. This should only be touched by the
89 (un)map_mft_record*() functions. */
90 int page_ofs; /* Offset into the page at which the mft record
91 begins. This should only be touched by the
92 (un)map_mft_record*() functions. */
94 * Attribute list support (only for use by the attribute lookup
95 * functions). Setup during read_inode for all inodes with attribute
96 * lists. Only valid if NI_AttrList is set in state, and attr_list_rl is
97 * further only valid if NI_AttrListNonResident is set.
99 u32 attr_list_size; /* Length of attribute list value in bytes. */
100 u8 *attr_list; /* Attribute list value itself. */
101 runlist attr_list_rl; /* Run list for the attribute list value. */
102 union {
103 struct { /* It is a directory, $MFT, or an index inode. */
104 struct inode *bmp_ino; /* Attribute inode for the
105 index $BITMAP. */
106 u32 block_size; /* Size of an index block. */
107 u32 vcn_size; /* Size of a vcn in this
108 index. */
109 COLLATION_RULE collation_rule; /* The collation rule
110 for the index. */
111 u8 block_size_bits; /* Log2 of the above. */
112 u8 vcn_size_bits; /* Log2 of the above. */
113 } index;
114 struct { /* It is a compressed/sparse file/attribute inode. */
115 s64 size; /* Copy of compressed_size from
116 $DATA. */
117 u32 block_size; /* Size of a compression block
118 (cb). */
119 u8 block_size_bits; /* Log2 of the size of a cb. */
120 u8 block_clusters; /* Number of clusters per cb. */
121 } compressed;
122 } itype;
123 struct mutex extent_lock; /* Lock for accessing/modifying the
124 below . */
125 s32 nr_extents; /* For a base mft record, the number of attached extent
126 inodes (0 if none), for extent records and for fake
127 inodes describing an attribute this is -1. */
128 union { /* This union is only used if nr_extents != 0. */
129 ntfs_inode **extent_ntfs_inos; /* For nr_extents > 0, array of
130 the ntfs inodes of the extent
131 mft records belonging to
132 this base inode which have
133 been loaded. */
134 ntfs_inode *base_ntfs_ino; /* For nr_extents == -1, the
135 ntfs inode of the base mft
136 record. For fake inodes, the
137 real (base) inode to which
138 the attribute belongs. */
139 } ext;
143 * Defined bits for the state field in the ntfs_inode structure.
144 * (f) = files only, (d) = directories only, (a) = attributes/fake inodes only
146 typedef enum {
147 NI_Dirty, /* 1: Mft record needs to be written to disk. */
148 NI_AttrList, /* 1: Mft record contains an attribute list. */
149 NI_AttrListNonResident, /* 1: Attribute list is non-resident. Implies
150 NI_AttrList is set. */
152 NI_Attr, /* 1: Fake inode for attribute i/o.
153 0: Real inode or extent inode. */
155 NI_MstProtected, /* 1: Attribute is protected by MST fixups.
156 0: Attribute is not protected by fixups. */
157 NI_NonResident, /* 1: Unnamed data attr is non-resident (f).
158 1: Attribute is non-resident (a). */
159 NI_IndexAllocPresent = NI_NonResident, /* 1: $I30 index alloc attr is
160 present (d). */
161 NI_Compressed, /* 1: Unnamed data attr is compressed (f).
162 1: Create compressed files by default (d).
163 1: Attribute is compressed (a). */
164 NI_Encrypted, /* 1: Unnamed data attr is encrypted (f).
165 1: Create encrypted files by default (d).
166 1: Attribute is encrypted (a). */
167 NI_Sparse, /* 1: Unnamed data attr is sparse (f).
168 1: Create sparse files by default (d).
169 1: Attribute is sparse (a). */
170 NI_SparseDisabled, /* 1: May not create sparse regions. */
171 NI_TruncateFailed, /* 1: Last ntfs_truncate() call failed. */
172 } ntfs_inode_state_bits;
175 * NOTE: We should be adding dirty mft records to a list somewhere and they
176 * should be independent of the (ntfs/vfs) inode structure so that an inode can
177 * be removed but the record can be left dirty for syncing later.
181 * Macro tricks to expand the NInoFoo(), NInoSetFoo(), and NInoClearFoo()
182 * functions.
184 #define NINO_FNS(flag) \
185 static inline int NIno##flag(ntfs_inode *ni) \
187 return test_bit(NI_##flag, &(ni)->state); \
189 static inline void NInoSet##flag(ntfs_inode *ni) \
191 set_bit(NI_##flag, &(ni)->state); \
193 static inline void NInoClear##flag(ntfs_inode *ni) \
195 clear_bit(NI_##flag, &(ni)->state); \
199 * As above for NInoTestSetFoo() and NInoTestClearFoo().
201 #define TAS_NINO_FNS(flag) \
202 static inline int NInoTestSet##flag(ntfs_inode *ni) \
204 return test_and_set_bit(NI_##flag, &(ni)->state); \
206 static inline int NInoTestClear##flag(ntfs_inode *ni) \
208 return test_and_clear_bit(NI_##flag, &(ni)->state); \
211 /* Emit the ntfs inode bitops functions. */
212 NINO_FNS(Dirty)
213 TAS_NINO_FNS(Dirty)
214 NINO_FNS(AttrList)
215 NINO_FNS(AttrListNonResident)
216 NINO_FNS(Attr)
217 NINO_FNS(MstProtected)
218 NINO_FNS(NonResident)
219 NINO_FNS(IndexAllocPresent)
220 NINO_FNS(Compressed)
221 NINO_FNS(Encrypted)
222 NINO_FNS(Sparse)
223 NINO_FNS(SparseDisabled)
224 NINO_FNS(TruncateFailed)
227 * The full structure containing a ntfs_inode and a vfs struct inode. Used for
228 * all real and fake inodes but not for extent inodes which lack the vfs struct
229 * inode.
231 typedef struct {
232 ntfs_inode ntfs_inode;
233 struct inode vfs_inode; /* The vfs inode structure. */
234 } big_ntfs_inode;
237 * NTFS_I - return the ntfs inode given a vfs inode
238 * @inode: VFS inode
240 * NTFS_I() returns the ntfs inode associated with the VFS @inode.
242 static inline ntfs_inode *NTFS_I(struct inode *inode)
244 return (ntfs_inode *)list_entry(inode, big_ntfs_inode, vfs_inode);
247 static inline struct inode *VFS_I(ntfs_inode *ni)
249 return &((big_ntfs_inode *)ni)->vfs_inode;
253 * ntfs_attr - ntfs in memory attribute structure
254 * @mft_no: mft record number of the base mft record of this attribute
255 * @name: Unicode name of the attribute (NULL if unnamed)
256 * @name_len: length of @name in Unicode characters (0 if unnamed)
257 * @type: attribute type (see layout.h)
259 * This structure exists only to provide a small structure for the
260 * ntfs_{attr_}iget()/ntfs_test_inode()/ntfs_init_locked_inode() mechanism.
262 * NOTE: Elements are ordered by size to make the structure as compact as
263 * possible on all architectures.
265 typedef struct {
266 unsigned long mft_no;
267 ntfschar *name;
268 u32 name_len;
269 ATTR_TYPE type;
270 } ntfs_attr;
272 typedef int (*test_t)(struct inode *, void *);
274 extern int ntfs_test_inode(struct inode *vi, ntfs_attr *na);
276 extern struct inode *ntfs_iget(struct super_block *sb, unsigned long mft_no);
277 extern struct inode *ntfs_attr_iget(struct inode *base_vi, ATTR_TYPE type,
278 ntfschar *name, u32 name_len);
279 extern struct inode *ntfs_index_iget(struct inode *base_vi, ntfschar *name,
280 u32 name_len);
282 extern struct inode *ntfs_alloc_big_inode(struct super_block *sb);
283 extern void ntfs_destroy_big_inode(struct inode *inode);
284 extern void ntfs_clear_big_inode(struct inode *vi);
286 extern void __ntfs_init_inode(struct super_block *sb, ntfs_inode *ni);
288 static inline void ntfs_init_big_inode(struct inode *vi)
290 ntfs_inode *ni = NTFS_I(vi);
292 ntfs_debug("Entering.");
293 __ntfs_init_inode(vi->i_sb, ni);
294 ni->mft_no = vi->i_ino;
297 extern ntfs_inode *ntfs_new_extent_inode(struct super_block *sb,
298 unsigned long mft_no);
299 extern void ntfs_clear_extent_inode(ntfs_inode *ni);
301 extern int ntfs_read_inode_mount(struct inode *vi);
303 extern void ntfs_put_inode(struct inode *vi);
305 extern int ntfs_show_options(struct seq_file *sf, struct vfsmount *mnt);
307 #ifdef NTFS_RW
309 extern int ntfs_truncate(struct inode *vi);
310 extern void ntfs_truncate_vfs(struct inode *vi);
312 extern int ntfs_setattr(struct dentry *dentry, struct iattr *attr);
314 extern int ntfs_write_inode(struct inode *vi, int sync);
316 static inline void ntfs_commit_inode(struct inode *vi)
318 if (!is_bad_inode(vi))
319 ntfs_write_inode(vi, 1);
320 return;
323 #endif /* NTFS_RW */
325 #endif /* _LINUX_NTFS_INODE_H */